【问题标题】:If I create a static class in C#, will any methods inside be considered static as well, regardless of whether they're explicitly declared as static? [duplicate]如果我在 C# 中创建一个静态类,内部的任何方法是否也被视为静态,无论它们是否显式声明为静态? [复制]
【发布时间】:2012-07-13 04:41:34
【问题描述】:

可能重复:
C#.NET - Why do members of a static class need to be declared as static? Why isn't it just implicit?

我遇到了一个有趣的错误,当我从一个静态声明的类中调用一个方法(我没有明确声明为静态的)时,我收到一条消息说

非静态字段、方法或属性 'MangoTree.Twitter.OAuthClient.PerformRequest(System.Collections.Generic.Dictionary, string, string, string, MangoTree.Twitter.OAuthClient.RequestType) 需要对象引用'

当我将方法显式声明为静态时,错误就消失了,我可以从类声明中删除静态修饰符,错误就消失了。令我困惑的是,我的印象是,当我将类声明为静态时,类中的所有内容也应该自动成为静态的,而无需我显式声明它。

【问题讨论】:

标签: c# static static-methods


【解决方案1】:

让我困惑的是,我的印象是,当我将类声明为静态时,类中的所有内容也应该自动成为静态

静态类的所有成员都必须是静态的,但这不是自动发生的:您必须明确声明所有成员都是静态的。声明类静态的目的是让编译器检查所​​有成员都是静态的,并防止任何尝试创建静态类的实例。

【讨论】:

    【解决方案2】:

    静态类的所有成员都必须是静态的。

    为什么请阅读这篇文章?

    http://www.codeproject.com/Articles/15269/Static-Keyword-Demystified

    【讨论】:

      【解决方案3】:

      如果您在 C# 中创建静态类,则需要将内部的方法声明为静态:

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

      例子:

      static class CompanyInfo
      {
          public static string GetCompanyName() { return "CompanyName"; }
          public static string GetCompanyAddress() { return "CompanyAddress"; }
          //...
      }
      

      【讨论】:

        【解决方案4】:

        你不能在不创建类的实例的情况下调用非静态成员函数。因此,在第一种情况下,由于无法实例化静态类,因此在尝试从静态函数调用非静态函数时会出现错误。

        但是,如果你的类是非静态的,并且有两个方法,其中一个是静态的,你可以像这样在静态函数中很好地调用非静态成员函数

        public class Foo
        {
            public void Test()
            {
            }
        
            public static void Test1()
            {
                 Foo foo = new Foo();
                 foo.Test1();
            }
        }
        

        由于静态成员和类在实例化普通类之前就已经被实例化了,静态函数不会知道普通函数的存在。

        在第二种情况下,因为这两个函数都被声明为静态,所以没有问题。

        【讨论】:

          【解决方案5】:

          C# 编译器将静态类标记为“密封抽象”,因此您永远无法实例化静态类或从静态类继承。因此,在静态类中定义非静态成员没有实际价值,因为您将永远无法实例化该类,因此永远无法调用非静态成员。所以你必须在静态类中只定义静态成员。一个类是否应该是静态的天气是设计设计决策。

          【讨论】:

            猜你喜欢
            • 2020-08-06
            • 1970-01-01
            • 2013-02-19
            • 1970-01-01
            • 2012-07-05
            • 1970-01-01
            • 2014-05-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多