强制在字段上使用成员
本文关键字:成员 字段 | 更新日期: 2023-09-27 17:52:42
是否有办法强制使用属性而不是私有支持字段?
例如: //field
private string str;
// property
public string Str
{
get { return this.str; }
set { this.str = value; DoSomething(); }
}
两个成员都需要有读权限,但是只有property应该有写权限。如何做到这一点呢?
编辑:我说的是类内部的访问权限。
我假设您不希望能够在类中直接写入str
的原因是因为DoSomething
与其值变化紧密耦合。因此,要处理这个问题,请使用关注点分离原则:创建一个内部类,并使其单独负责确保维护耦合:
internal class StrDoSomethingCoupler
{
private readonly Action _doSomething;
private string str;
public StrDoSomethingCoupler(Action doSomething)
{
_doSomething = doSomething;
}
public string Str
{
get { return _str; }
set { _str = value; _doSomething(); }
}
}
public class SomeClass
{
private readonly StrDoSomethingCoupler _coupler =
new StrDoSomethingCoupler(DoSomething);
...
public string Str
{
get { return _couple.Str; }
set { _coupler.Str = value; }
}
}
虽然不清楚这是一个好问题。让我换个说法。
Class A
{
//field
private string _str;
// member
public string Str
{
get { return _str; }
set { _str = value; DoSomething(); }
}
public void SomeMethod()
{
_str = "Dont access like this";
Str= "Should access only like this";
}
}
遗憾的是,答案是否定的,你不能在类a中限制_str的访问。这只是你应该遵循的编码实践,没有内置的语言特性支持它。参考-阻止访问私有成员变量?强行使用公共财产?
在示例代码中我可以看到一个问题。你在Str的setter中做了两件事:
。set { _str = value; DoSomething(); }
是一种不好的做法(尽管在某些地方它是不可避免的,如wpf中的NotifyPropertyChanged()
)。
所以不要这样做,最好通过将DoSomething()从Str.set中分离出来来改变逻辑。比如
Class A
{
//field
private string _str;
// member
public string Str
{
get { return _str; }
private set { _str = value; }
}
private void DoSomething()
{
..
..
}
public void UpdateStrAndDoSomething(string strValue)
{
Str = strValue;
DoSomething();
}
}
private string _str;
public string Str
{
get { return _str; }
private set { _str = value; DoSomething();
}