无法在静态上下文中访问非静态字段[字段名称]

时间:2009-10-02 21:33:09

标签: c#

基类:

public class DatabaseBase
{
  private readonly string connectionString;
  private bool useCounters;

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

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

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

  public string ConnectionString
  {
   get { return this.connectionString; }
  }

...

派生类:

public class ProjectDB : DatabaseBase
{
private bool useServiceConnection;

 private static string ConnectionString
 {
     get
     {
        string connectionString = useServiceConnection == true ? ConfigurationManager.AppSettings["SomeConnection1"] : ConfigurationManager.AppSettings["SomeConnection2"];
         return connectionString;
     }
 }


public ProjectDB() : this(false)
{
}

 private bool isServiceCall;

public ProjectDB(bool useServiceConnection)
    : base(ConnectionString)
{
    this.useServiceConnection = useServiceConnection;
}

private SqlConnection CreateConnection()
{
    return new SqlConnection(ConnectionString);
}

我收到错误“无法访问静态上下文中的非静态字段useServiceConnection”这一行:

string connectionString = useServiceConnection == true ? ConfigurationManager.AppSettings["SomeConnection1"] : ConfigurationManager.AppSettings["SomeConnection2"];

但是,如果我使用useServiceConnection一个静态var来满足quirement,那么我在构造函数中得到同样的错误:

public ProjectDB(bool useServiceConnection)
    : base(ConnectionString)
{
    this.useServiceConnection = useServiceConnection;
}

现在,如果我将useServiceConnection和ConnectionSting属性设置为非静态,那么我在这里得到构造函数的错误:

public LitleDB(bool useWebServiceConnection)
    : base(ConnectionString)
{
    this.useWebServiceConnection = useWebServiceConnection;
}

我认为前两个我理解。

但是现在通过下面更新的示例,为什么在这种情况下构造函数仍然会给我一个错误?那些不再是静态的,所以静态上下文在哪里?所以这就是我现在所拥有的:

public class ProjectDB : DatabaseBase
 {
    private bool useServiceConnection; <-- NO LONGER STATIC

     private new string ConnectionString <-- NO LONGER STATIC
     {
         get
         {
            string connectionString = useServiceConnection == true ? ConfigurationManager.AppSettings["SomeConnection1"] : ConfigurationManager.AppSettings["SomeConnection2"];
             return connectionString;
         }
     }

    public ProjectDB() : this(false)
    {
    }

     private bool isServiceCall;

    public ProjectDB(bool useServiceConnection)
        : base(ConnectionString)  <--- IT'S COMPLAINING HERE NOW, SO WHERE IS IT TRYING TO ACCESS STATICALLY?  I DON'T GET WHY
    {
        this.useServiceConnection = useServiceConnection;
    }

我在这个类中有其他静态属性,这与它有什么关系吗?我不是在使用它们。

4 个答案:

答案 0 :(得分:1)

变量useServiceConnection不是static所以它只存在于类的实例的上下文中。由于属性ConnectionString是静态的,因此它不存在于实例的上下文中,因此它不能“看到”实例成员。您需要使ConnectionString不是静态的,或使useServiceConnection静态。

答案 1 :(得分:0)

static成员属于某种类型,而不属于某种类型的特定实例。是否没有类的实例或者在static成员时创建了一百万个实例并不重要。仅存在一个。实例变量不是这种情况。基本上,您创建的每个实例都有自己的特定实例变量。这就是为什么在没有对象实例的情况下无法访问静态上下文中的实例成员的原因。目前尚不清楚您要访问的实例成员属于哪个对象。但是,您可以通过显式指定对象引用来引用静态上下文中的实例成员:

obj.instanceMember // valid in static context as `obj` specifies the object

答案 2 :(得分:0)

静态成员是类本身的属性。当Database.ConnectionString是静态属性时,您甚至不必在任何地方创建任何数据库实例来访问ConnectionString

因此,在您的财产声明中,当您尝试访问“useServiceConnection”时,它不知道您在谈论什么。 useServiceConnection是一个实例变量 - 它仅存在于Database类的给定实例中。如果没有实例化数据库类怎么办?如果有5个怎么办?从静态范围访问类的实例成员是没有意义的。

我会让你的ConnectionString属性非静态,因为它看起来不像是静态的东西。

答案 3 :(得分:0)

同时在ConnectionString班级实例成员中设置useWebServiceConnectionLitleDb

但是,我不认为你的构造函数在编译后会正常工作。您正在使用ConnectionString的值作为参数调用基础构造函数,但此时您尚未设置useServiceConnection变量,因此它始终为false并且ConnectionString属性将总是返回第二个连接字符串。