【问题标题】:What is the difference between static methods in a Non static class and static methods in a static class?非静态类中的静态方法和静态类中的静态方法有什么区别?
【发布时间】:2011-07-11 15:28:13
【问题描述】:

我有两个班级 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();有什么区别

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

【问题讨论】:

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


    【解决方案1】:

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

    静态类没有构造函数,所以你不能创建它的实例。当您向其中添加实例方法(您的意思是静态方法)时,编译器也会出错。

    另见docs

    【讨论】:

    • 但是,您可以在静态类中定义一个静态构造函数,在第一次使用时只调用一次?
    • @PiotrKula 是的,这是真的。静态构造函数在“首次使用之前”自动调用
    【解决方案2】:

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

    【讨论】:

    • 我们如何从类的对象上调用静态方法,请给我一个例子
    • " 但是,静态方法既可以在类上调用,也可以在类的对象上调用。"我认为这种说法是错误的。
    【解决方案3】:

    唯一的区别在于非静态类中的静态方法不能是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; }
    }
    

    【讨论】:

      【解决方案4】:

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

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

      从技术上讲,没有区别,只是 ClassA 的 SomeMethod 必须是静态的。

      【讨论】:

        猜你喜欢
        • 2013-07-21
        • 2011-04-23
        • 1970-01-01
        • 2011-01-17
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        相关资源
        最近更新 更多