2009-10-02 48 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