Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法访问非静态字段_C# - Fatal编程技术网

C# 无法访问非静态字段

C# 无法访问非静态字段,c#,C#,我不明白为什么它在寻找静态的东西: public class DatabaseBase { private readonly string connectionString; public DatabaseBase(string connectionString) { this.connectionString = connectionString; } } public class MyDB : DatabaseBase { read

我不明白为什么它在寻找静态的东西:

public class DatabaseBase
{
    private readonly string connectionString;

    public DatabaseBase(string connectionString)
    {
        this.connectionString = connectionString;
    }
}

public class MyDB : DatabaseBase
{
    readonly string connectionString = ConfigurationManager.AppSettings["MyConnectionString"];

    public MyDB() : base(connectionString)
    {          
    }
}
我无法在静态上下文中访问非静态字段“connectionString”。我在基本数据库类中没有看到任何静态的东西,为什么

下面是我们做同样事情的另一个例子:

partial class Database : DatabaseBase
{
    static string DbConnectionString
    {
        get
        {
            if (dbConnectionString == null)
                dbConnectionString = 
                    ConfigurationManager.AppSettings["MyConnectionString"];
            return dbConnectionString;
        }
    }
    public Database() :base(DbConnectionString)
    {
    }

好的,那么为什么它必须是静态字符串才能传递连接字符串呢?

您的问题在MyDB构造函数中。实例字段(MyDB.connectionString)在对基构造函数的调用返回之前不会初始化,因此
base(…)
中的所有内容都在静态上下文中。就用它吧

public class MyDB : DatabaseBase
{
    static readonly string connectionString = 
          ConfigurationManager.AppSettings["MyConnectionString"];
    public MyDB() : base(connectionString)
    {
    }
}
或者更好(如西蒙·福克斯所建议的)


我们一直努力提供准确的错误消息,因此请仔细阅读。错误消息准确地告诉您出了什么问题:您正在访问一个非静态字段,在这个上下文中,访问静态字段是合法的

那么,为什么基构造函数调用参数列表是仅合法访问静态的上下文呢

调用基构造函数时,传递的参数不能引用“this”。为什么?因为“this”的派生构造函数和基构造函数都尚未运行,因此“this”几乎肯定处于不一致、部分初始化的状态。这是疯狂虫子的食谱。因此,我们限制您访问“this”,直到我们知道至少基本构造函数已经运行


该特性鼓励合理、有序、可理解、可维护和无缺陷的构造逻辑;我建议使用这些保护措施,而不是反对这些保护措施。

那么,如何根据需要将该连接字符串发送给基本构造函数?您的解决方案很好,但您的分析完全不正确。intstance字段将在调用基本构造函数之前初始化。构造的顺序是:派生字段初始值设定项、基本字段初始值设定项、基本构造函数体、派生构造函数体。请参阅我关于此主题的文章,了解为什么会出现这种顺序:在这种特殊情况下,字段
connectionString
的初始值设定项已经运行(先是初始值设定项,派生到基,然后是CTOR,从基到派生),因此基本ctor的参数已初始化。当然,如果此特定情况有效,则不同情况下的不同行为会令人困惑,因此我理解为什么这不是特殊情况。但我不确定这是否适用,这一点的注释已将我引向此处。您能看一下吗?
public class MyDB : DatabaseBase
{
    public MyDB() : base(ConfigurationManager.AppSettings["MyConnectionString"])
    {
    }
}