2009-09-16 22 views
7

それは静的な何かを探していますなぜ私が把握することはできませんアクセスできません。私は基本的なデータベースクラスで何も静的に見えないので、なぜ?は非静的フィールド

は、ここではちょっと同じ事をしたときの別の例です:

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

OKなぜそれが渡される接続文字列のための静的な文字列でなければならないのですか?

答えて

4

あなたの問題は、mydbというコンストラクタです。 インスタンスフィールド(MyDB.connectionString)は、ベースコンストラクタへの呼び出しが返されるまで初期化されないため、 base(...)内のすべてが静的コンテキスト内にあります。 ジャスト

(サイモン・フォックスによって示唆されているように)いっそ
public class MyDB : DatabaseBase 
{ 
    static readonly string connectionString = 
      ConfigurationManager.AppSettings["MyConnectionString"]; 
    public MyDB() : base(connectionString) 
    { 
    } 
} 

かは...

public class MyDB : DatabaseBase 
{ 
    public MyDB() : base(ConfigurationManager.AppSettings["MyConnectionString"]) 
    { 
    } 
} 
+0

それで、必要に応じてベースコンストラクタにその接続文字列をどのように送信できますか? – PositiveGuy

+3

あなたのソリューションは問題ありませんが、分析は完全に間違っています*。インスタンスフィールドは、ベースコンストラクタが呼び出される前に初期化されます。構築の順序は、派生フィールド初期化子、基本フィールド初期化子、基本コンストラクタ本体、派生コンストラクタ本体です。 –

+1

順序がそのようである理由のために、このテーマに関する私の記事を参照してください。http://blogs.msdn.com/ericlippert/archive/2008/02/15/why-do-initializers-run-in-the-opposite-order -as-constructors-part-one.aspxおよびhttp://blogs.msdn.com/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as-constructors -part-two.aspx –

26

我々は正確なエラーメッセージを与えるために熱心に取り組んできました...それで動作するので、それらを読んで注意深くエラーメッセージは、間違っていることを正確に伝えています。静的にしかアクセスできないコンテキスト内の非静的フィールドにアクセスしています。

なぜ基本コンストラクタ呼び出しの引数リストは、アクセス静力学への唯一の合法的な文脈のですか?

基本コンストラクタを呼び出すときに渡す引数は、「this」を参照してはいけません。どうして?あなたの "this"の派生コンストラクタもベースコンストラクタもまだ実行されていないので、 "this"はほぼ確実に矛盾した、部分的に初期化された状態です。それはクレイジーバグのレシピです。したがって、少なくとも、基本コンストラクタが実行されていることがわかるまで、「this」にアクセスすることを制限します。

この機能は、賢明な秩序だった、理解しやすい、保守性やバグのない建設ロジックを奨励します。私はこれらの保護措置と協力して作業することを推奨します。

+0

この特定のケースでは、フィールド 'connectionString' **の*初期化子*は**既に実行されています(初期化子は最初に、派生元から派生し、次にctorsから派生する)基本ctorのパラメータが初期化されます。 –

+0

もちろん、この特殊なケースは有効ですが、異なるケースのさまざまな動作が混乱するので、なぜこれが特別なケースではないのか理解しています。しかし、これが[私のこの質問](http://stackoverflow.com/q/17342367/11545)のために成立するかどうかは分かりませんが、そのコメントが私をここに導いてくれました。あなたは見てみることができますか? –

関連する問題