2009-09-16 36 views
7

tôi không thể tìm ra lý do tại sao nó đang tìm kiếm một cái gì đó tĩnh:Không thể truy cập lĩnh vực không tĩnh

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

tôi nhận được không thể truy cập vào lĩnh vực phi tĩnh 'connectionString' trong bối cảnh tĩnh. Tôi không thấy bất cứ điều gì tĩnh trong lớp cơ sở dữ liệu cơ sở vậy tại sao ??

đây là một ví dụ khi chúng ta đã làm kinda điều tương tự:

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

ok vậy tại sao nó phải là một chuỗi tĩnh cho chuỗi kết nối được thông qua?

Trả lời

4

Sự cố của bạn nằm trong hàm tạo MyDB. Trường cá thể (MyDB.connectionString) sẽ không được khởi tạo cho đến khi cuộc gọi đến hàm tạo cơ sở trả về, vì vậy mọi thứ bên trong base(...) nằm trong ngữ cảnh tĩnh. Chỉ cần làm việc với nó ...

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

hoặc tốt hơn (theo đề nghị của Simon Fox) ...

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

để làm cách nào tôi có thể gửi chuỗi kết nối đó đến hàm tạo cơ sở như được yêu cầu? – PositiveGuy

+3

Giải pháp của bạn là tốt nhưng phân tích của bạn là * hoàn toàn không chính xác *. Trường intstance S W được khởi tạo trước khi hàm tạo cơ sở được gọi. Thứ tự của xây dựng đi: khởi tạo trường bắt nguồn, khởi tạo trường cơ bản, cơ sở hàm tạo cơ sở, cơ thể khởi tạo có nguồn gốc. –

+1

Xem các bài viết của tôi về chủ đề này vì sao đặt hàng theo cách đó: http://blogs.msdn.com/ericlippert/archive/2008/02/15/why-do-initializers-run-in-the-opposite-order -as-constructors-part-one.aspx và http://blogs.msdn.com/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as-constructors -part-two.aspx –

26

Chúng tôi đã làm việc chăm chỉ để cung cấp cho các thông báo lỗi mà là chính xác, vì vậy đọc chúng cẩn thận. Thông báo lỗi cho bạn biết chính xác những gì đang xảy ra: bạn đang truy cập một trường không tĩnh trong một ngữ cảnh mà nó chỉ là hợp pháp để truy cập các số liệu thống kê.

Vậy tại sao đối số cuộc gọi hàm tạo cơ sở lại liệt kê một ngữ cảnh ở đó chỉ hợp pháp để truy cập các thống kê?

Khi bạn gọi hàm tạo cơ sở, đối số bạn vượt qua không được tham chiếu "this". Tại sao? Vì không có hàm khởi tạo nào cũng như hàm tạo cơ sở cho "điều này" của bạn đã chạy, và do đó "điều này" gần như chắc chắn trong trạng thái không nhất quán, được khởi tạo một phần. Đó là một công thức cho các lỗi điên rồ. Do đó, chúng tôi hạn chế bạn truy cập "điều này" cho đến khi chúng tôi biết rằng ít nhất, hàm tạo cơ bản đã chạy.

Tính năng này khuyến khích logic xây dựng hợp lý, được đặt hàng, dễ hiểu, duy trì và không có lỗi; Tôi khuyên bạn nên làm việc với, không chống lại, những biện pháp bảo vệ đó.

+0

Trong trường hợp cụ thể này, * initializer * cho trường 'connectionString' ** đã ** chạy rồi (initializers đầu tiên, origin-to-base, ctors, base-to-derived), vì vậy tham số cho ctor cơ sở được khởi tạo. –

+0

Tất nhiên, trường hợp đặc biệt này có hợp lệ không, các hành vi khác nhau cho các trường hợp khác nhau sẽ gây nhầm lẫn, vì vậy tôi hiểu tại sao điều này không phải là đặc biệt. Nhưng tôi không chắc chắn nếu điều này giữ cho [câu hỏi này của tôi] (http://stackoverflow.com/q/17342367/11545), một bình luận trong đó đã dẫn tôi ở đây. Bạn có thể xem không? –

Các vấn đề liên quan