创建静态方法时

时间:2009-10-14 11:50:52

标签: c# .net static

我使用resharper和resharper建议我将一个方法声明为静态而另一个方法不是。但我无法理解为什么其他方法不能是静态的?

推荐为静态的方法

 private static string Prehod(string retazec)
    {
        var pole = retazec.ToCharArray();
        var output = "";
        char? temp = null;

        for (var i = 0; i < pole.Length; i++)
        {
            if (temp == null)
            {
                temp = pole[i];
                continue;
            }

            output += pole[i].ToString() + temp.ToString();
            temp = null;
        }
        return output;
    }

并且不建议使用静态方法

 public string HashToString(string hash,int dlzka)
    {
        var hashChar = hash.Substring(0, dlzka*2);
        var retazec = "";

        for (var i = 0; i < dlzka*2; i++)
        {
            if(i%2 != 0)
            {
                retazec += hashChar.Substring(i, 1);
            }
        }
        return retazec;
    }

5 个答案:

答案 0 :(得分:2)

Resharper不会为您的类的公共成员提供建议,因为它们可以被其他类使用。

但如果公共实例方法根本不需要实例,那么它仍然是一个标志(更不用说'气味')。

答案 1 :(得分:0)

我看不出任何理由为什么第二种方法不能是静态的,至于为什么Resharper建议一个而不是另一个......你必须问Resharper开发人员。请记住,这是一个工具,而不是规则手册。

答案 2 :(得分:0)

我不明白为什么你的第二种方法不能是静态的。据我所知,它不访问任何实例字段。

静止它不会是一个问题。这么多你的问题为什么它不能是静态的。至于ReSharper,我不知道为什么它不推荐它作为静态,而它为另一种方法做这个。

答案 3 :(得分:0)

你的第一个方法是私有的,可能在类中静态使用。例如:var ehy = Prehod("testing");

第二种方法是公开的。可能你已经在某个地方使用它了:

   var okBaby = new MyClass();
   Console.WriteLine(okBaby.HashToString("something", 10));

并且resharper可能认为有理由这样做,并不表示改变。

但是,只是一个盲目的镜头。

答案 4 :(得分:0)

两种方法都可以是静态的:它们不使用类的任何实例成员。两种方法都可以是实例方法。但是一个静态或不静态的方法应该由它的可能用途暗示,而不是由ReSharper暗示。您是否希望将您的方法作为实例的一部分进行调用:

YourClass instance = new YourClass();
string x = instance.Prehod(...);

或者您希望将您的方法作为课程的一部分进行调用:

string x = YourClass.Prehod(...);

在你意识到最好的之前,可以在开发过程的后期。如果您希望为您的类的用户“感觉”它对实例(new ClassName())起作用,则必须选择实例方法。如果您确实需要在没有实例(ClassName.YourMethod())的情况下使用该方法,则必须选择静态。

UPDATE:除非您需要其他静态方法来调用私有静态方法,否则将私有方法设置为静态是不常见的。如果只有其他实例方法使用您的私有方法,那么没有理由将其作为静态方法。