【问题标题】:Private variable accessing私有变量访问
【发布时间】:2012-12-19 07:20:26
【问题描述】:

声明有什么用

private Int64 _ID ;
public Int64 ID{get { return _ID; }set { _ID = value; } };

这样声明一个私有变量

现在通常在编码中我们直接使用 ID,然后访问私有的 _ID。 这如何提供更高的安全性而不是直接声明为

public int64 ID{get;set;}

【问题讨论】:

    标签: c# private


    【解决方案1】:

    两全其美:

    public long ID {get;set;}
    

    这不是更容易吗?

    您不应该将字段公开为public,但这并不意味着您也需要冗长。

    【讨论】:

    • 没错,但我想提供安全性,如果我像上面那样使用,那么我实际上是在制作公开的变量,我不想要那个。
    • 你不应该暴露 - 虽然这可能是一个讨论的话题 ;) IIRC Jeffrey Richter 是完全不使用属性的坚定支持者,尽管人们并不总是必须这样做按照他的推理,他针对属性和 PRO(公共)字段提出了一些有效的观点。
    • @Raghurocks 不,上述不会将变量(意思是:字段)公开;此外,您可以在以后添加所需的任何逻辑,而无需将 API 更改为调用者
    • @Raghurocks 好吧,我不同意那个博客。这假设您拥有需要维护的不变量,但重点是:一旦某物是自动属性,您可以稍后更改它以添加更多逻辑而不会破坏接口暴露给调用者。这对于公共字段不正确:以后对道具的任何更改都是根本性的破坏性更改。
    • @igrimpe 我知道在某些情况下您想正式声明:“这是实现*”,因此可以公开字段(在某些非常具体的情况下) 是可取的,但这是少数的情况。对于大多数日常业务线等编程,它根本不适用。
    【解决方案2】:

    您可以通过 get 和 set 方法获得封装的 benefit,以便调用您可以放置​​ custom logic 的位置。私有_ID 是一个占位符,用于在某些主体写入_id 时通过set 方法保存您的属性为protected 的数据,同样您可以在get 给出值之前放置自定义逻辑。

    这是msdn 对属性的解释“属性结合了字段和方法的各个方面。对于对象的用户来说,属性似乎是一个字段,访问该属性需要相同的语法。对于一个类的实现者,一个属性是一个或两个代码块,代表一个get访问器和/或一个set访问器。get访问器的代码块在读取属性时执行;set访问器的代码块在读取时执行该属性被分配了一个新值。没有 set 访问器的属性被认为是只读的。没有 get 访问器的属性被认为是只写的。具有两个访问器的属性是读写的。"。你可以通过here阅读更多内容。

    【讨论】:

    • 感谢您的回复,如果我写了类似这样的内容 private Int64 _ID {get;set;} ; public Int64 ID{get { return _ID; } 设置 { _ID = 值; } };有什么区别
    • 实际上我的基本疑问是,如果我们正在编写类似这种表示法的东西,拥有私有字段和公共道具,我们拥有拥有业务逻辑的优势,但我们不是将私有字段设为公开的
    【解决方案3】:

    您应该阅读有关PropertiesFields 的信息。属性提供了更好的封装,应该使用而不是暴露公共字段。

    【讨论】:

    • “为什么?”的一个例子将能够使二传手private。现在你有一个从外部只读的属性。
    【解决方案4】:

    在设置和获取值之前检查输入或输出时会带来安全性,请看:

    private int? _ID;
    public int ID 
    {
        get { return _ID ?? 0; }
        set { _ID = value >= 0 ? value : 0; } 
    }
    

    【讨论】:

    • 当然@MarcGravell你是对的,只是想向他展示你可以控制输入和输出,这个例子并不实用。
    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 2012-05-09
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多