【问题标题】:When create a static method创建静态方法时
【发布时间】:2010-12-06 15:38:01
【问题描述】:

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

【问题讨论】:

  • 你应该强类型你的变量(即字符串,int),而不是像你一样使用var。 var 主要用于涉及 linq 的特定情况,不应像您那样在 for 循环中使用。
  • @Brann:为什么? Resharper 本身建议这样做,我从来没有遇到过问题。
  • "var" 仍然是强类型,你的类型只是推断出来的。
  • @Brann:您的观点备受争议。检查此对话,例如:stackoverflow.com/questions/236878/…
  • @Brann 为什么?就个人而言,我会按照您的建议明确编写 int、string 等类型,但实际上它/no/ 对代码有影响;变量 /are/ 是强类型的,因为编译器将“var”交换为预期的类型定义。除了对易读性和重构的轻微影响之外,在这里使用 var 并没有任何区别。

标签: c# .net static


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      将其设置为静态不会有问题。这么多你的问题,为什么它不能是静态的。至于 ReSharper,我不知道为什么它不建议将其作为静态方法,而将其用于其他方法。

      【讨论】:

        【解决方案4】:

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

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

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

        resharper 可能认为这样做是有原因的,并且不建议进行更改。

        不过,这只是一次盲目的尝试。

        【讨论】:

          【解决方案5】:

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

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

          或者你希望你的方法作为类的一部分被调用:

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

          在您意识到哪个是最好的之前,您可能会在开发过程的后期进行。如果你想让你的类的用户“感觉”它作用于实例(new ClassName()),你必须选择实例方法。如果您确实需要在没有实例的情况下使用该方法(ClassName.YourMethod()),您必须选择静态。

          更新:将私有方法设为静态并不常见,除非您需要其他静态方法来调用私有静态方法。如果只有其他实例方法使用您的私有方法,则没有理由将其设为静态方法。

          【讨论】:

          • 性能提升备受争议,在实践中很难甚至不可能证明。语义、使用和清晰度应该推动选择,而不是 callvirtcall 的区别。更多在这里,它还讨论了相关的 FxCop 规则:gregbeech.com/blogs/tech/archive/2007/01/11/…
          猜你喜欢
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 2011-02-27
          • 1970-01-01
          • 2011-03-29
          • 1970-01-01
          • 2021-07-03
          • 1970-01-01
          相关资源
          最近更新 更多