我应该使用静态方法(C#)

时间:2015-04-09 12:07:48

标签: c# static static-methods

我应该在以下两种情况下使用静电:

案例1)

public class RequestHeader
{
    private string Username { get; set; }
    private string Password { get; set; }
    private string AccessKey { get; set; }

    public string url { get; set; }
    public string pageid { get; set; }
    public string organizationid { get; set; }

    private RequestHeader()
    {
    }

    public static RequestHeader GetRequestHeader(string url, string pageid, string organizationid)
    {
        return new RequestHeader()
        {
            Username = "Some logic to fetch username",
            Password = "Some logic to fetch password",
            AccessKey = "Some access key",
            url = url,
            pageid = pageid,
            organizationid = organizationid,
        };
    }
}

案例2)

public class HttpClientHelper
{
    public static HttpClient GetHttpClient(RequestHeader header)
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        foreach (var property in header.GetType().GetProperties())
        {
            client.DefaultRequestHeaders.Add(property.Name, property.GetValue(header).ToString());
        }

        return client;
    }
}

我知道在维护状态的地方不使用静态。我相信我不是在这里维持任何国家。我将在类库中使用它,我将使用它们来调用休息服务。

唯一让我想在这里使用静态的是不要初始化这些类。(我知道这是一个很好的原因)。

请让我知道你的想法。有没有我在这里看不到的东西。

注意:1)我知道某些属性的小外壳。它与我完全无法控制的其他服务同步。 2)如果将来我有多个RequestHeader,我可能会创建一个具有GetRequestHeader方法的IRequestHeader。所以不同的RequestHeaders将实现这一点。在这种情况下,我知道我不能在接口中保留静态方法。 请保持这两个条件,让我知道你的想法。

2 个答案:

答案 0 :(得分:7)

你在这里看到的似乎是Static Factory Pattern的一个版本。这是一个众所周知的模式,使用起来非常好。

您可能也对Factory Pattern的非静态版本感兴趣。

我认为HttpClient不是"您的班级",在这种情况下,您当然无法在班级内添加方法。

  

唯一让我想在这里使用静态的是不要初始化这些类。(我知道这是一个很好的原因)。

从技术上讲,无论你如何操作(工厂方法或没有工厂方法),你都要实例化和初始化这些类,唯一的问题是你是否要使用工厂方法为你进行实例化和初始化

答案 1 :(得分:0)

如果必须为每个调用使用相同的值,则应使用静态字段,因为只需要一个变量副本时使用静态字段。相同的静态字段将在所有实例之间共享副本。