Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建静态方法时_C#_.net_Static - Fatal编程技术网

C# 创建静态方法时

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

我使用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;
    }
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规则: