非静态类中的静态方法和静态类中的静态方法有什么区别?

41

我有两个类Class A和ClassB:

static class ClassA
{
    static string SomeMethod()
    {
        return "I am a Static Method";
    }
}

class ClassB
{
    static string SomeMethod()
    {
        return "I am a Static Method";
    }
}

我想知道 ClassA.SomeMethod();ClassB.SomeMethod(); 的区别。

当它们都可以在不创建类的实例的情况下访问时,为什么我们需要创建一个静态类而不是只使用非静态类并将方法声明为静态的呢?

4个回答

40

唯一的区别是非静态类中的静态方法不能作为扩展方法


换句话说,以下代码是无效的:

class Test
{
    static void getCount(this ICollection<int> collection)
    { return collection.Count; }
}

而这是有效的:

static class Test
{
    static void getCount(this ICollection<int> collection)
    { return collection.Count; }
}

14

静态类只能包含静态成员。

静态方法确保即使您创建多个ClassB对象,它们也仅使用单个共享的SomeMethod函数。

从技术上讲,除了ClassA的SomeMethod必须是静态的之外,没有区别。


3
如果您有一个只包含静态方法的非静态类,您可以创建该类的实例。但是您无法有意义地使用该实例。注意:当您不定义构造函数时,编译器会为您添加一个。

静态类没有构造函数,因此您无法创建其实例。当您向其中添加实例方法(而您想要的是静态方法)时,编译器会报错。

另请参见 docs


你可以在静态类中定义一个静态构造函数,它只会在第一次使用时被调用。 - Piotr Kula
1
@PiotrKula 是的,这是正确的。静态构造函数会在“第一次使用*之前”自动调用。 - Hans Kesting

1
静态方法属于类,非静态方法属于类的对象。也就是说,非静态方法只能在它所属的类的对象上调用。静态方法只能访问静态成员。非静态方法可以访问静态和非静态成员,因为在调用静态方法时,类可能尚未实例化(如果在类本身上调用)。在另一种情况下,只有在类已经实例化时才能调用非静态方法。静态方法由类的所有实例共享。每当在C++/Java/C#中调用方法时,都会传递一个隐式参数(即“this”引用)以及/或其他参数。在调用静态方法时,“this”引用不会被传递,因为静态方法属于类,因此没有“this”引用。

我们如何在类的对象上调用静态方法,请给我一个例子。 - Vamsi
一个静态方法可以被类和类的对象调用。但我认为这个说法是错误的。 - emeh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接