【问题标题】:Cannot declare instance members in a static class in C#无法在 C# 中的静态类中声明实例成员
【发布时间】:2016-12-08 02:16:09
【问题描述】:

我有一个public static class,我试图从我的 C# 中的 app.config 文件访问 appSettings,但我得到了标题中描述的错误。

public static class employee
{
    NameValueCollection appSetting = ConfigurationManager.AppSettings;    
}

如何让它工作?

【问题讨论】:

  • 使 NameValueCollection 静态化..
  • 你明白静态是什么意思吗?从你的问题来看,我认为你不会。您或许应该重新熟悉它的定义,尤其是关于 c# 类。见:msdn.microsoft.com/en-us/library/98f28cdx(VS.71).aspx
  • 这一定是我第一次看到静态的employee 类。
  • @BoltClock 有一个很好的观点;你确定你想让你的员工类是静态的吗?你几乎肯定不想要这种行为。您最好从类和成员中删除静态约束。
  • 也许是单人乐队?

标签: c#


【解决方案1】:

如果类声明为静态,则所有成员也必须是静态的。

static NameValueCollection appSetting = ConfigurationManager.AppSettings;

您确定要让您的员工类是静态的吗?你几乎肯定不想要这种行为。您最好从类和成员中删除静态约束。

【讨论】:

  • 我们有什么理由必须将静态类成员显式声明为静态的。如果它们必须是静态的,为什么不假定每个成员都是静态的,这样可以节省宝贵的打字时间。
  • 好问题@Sherlock,(大约)引用Eric Lippert;这可能是因为有人必须优先考虑并实施这种行为...... :)
  • 更可能是因为如果你只看一下成员,你很可能会困惑很长时间,为什么你的成员行为就像一个静态成员,但它没有声明为 statis .强制我们输入“静态”可以为未来的贡献者省去一些麻烦。
  • 继续,因为这是 C,它的设计要求是明确的而不是隐含的。
【解决方案2】:

它说明了它的含义:

让你的类非静态:

public class employee
{
  NameValueCollection appSetting = ConfigurationManager.AppSettings;    
}

或成员静态:

public static class employee
{
  static NameValueCollection appSetting = ConfigurationManager.AppSettings;    
}

【讨论】:

  • “它说明了它的意思”没有帮助,尤其是对于刚接触这种语言的人。错误消息中没有任何地方解释为什么不能在静态类中声明实例成员。它只是说没有关于如何解决错误的建议就无法完成。
  • 除了第一句话“它说明了它的含义”之外,我的回答中有两种解决 OPs 问题的方法。而且为什么是这种方式还不清楚 - 请参阅已接受答案下方的 cmets。
【解决方案3】:

在静态类中声明实例成员是不合法的。静态类不能被实例化,因此拥有实例成员是没有意义的(它们永远不可访问)。

【讨论】:

    【解决方案4】:

    我知道这篇文章很旧,但是...

    我能够做到这一点,我的问题是我忘记将我的属性设为静态。

    public static class MyStaticClass
    {
        private static NonStaticObject _myObject = new NonStaticObject();
    
        //property
        public static NonStaticObject MyObject
        {
            get { return _myObject; }
            set { _myObject = value; }
        }
    }
    

    【讨论】:

      【解决方案5】:

      您是否尝试过使用类似的“静态”存储类?:

      public static class employee
      {
          static NameValueCollection appSetting = ConfigurationManager.AppSettings;    
      }
      

      【讨论】:

        【解决方案6】:

        正如 John Weldon 所说,静态类中的所有成员都必须是静态的。试试

        public static class employee
        {
             static NameValueCollection appSetting = ConfigurationManager.AppSettings;    
        
        }
        

        【讨论】:

          【解决方案7】:
          public static class Employee
          {
              public static string SomeSetting
              {
                  get 
                  {
                      return ConfigurationManager.AppSettings["SomeSetting"];    
                  }
              }
          }
          

          也将属性声明为静态。此外,不要费心存储对 ConfigurationManager.AppSettings 的私有引用。 ConfigurationManager 已经是一个静态类。

          如果您觉得必须存储对 appsettings 的引用,请尝试

          public static class Employee
          {
              private static NameValueCollection _appSettings=ConfigurationManager.AppSettings;
          
              public static NameValueCollection AppSettings { get { return _appSettings; } }
          
          }
          

          即使默认值是私有的,总是给出明确的访问说明符(私有、公共等)是一种很好的形式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-06-15
            • 1970-01-01
            • 2014-03-19
            • 1970-01-01
            • 2013-10-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多