2012-02-23 80 views
0

我在理解訪問修飾符時遇到了一些麻煩;我想知道什麼時候使用什麼級別的訪問權限,特別是對於屬性 - 只需鏈接到好的關於該主題的教程可能是它自己的問題。將對象綁定到WinForms控件和訪問修飾符

但更具體地說,我不明白爲什麼綁定到WinForm控件的對象必須是公共的。所以我創造我的對象:

public class Foos : List<Foo> 
{ 
} 

public class Foo 
{ 
    private int bar; 
    public int Bar 
    { 
     get { return bar; } 
     set { bar = value; } 
    } 
} 

然後將其綁定到DataGridView

public partial class Form1 : Form 
{ 
    private Foos formFoos; 

    public Form1() 
    { 
     InitializeComponent(); 

     formFoos = new Foos(); 
     AddFoo(); 

     dataGridView1.AutoGenerateColumns = true; 
     dataGridView1.DataSource = formFoos; 
    } 

    /// <summary> 
    /// generate some test values 
    /// </summary> 
    private void AddFoo() 
    { 
     for (int i = 1; i <= 5; i++) 
     { 
      Foo foo = new Foo(); 
      foo.Bar = 5 * i; 
      formFoos.Add(foo); 
     } 
    } 
} 

工作正常。但是如果我不想在我的組件外部暴露Foo.Bar?如果我使它我得到一個空的dataGridView1。如果我做到了protected我得到一個編譯器錯誤,因爲當然Form1不是從Foo派生的。

雖然我的程序中的窗體中的控件如何與internal的定義不匹配?

內部成員只能在同一個 程序集的文件中訪問。

關於如何以系統方式進行這些聲明的一般智慧也受到歡迎。

回答

0

您應該將整個Foo類標記爲internal
這樣,整個Foo類和它的所有成員將隱形以外的程序集。

Form1.dataGridView1需要Foo.Bar要公開,否則它將無法使用它。
現在,由於Foo已標記爲internal,因此它可以將Bar作爲public公開,而不會將其暴露在程序集外部。

這應該使Form1.dataGridView1和你同樣高興。

  • 請注意,通過標記FoointernalFoos也應該從public更改爲internal因爲Foos可能沒有比它是從派生的類更高的訪問級別。
+0

感謝您的明確解釋。我想我出於某種原因認爲一個屬性可以取代一個類訪問級別。 – downwitch 2012-02-29 00:09:07

+0

這是令人困惑的,我同意。很高興你把它整理出來。 – AVIDeveloper 2012-03-01 15:06:05