将对象绑定到WinForms控件和访问修饰符

本文关键字:访问 控件 对象 绑定 WinForms | 更新日期: 2023-09-27 18:25:38

我在理解访问修饰符方面遇到了一些困难;我想知道什么时候使用什么级别的访问权限,尤其是对属性的访问权限——只是链接到关于该主题的好教程可能是个问题。

但更具体地说,我不明白为什么绑定到WinForm控件的对象必须是公共的。所以我创建了我的对象:

public class Foos : List<Foo>
{
}
public class Foo
{
    private int bar;
    public int Bar
    {
        get { return bar; }
        set { bar = value; }
    }
}

然后将其绑定到CCD_ 1

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暴露在程序集之外,该怎么办?如果我把它设为internal int Bar,我会得到一个空的dataGridView1。如果我把它设为protected,我会得到一个编译器错误,因为Form1当然不是从Foo派生的。

我的程序中表单中的控件如何与内部的定义不匹配?

内部成员只能在同一装配

关于你如何以系统的方式发表这些宣言的普遍智慧也受到欢迎。

将对象绑定到WinForms控件和访问修饰符

您应该将整个Foo类标记为internal
这样,整个Foo类及其所有成员都将在程序集外部不可见

Form1.dataGridView1需要Foo.Bar是公共的,否则它将无法使用它。
现在,因为DataGridView0已经标记为internal,所以它可以将Bar暴露为public,而不存在将其暴露在程序集外部的风险。

这应该会让Form1.dataGridView1和你同样快乐。

  • 请注意,通过将Foo标记为internalFoos也应该从public更改为internal,因为Foos的访问级别可能不高于其派生的类