【问题标题】:Why do static methods need to be wrapped into a class?为什么需要将静态方法包装到一个类中?
【发布时间】:2011-11-15 04:34:56
【问题描述】:

对于这个问题的未学性质,我们深表歉意。如果有一个简单的答案,一个解释的链接就会让我非常高兴。

经过 6 个月的编程,我发现静态类对于存储适用于许多不同类的例程有些有用。这是我如何使用静态类的简化示例,它是一个用于将文本解析为各种事物的类

public static class TextProcessor 
{
    public static string[] GetWords(string sentence)
    {
        return sentence.Split(' '); 
    }

    public static int CountLetters(string sentence)
    {
        return sentence.Length; 
    }

    public static int CountWords(string sentence)
    {
        return GetWords(sentence).Length; 
    }
}

我以明显的方式使用它,例如

    class Program
{
    static void Main(string[] args)
    {
        string mysentence = "hello there stackoverflow.";
        Console.WriteLine("mysentence has {0} words in it, fascinating huh??", TextProcessor.CountWords(mysentence)); 

        Console.ReadLine(); 
    }
} 

我的问题是:为什么需要将这些静态方法包装在一个静态类中? 它似乎没有任何目的。有没有办法让这些方法自己不被包装在一个类中?我知道封装是有益的,但我看不到包装在静态类中的静态方法的用途。有什么我在风格上或其他方面遗漏的东西吗?我是否完全在吠叫一棵愚蠢的树?我想太多了吗?

【问题讨论】:

  • 很好的问题,但我怀疑这只是一个无聊的“因为 Java 做到了。”
  • 最终归结为语言的设计方式。所有方法都必须在一个类中。为什么?可能是为了保持一致性。
  • 查看此[帖子][1] [1]:stackoverflow.com/questions/7933540/…

标签: c# static-methods


【解决方案1】:

在 C# 中,任何方法都必须在类中声明。这就是指定语言的方式。

一个静态类实际上比一个类更akin to a module,所以我也认为你应该能够:

  • 在类之外定义一个函数,或者;
  • 以与导入命名空间相同的方式导入模块(使用using

VB.NET、F# 和 Nemerle 实际上允许您声明模块并导入它们;是什么让你无条件使用他们的方法。

这是有效的 Nemerle:

using System.Console; // import static methods in the Console class
class Hello {
  static Main() : void {
    WriteLine("Hello, world!"); // unqualified access!
  }
}

另外,看看extension methods,他们可能会让你以不同的方式“解决”这个问题。 TextProcessor 中的方法乞求成为string 扩展方法。

【讨论】:

  • 很好,Nemerle 看起来很有趣。模块在 c# 中会很棒。
【解决方案2】:

This post by eric lippert 给出了非常详细的解释。我不确定这个“eric”是否知道他在说什么;-)

【讨论】:

    【解决方案3】:

    让方法只是在随机命名空间中晃来晃去会有些尴尬。

    我怀疑答案是提供“范围”。仅仅因为方法是静态的,并不意味着它没有范围。它仍然可以访问其他静态私有方法或成员变量——并且该类为这些东西提供了一个“家”。

    静态类也可以有静态构造函数,在第一次使用静态方法时被调用,所以这提供了根据需要设置东西的能力。

    由于技术限制,它更多的是一种组织设计。

    【讨论】:

    • “让方法只是在随机命名空间中晃来晃去会有些尴尬。” - 大多数 语言都允许您这样做。
    • 大多数面向对象的语言?
    • 我明白了。因此,在像 c++ 这样的“混合”语言中,您可以访问类之外的函数,但是在像 C# 这样的严格的 OO 语言中,您必须将所有内容封装在类中? .. 说得通。生成的样板代码比我认为的要多。
    • 是的,我认为像 C++ 这样的语言必须与非面向对象的 C “向后兼容”,所以他们必须支持它。 VB.NET 必须向后兼容 BASIC(嗯,有点)。我认为将类作为所有代码的根容器几乎是一种标准的面向对象的思维方式。虽然我敢肯定,现在人们会附和“语言_____怎么样”:)
    【解决方案4】:

    静态方法是在运行时创建的类的单个实例中调用的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多