【问题标题】:Binding objects to WinForms controls and access modifiers将对象绑定到 WinForms 控件和访问修饰符
【发布时间】:2012-02-24 20:34:38
【问题描述】:

我在理解访问修饰符时遇到了一些麻烦;我想更好地了解何时使用什么级别的访问权限,尤其是对于属性 - 只是指向关于该主题的 教程的链接可能是它自己的问题。

但更具体地说,我不明白为什么绑定到 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 怎么办?如果我做到internal int Bar,我会得到一个空的dataGridView1。如果我让它protected 我得到一个编译器错误,因为当然 Form1 不是从 Foo 派生的。

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

内部成员只能在同一个文件中访问 组装。

也欢迎您以系统的方式做出这些声明的一般智慧。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

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

    Form1.dataGridView1 需要Foo.Bar 公开,否则无法使用。
    现在,因为Foo 已经标记为internal,它可以将Bar 公开为public,而不会将其暴露在程序集之外。

    这应该让Form1.dataGridView1 和你同样开心。

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

    【讨论】:

    • 感谢您的明确解释。我想我出于某种原因认为属性可以取代类访问级别。
    • 这很令人困惑,我同意。很高兴你把它整理好了。
    猜你喜欢
    • 2015-10-06
    • 1970-01-01
    • 2010-11-13
    • 2017-11-19
    • 1970-01-01
    • 2010-12-26
    • 2017-03-13
    • 2012-11-14
    • 2014-11-03
    相关资源
    最近更新 更多