2012-02-23 67 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