【问题标题】:How to hide the backing field from the rest of the class [duplicate]如何对班级的其他人隐藏支持字段[重复]
【发布时间】:2017-11-10 07:24:37
【问题描述】:

有什么方法可以强制我的其他班级访问属性设置器而不是支持字段?考虑以下笨拙的代码:

public class Brittle
{
    private string _somethingWorthProtecting;
    public string SomethingWorthProtecting
    {
        get { return _somethingWorthProtecting; }
        set
        {
            _somethingWorthProtecting = value;
            ReallyNeedToDoThisEverTimeTheValueChanges();
        }
    }

    public void OhDearWhatWasIThinking()
    {
        _somethingWorthProtecting = "Shooting myself in the foot here, aren't I?";
    }
}

据我所知,C# 没有提供任何机制来防止类开发人员犯此错误。 (在这种情况下,自动属性显然不是一种选择。)是否有设计模式或实践可以帮助防止这种无意的结束?

【问题讨论】:

  • 如果它如此重要,那么值得进行单元测试
  • “防止类开发者犯这个错误” - 说真的,这太过分了。如果修改该类的人需要这样的帮助,那么不要让这个人修改任何东西。评论应该足够了。从另一端,您可以给这个字段 dedicated 名称:_doNotModifyMePlx.

标签: c# properties backing-field


【解决方案1】:

您可以将该逻辑移至抽象基类:

public abstract class Brittle
{
    private string _somethingWorthProtecting;
    public string SomethingWorthProtecting 
    {
        get { return _somethingWorthProtecting; }
        set
        {
            _somethingWorthProtecting = value;
            ReallyNeedToDoThisEverTimeTheValueChanges();
        }
    }

    //.....
}

那么你可以确定没有人会实例化这个类,并且派生类将无法访问私有字段。

public class BrittleDerived : Brittle
{
     public void DoSomething() 
     {
        // cannot access _somethingWorthProtecting;
     }
}

【讨论】:

  • 这个问题的答案重复:stackoverflow.com/a/3265833/993547 :) 两个想法相同。
  • 这个解决方案什么也没有。一个月后,有人会尝试向基类添加新功能,但问题又回来了。
  • 我的意思是,如果有人可以访问您的代码库,那么您可以放入的故障保护装置就只有这么多。如果他们想破坏您的代码,他们可以。
猜你喜欢
  • 2012-05-28
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2016-07-22
  • 2018-07-16
  • 1970-01-01
  • 2015-05-12
相关资源
最近更新 更多