强制在字段上使用成员

时间:2015-06-02 08:57:22

标签: c#

有没有办法强制使用属性而不是私有支持字段?

例如:

 //field
private string str;

// property
public string Str
{
  get { return this.str; }
  set { this.str = value; DoSomething(); }
}

两个成员都需要具有读取权限,但只有属性应具有写入权限。如何实现?

编辑:我在谈论课堂内的访问权限。不是来自外面。

3 个答案:

答案 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();
    }

}