2009-09-16 19 views
7

Nie mogę zrozumieć, dlaczego to szuka czegoś statycznego:nie można uzyskać dostępu do pola niestatyczny

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) 
    {   
    } 
} 

otrzymuję Nie można uzyskać dostępu pola niestatycznego „connectionString” w kontekście statycznej. Nie widzę nic statycznego w bazie bazy danych, więc dlaczego?

oto kolejny przykład kiedy zrobiliśmy trochę to samo:

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

ok, więc dlaczego to musi być statyczny ciąg na ciąg połączenia mają być przekazywane?

Odpowiedz

4

Twój problem dotyczy konstruktora MyDB. Pole instancji (MyDB.connectionString) nie zostanie zainicjowane, dopóki nie zwróci się wywołanie konstruktora podstawowego, więc wszystko wewnątrz base(...) znajduje się w kontekście statycznym. Wystarczy z nim pracować ...

public class MyDB : DatabaseBase 
{ 
    static readonly string connectionString = 
      ConfigurationManager.AppSettings["MyConnectionString"]; 
    public MyDB() : base(connectionString) 
    { 
    } 
} 

albo jeszcze lepiej (jak sugeruje Simon Fox) ...

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

więc jak mogę wysłać ten ciąg połączenia do konstruktora bazowego, jak jest to wymagane? – PositiveGuy

+3

Twoje rozwiązania są w porządku, ale twoja analiza jest * całkowicie niepoprawna *. Pole intencji zostanie zainicjowane przed wywołaniem konstruktora podstawowego. Kolejność budowania idzie: inicjatory pól pochodnych, inicjatory pól bazowych, korpus konstruktora bazowego, pochodne konstruktory. –

+1

Zobacz moje artykuły na ten temat, dlaczego zamówienie jest w ten sposób: http://blogs.msdn.com/ericlippert/archive/2008/02/15/why-do-initializers-run-in-the-opposite-order -as-constructors-part-one.aspx i http://blogs.msdn.com/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as-constructors -part-two.aspx –

26

Pracowaliśmy ciężko, aby dać się komunikaty o błędach, które są dokładne, więc je czytać ostrożnie. Komunikat o błędzie informuje dokładnie, co jest nie tak: uzyskujesz dostęp do pola niestatycznego w kontekście, w którym dostęp do statystyk jest legalny.

Dlaczego więc lista argumentów wywołań w bazie konstruktorów jest kontekstem, w którym dostęp do statystyk jest legalny?

Podczas wywoływania konstruktora bazowego argumenty, które należy przekazać, nie muszą zawierać odniesienia do tego "". Czemu? Ponieważ ani konstruktor wyprowadzony, ani konstruktor bazowy dla twojego "tego" jeszcze nie działa, a zatem "to" prawie na pewno jest niespójnym, częściowo zainicjowanym stanem. To przepis na szalone błędy. Dlatego ograniczamy dostęp do "tego", dopóki nie dowiemy się, że przynajmniej podstawowy konstruktor został uruchomiony.

Ta funkcja zachęca do rozsądnej, uporządkowanej, zrozumiałej, łatwej do utrzymania i wolnej od błędów logiki konstrukcyjnej; Polecam pracę z, a nie przeciwko tym zabezpieczeniom.

+0

W tym szczególnym przypadku * inicjalizator * dla pola 'connectionString' ** ** już działa (najpierw inicjatory, pochodne-do-podstawy, następnie cnki, podstawa-do-pochodnej), więc parametr dla ctor bazowego jest zainicjowany. –

+0

Oczywiście, gdyby ten konkretny przypadek był ważny, różne zachowania dla różnych przypadków byłyby mylące, więc rozumiem, dlaczego nie było to przypadkiem specjalnym. Ale nie jestem pewien, czy to dotyczy [moje pytanie] (http://stackoverflow.com/q/17342367/11545), komentarz, który doprowadził mnie tutaj. Mógłbyś rzucić okiem? –

Powiązane problemy