强制在字段上使用成员

本文关键字:成员 字段 | 更新日期: 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();
}