为什么默认情况下WPF控件不是私有的?

时间:2017-04-12 04:46:35

标签: c# wpf

在WPF中,写

<TextBlock x:Name="foo"/>

将成为控件public。要使其private,必须明确指定FieldModifier

<TextBlock x:Name="foo" x:FieldModifier="private"/>

我发现这很奇怪。我不认为直接从课外访问子控件是一种很好的编码风格。例如,我会避免写

var muc = new MyUserControl();
muc.foo.Text = "foo";

相反,我会写一个公共方法并使用它:

public void SetFooText(string text) { foo.Text = text; }
// in somewhere else
var muc = new MyUserControl();
muc.SetFooText("foo");

或写一个公共财产

public string FooText 
{ 
    get { return foo.Text; } 
    set { foo.Text = value; } 
}
// in somewhere else
var muc = new MyUserControl();
muc.FooText = "foo";

因此,默认情况下,我并没有真正看到将控件设置为public的任何优势。如果private是默认值,可能更安全,就像C#中的所有内容一样。

为什么public是默认值?

编辑:

好吧,我犯了一个错误。其他人提到的默认值为internal。但是,为什么它不是private的问题仍在等待答案。

1 个答案:

答案 0 :(得分:7)

C#的默认值:C#的FieldModifier是NotPublic(内部)

  

TypeAttributes.NotPublic是默认行为,因为编译XAML的程序集外部的代码很少需要访问XAML创建的元素。 WPF安全体系结构与XAML编译行为一起不会声明将元素实例存储为公共的字段,除非您专门设置x:FieldModifier以允许公共访问。

正如我们所看到的那样,默认情况下它们是私有的,编译XAML的程序集将无法访问XAML创建的元素。

您可以在MSDN

找到更多信息