在C#中的静态类中不能声明实例成员。

54

我有一个public static class,并且我正在尝试从我的C#应用程序配置文件中访问appSettings,但是我得到了标题中描述的错误。

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

我该如何使这个工作起来?


4
将NameValueCollection变为静态。 - Srinivas Reddy Thatiparthy
7
你了解 "static" 是什么意思吗?根据你的问题,我认为你可能不了解。你或许需要重新熟悉它在 C# 类中的定义,参见:http://msdn.microsoft.com/zh-cn/library/98f28cdx(VS.71).aspx - i_am_jorf
6
这肯定是我第一次看到一个静态的“员工”类。 - BoltClock
1
@BoltClock提出了一个非常好的观点;你确定你想要你的员工类是静态的吗?几乎可以肯定你不希望有这种行为。最好将类和成员的静态约束移除。 - John Weldon
13
也许这是一个独奏乐队? - Pharabus
显示剩余2条评论
7个回答

105
如果类被声明为静态的,那么它的所有成员也必须是静态的。
static NameValueCollection appSetting = ConfigurationManager.AppSettings;

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


2
我们必须明确声明静态类成员为静态的原因是什么?如果它们必须是静态的,为什么不假定每个成员都是静态的,这样可以节省宝贵的打字时间。 - Sherlock
3
好问题,@Sherlock。引用Eric Lippert的话来说,这可能是因为某人必须对其进行优先级排序和实现... :) - John Weldon
2
更可能是因为如果你仅仅看成员变量,很有可能你会长时间困惑为什么你的成员行为像静态成员一样,但它并没有声明为静态。强制我们输入“static”可以为未来的贡献者节省一些麻烦。 - Hacky
由于这是C语言,它的设计要求事情必须明确而非隐含。 - Justin Helps

7

这句话的意思是:

将你的类变为非静态的:

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

或成员静态:
public static class employee
{
  static NameValueCollection appSetting = ConfigurationManager.AppSettings;    
}

6
“它说什么就是什么”这句话并不有用,特别是对于刚接触这种语言的人来说。错误信息中没有任何地方解释为什么实例成员不能在静态类中声明。它只是简单地说无法完成,没有提供任何解决错误的建议。 - dsanchez
除了第一句话“说到做到”,我的回答中还有两种解决方案可以解决OP的问题。 为什么要这样做并不清楚-请查看下面被接受答案下面的评论。 - tanascius

7

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


4

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

我能够完成这个操作,我的问题在于我忘记将属性设置为静态。

public static class MyStaticClass
{
    private static NonStaticObject _myObject = new NonStaticObject();

    //property
    public static NonStaticObject MyObject
    {
        get { return _myObject; }
        set { _myObject = value; }
    }
}

1
你尝试过使用类似于“static”存储类吗?
public static class employee
{
    static NameValueCollection appSetting = ConfigurationManager.AppSettings;    
}

1

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

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

}

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

}

即使默认是私有的,始终给出明确的访问说明符(private、public等)是一个好习惯。


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