我是否需要使我的类静态才能使用静态方法?

时间:2011-06-22 00:06:00

标签: c#

我有以下内容:

public class Sort
{

    public static void ShuffleGenericList<T>(IList<T> list)
    {
        //generate a Random instance
        Random rnd = new Random();
        //get the count of items in the list
        int i = list.Count();

        ...
        ...
    }
}

我的班级是否也应该是静态的,或者只是方法是静态的吗?

6 个答案:

答案 0 :(得分:3)

将类标记为static纯粹是可选的(如果它们不包含扩展方法)

换句话说,静态类'成员也必须是静态的,但通常静态成员可以在任何中声明

// doesn't compile:
static class StaticClass { 
    void M() { }
}

// compiles:
class JustClass { 
    static void M1() { }
    void M2() { }
}

从常识来看,(但不必)将类标记为static时:

  • 它没有实例成员;
  • 永远不应该被实例化;
  • 不打算用作变量,参数或成员类型;
  • 上述所有情况都属实,您希望使用编译器强制约束来表达它。

例如,new Sort()在您的代码中可能有或没有任何意义,具体取决于类中的内容等。从您提供的示例中,我认为将其标记为静态是可行的方法。

但请注意, 必须 将类标记为static,当它包含extension methods时,您打算在其他部分使用码。包含扩展方法的类必须是静态的。

答案 1 :(得分:2)

答案是该类不需要是静态的,但让我们看看这里的逻辑。

如果我们有一个排序类(实用程序类),那么实例化它是没有意义的。那么为什么不让这个类静态呢?编程不只是关于最终结果 - 它还涉及使代码可读。

另一方面,为什么在非静态类中有静态方法?我没有遇到过太多次,但是一个好的用法可能是你打算只在该类中使用的实用函数。

答案 2 :(得分:1)

静态方法就足够了。

要测试,只需尝试调用它:

Sort.ShuffleGenericList([some list])

答案 3 :(得分:0)

可以从一个类中公开单个static成员。

查看这些MSDN链接以获取详细信息:

请注意,如果您将类本身标记为static,那么您将无法再实例化它并使用在整个应用程序中引用的多个副本 - 您可以将其限制为一站式商店,可以这么说。

答案 4 :(得分:0)

根据Microsoft,静态方法不必是静态类。

http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

答案 5 :(得分:0)

如果您的类没有任何实例成员且只有静态方法,则应将其设置为静态。

你绝对没有义务这样做,代码将编译并执行得很好而不这样做,但将其标记为静态有一些优点,最重要的是你将无法错误地创建实例