有没有办法强制使用属性而不是私有支持字段?
例如:
//field
private string str;
// property
public string Str
{
get { return this.str; }
set { this.str = value; DoSomething(); }
}
两个成员都需要具有读取权限,但只有属性应具有写入权限。如何实现?
编辑:我在谈论课堂内的访问权限。不是来自外面。答案 0 :(得分:3)
我假设您不希望能够直接在班级中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; }
}
}
答案 1 :(得分:1)
~/Pages/[PageName]?language=[ar-SA/en-US]
答案 2 :(得分:1)
虽然不清楚这是一个很好的问题。让我重新说一下。
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类在A类中的访问。它只是一个你应该遵循的编码实践,没有支持它的内置语言功能。参考 - Blocking access to private member variables? Force use of public properties?
我可以在示例代码中看到一个问题。你在Str。的设置者中做了两件事。
即。 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();
}
}