在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
的问题仍在等待答案。
答案 0 :(得分:7)
C#的默认值:C#的FieldModifier是NotPublic(内部)
TypeAttributes.NotPublic是默认行为,因为编译XAML的程序集外部的代码很少需要访问XAML创建的元素。 WPF安全体系结构与XAML编译行为一起不会声明将元素实例存储为公共的字段,除非您专门设置x:FieldModifier以允许公共访问。
正如我们所看到的那样,默认情况下它们是私有的,编译XAML的程序集将无法访问XAML创建的元素。
您可以在MSDN
找到更多信息