我使用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;
}
答案 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:除非您需要其他静态方法来调用私有静态方法,否则将私有方法设置为静态是不常见的。如果只有其他实例方法使用您的私有方法,那么没有理由将其作为静态方法。