我理解为什么要使用以下语法来使用只读属性:
private int _MyInt;
public int MyInt
{
get { return _MyInt; }
}
Run Code Online (Sandbox Code Playgroud)
这个例子可能不是最好的例子,因为我认为只读属性真的与readonly变量一起发光,但这不是重点.我不明白的是为什么使用以下语法使用只写属性:
private int _MyInt;
public int MyInt
{
set { _MyInt = value; }
}
Run Code Online (Sandbox Code Playgroud)
这是各种书籍和教程中描述只读属性的方式.如果设置了变量,你会在概念上阅读一些点,至少在内部的类,但该类中甚至在内部读它,你会被accesssing这样做_MyInt,我觉得违反了封装的精神,性质试图强制执行.相反,为什么不只是使用具有不同访问修改的属性的全部功能来访问它:
private int _MyInt;
public int MyInt
{
set { _MyInt = value; }
private get { return _MyInt; }
}
Run Code Online (Sandbox Code Playgroud)
当然可以写出来
public int MyInt { set; private get; }
Run Code Online (Sandbox Code Playgroud)
您仍然可以获得封装,但是限制其他类访问,因此它仍然只能写入外部类.
除非有一种情况,你真诚地希望分配给一个变量,但从未实际访问它,在这种情况下,我肯定会对何时出现这种需求感到好奇.
是否存在特定情况,即WriteOnly属性比方法更有意义?方法方法对我来说更自然.
什么是正确的方法?
使用属性:
Public WriteOnly Property MyProperty As String
Set(ByVal value as String)
m_myField = value
End Set
End Property
Run Code Online (Sandbox Code Playgroud)
public string MyProperty
{
set{ m_myField = value;}
}
Run Code Online (Sandbox Code Playgroud)
使用方法:
Public Sub SetMyProperty(ByVal value as String)
m_myField = value
End Sub
Run Code Online (Sandbox Code Playgroud)
public void SetMyProperty(string value)
{
m_myField = value;
}
Run Code Online (Sandbox Code Playgroud)
编辑 只是为了澄清我指的是"WriteOnly"属性.
我有一些C#代码,喜欢创建具有setter但没有getter的属性.对我而言,这似乎是一种反模式,但我错过了什么?
public List<SiteVisitSummary> DataSource {
set {
// crazy logic here
}
}
Run Code Online (Sandbox Code Playgroud)