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

时间:2011-03-09 05:50:24

标签: c# oop static static-methods non-static

我有两个班级A班和班级B:

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();

之间的区别

如果可以在不创建类实例的情况下访问它们,为什么我们需要创建静态类而不是仅使用非静态类并将方法声明为静态?

5 个答案:

答案 0 :(得分:37)

的区别在于非静态类中的静态方法不能是extension methods


换句话说,这是无效的:

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; }
}

答案 1 :(得分:14)

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

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

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

答案 2 :(得分:3)

答案 3 :(得分:3)

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

静态类没有构造函数,因此您无法创建它的实例。当您向其添加实例方法时,编译器会给出错误(您指的是静态方法)。

另见docs

答案 4 :(得分:1)

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