首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C#中使用私有属性有什么理由吗?

在C#中使用私有属性有什么理由吗?
EN

Stack Overflow用户
提问于 2010-07-22 22:52:15
回答 19查看 84K关注 0票数 291

我刚刚意识到C# 属性construct也可以与私有访问修饰符一起使用:

代码语言:javascript
复制
private string Password { get; set; }

虽然这在技术上很有趣,但我不能想象我什么时候会使用它,因为私有字段甚至涉及更少的仪式

代码语言:javascript
复制
private string _password;

我无法想象什么时候我需要在内部获取而不是 setset 而不是 get一个私有字段:

代码语言:javascript
复制
private string Password { get; }

代码语言:javascript
复制
private string Password { set; }

但也许有一个使用嵌套/继承类的用例,或者get/set可能包含逻辑,而不仅仅是返回属性的值,尽管我倾向于保持属性严格简单,并让显式方法执行任何逻辑,例如GetEncodedPassword()

有没有人出于某种原因在C#中使用私有属性,或者它只是那些构造之一?

附录

答案很好,我通读了一遍,挑选了以下私有属性的用法:

  • 当私有字段需要延迟加载时
  • 当私有字段需要额外的逻辑或是计算值时
  • 因为私有字段可能很难调试
  • 以便“向您自己呈现约定”
  • 在内部转换/简化作为要在类中使用的serialization
  • wrapping全局变量的一部分的公开属性
EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2010-07-22 23:05:42

如果我需要缓存一个值并且想要延迟加载它,我会使用它们。

代码语言:javascript
复制
private string _password;
private string Password
{
    get
    {
        if (_password == null)
        {
            _password = CallExpensiveOperation();
        }

        return _password;
    }
}
票数 243
EN

Stack Overflow用户

发布于 2010-07-22 23:16:34

正如其他人所提到的,在我的代码中,这一点的主要用途是延迟初始化。

私有属性胜过字段的另一个原因是私有属性比私有字段更容易调试。我经常想知道这样的事情:“这个字段被意外地设置了;谁是第一个设置这个字段的调用者?”如果你只需要在setter上设置一个断点,然后点击go,这就容易多了。你可以把日志放在那里。您可以将性能指标放入其中。您可以放置在调试版本中运行的一致性检查。

基本上,它归结为:代码远比数据更强大。任何能让我写出我需要的代码的技术都是好的。字段不允许您在其中编写代码,但属性可以。

票数 158
EN

Stack Overflow用户

发布于 2010-07-22 22:56:05

可能存在嵌套/继承类的用例,或者get/set可能包含逻辑而不仅仅是返回属性的值

即使我不需要在属性的getter或setter上使用逻辑,我个人也会使用它。使用属性,即使是私有属性,也有助于代码的未来保护,这样如果需要,您可以在以后将逻辑添加到getter中。

如果我觉得一个属性最终可能需要额外的逻辑,我有时会将它包装到一个私有属性中,而不是使用一个字段,这样我以后就不必更改我的代码。

在半相关的情况下(尽管与您的问题不同),我经常在公共属性上使用私有setter:

代码语言:javascript
复制
public string Password 
{
    get; 
    private set;
}

这为您提供了一个公共的getter,但保留了setter的私有。

票数 46
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3310186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档