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

private string Password { get; set; }

虽然这在技术上很有趣,但我无法想象我什么时候会使用它,因为私人领域涉及的仪式甚至更少:

private string _password;

我无法想象什么时候我需要能够在内部获取但不设置或设置但不获取私有字段:

private string Password { get; }

or

private string Password { set; }

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

是否有人出于某种原因在c#中使用私有属性,或者它只是那些技术上可行但在实际代码中很少使用的结构之一?

齿顶高

不错的答案,我仔细阅读了这些私人财产的用途:

当需要惰性加载私有字段时 当私有字段需要额外的逻辑或者是计算值时 因为私有字段很难调试 为了“向自己展示一份合同” 将公开的属性作为序列化的一部分在内部转换/简化 包装要在类中使用的全局变量


当前回答

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

private string _password;
private string Password
{
    get
    {
        if (_password == null)
        {
            _password = CallExpensiveOperation();
        }

        return _password;
    }
}

其他回答

各种答案都提到了使用属性来实现惰性成员。这个答案讨论了使用属性来生成活的别名。我只是想指出,这两个概念有时是同时存在的。

当使用一个属性作为另一个对象的公共属性的别名时,该属性的惰性被保留:

[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private IDbConnection Conn => foo.bar.LazyDbConnection;

另一方面,在构造函数中检索该属性将否定lazy方面:

Conn = foo.bar.LazyDbConnection;

这是我唯一能想到的用法

private bool IsPasswordSet 
{ 
     get
     {
       return !String.IsNullOrEmpty(_password);
     }
}

通常只修改使用get/set方法的成员,甚至是私有方法。现在,这背后的逻辑是,所以你知道你的get/set总是以一种特定的方式表现(例如,触发事件),这似乎没有意义,因为这些不会包括在属性方案中……但旧习难改。

惰性初始化是它们可以很整洁的一个地方,例如。

private Lazy<MyType> mytype = new Lazy<MyType>(/* expensive factory function */);

private MyType MyType { get { return this.mytype.Value; } }

// In C#6, you replace the last line with: private MyType MyType => myType.Value;

然后你可以写:this。MyType而不是this.mytype.Value,并封装了它在单个位置被惰性实例化的事实。

一个遗憾的是c#不支持将支持字段的作用域定义为属性(即在属性定义中声明它)来完全隐藏它,并确保它只能通过属性访问。

查看指南(属性(c#编程指南)),似乎没有人期望将属性用作私有成员。

属性使类能够公开获取和设置值的公共方式,同时隐藏实现代码或验证代码。

在任何情况下,它都可以通过一个或两个方法进行交换,反之亦然。

原因可能是在获取时用圆括号,在设置时用字段语法。