C# 创建静态方法时
我使用resharper,resharper建议我声明一个方法是静态的,另一个不是。但我不明白为什么其他方法不能是静态的 方法建议为静态C# 创建静态方法时,c#,.net,static,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 < pol
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;
}
private静态字符串预处理(字符串重设)
{
var pole=保留ToCharArray();
var输出=”;
char?temp=null;
对于(var i=0;i
和方法不建议为静态
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;
}
公共字符串哈希字符串(字符串哈希,int-dlzka)
{
var hashChar=hash.Substring(0,dlzka*2);
var retazec=“”;
对于(var i=0;i
我看不出第二种方法不能是静态的原因,也看不出Resharper为什么建议一种而不是另一种。。。您必须询问Resharper开发人员。请记住,它是一个工具,而不是一本规则手册。Resharper不会对您的类的公共成员提供建议,因为它们可以被其他类使用
但是,如果公共实例方法根本不需要实例,那么它仍然是一个标志(不是说“气味”)。我不明白为什么您的第二个方法不能是静态的。据我所知,它不访问任何实例字段
让它静止不会有问题。这么多关于你的问题,为什么它不能是静态的。至于ReSharper,我不知道为什么它不建议将其作为静态的,而对另一个方法则是这样做的。您的第一个方法是私有的,可能在类内部静态使用。例如:
var ehy=Prehod(“测试”)代码>
第二种方法是公开的。可能您已经在某个地方使用过它,例如:
var okBaby = new MyClass();
Console.WriteLine(okBaby.HashToString("something", 10));
而resharper可能认为这是有原因的,并没有建议改变
不过,这只是一个盲点。这两种方法都可以是静态的:它们不使用类的任何实例成员。这两种方法都可以是实例方法。但是一个方法是静态的还是非静态的,应该由它的可能用途来暗示,而不是由ReSharper来暗示。是否希望将方法作为实例的一部分调用:
YourClass instance = new YourClass();
string x = instance.Prehod(...);
或者您是否希望您的方法作为类的一部分被调用:
string x = YourClass.Prehod(...);
在你意识到哪一个是最好的之前,它可能会在开发过程中晚得多。如果您想让类的用户“感觉”它作用于实例(newclassname()
),则必须选择实例方法。如果确实需要在没有实例的情况下使用该方法(ClassName.YourMethod()
),则必须选择static
更新:将私有方法设为静态是很少见的,除非您需要其他静态方法来调用私有静态方法。如果只有其他实例方法使用您的私有方法,那么就没有理由让它成为静态方法。您应该强键入变量(即字符串,int),而不是像您那样使用var。Var主要用于涉及linq的特定情况,不应该像您这样在for循环中使用。@Brann:为什么?Resharper自己建议这样做,我从来没有遇到过问题。“var”仍然是强类型的,你的类型只是推断出来的。@Brann:你的观点很有争议。查看此对话,例如:@Brann为什么?就我个人而言,正如您所建议的,我已经明确地编写了int、string等类型,但实际上它对代码有/没有/影响;变量/是/强类型的,因为编译器将“var”替换为预期的类型定义。除了对易读性和重构性的轻微影响之外,在这里使用var没有任何区别。Resharper建议将私有方法设置为静态,因为这是一个(非常轻微的)错误性能提高-未使用“this”参数,因此无需将其指定给该方法。性能提高备受争议,在实践中很难甚至不可能证明。语义、使用和清晰性应该驱动选择,而不是callvirt
与call
的区别。此处有更多内容,其中还讨论了相关的FxCop规则: