2009-10-02 77 views
0

基类的非静态字段[字段名]:不能访问静态CONTEX

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静止无功满足quirement,然后我得到的是,这里的构造相同的错误:

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

现在,如果我做useServiceConnection和ConnectionSting财产上的非静态的,然后我得到这个错误为构造函数在这里:

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

我认为我明白了第2个。

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

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

我有这个类的其他静态属性,这是否有什么关系呢?我虽然没有使用它们。

+0

我更新了这篇文章。我现在了解了前两个,现在再看一遍。但最后一个问题是什么让我感到困扰。如果我将ConnectionString属性和useServiceConnection更改为实例成员,为什么当我尝试将ConnectionString传递到Base的构造函数时出现静态错误? – PositiveGuy 2009-10-02 21:43:50

回答

1

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

+0

我明白......但请查看关于构造函数问题的原始文章的最新更新。 – PositiveGuy 2009-10-02 21:42:20

+0

@coffeeaddict:注意到了。我建议你在@womp的答案的最后一段中给出建议:将'ConnectionString'变成一个实例属性而不是静态属性。 – 2009-10-02 21:44:19

+0

你没有真正给我们所有的代码给你的构造函数,或者任何LittleDB代码,所以很难说。 – womp 2009-10-02 21:47:37

0

A static成员属于一个类型而不是某个类型的特定实例。无论您是否没有课程实例,或者在涉及static成员时创建一百万个实例都无关紧要。只有一个将存在。例如变量不是这种情况。基本上,您创建的每个实例都有其自己的特定实例变量。这就是为什么你不能在没有对象实例的情况下访问静态上下文中的实例成员。目前还不清楚你想访问的实例成员属于哪个对象。但是,通过明确指定对象引用,您可以在静态上下文中引用实例成员:

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

静态成员是类本身的属性。如果ConnectionString是静态属性,则甚至不必在任何地方创建任何可以访问Database.ConnectionString的任何数据库实例。

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

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

+0

我明白什么是静态属性和成员。我只是不明白为什么第二个构造函数在任何地方没有任何静态时抱怨。它为什么说当我使用静态关闭之后ConnectionString不再是静态的时候它不能访问非静态的? – PositiveGuy 2009-10-02 22:02:41

+0

看看我对线程的最新更新。我没有任何一个静态了。看看为什么我被卡住了......它现在抱怨在构造函数级别,但为什么,当我没有任何静态字段或属性设置?他们现在都是实例。 – PositiveGuy 2009-10-02 22:03:48

0

也使LitleDb类实例成员中的ConnectionStringuseWebServiceConnection

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

+0

更正,利特尔应该是项目,所以ProjectDB是一个错误的 – PositiveGuy 2009-10-02 21:55:32

+0

在你的第二个声明..我明白了。那么如何设置它并能够将它发送给基础构造函数呢? – PositiveGuy 2009-10-02 21:57:13

+0

也许我可以在初始的空构造函数中进行设置。哪个构造函数被首先调用? – PositiveGuy 2009-10-02 21:59:09