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

private string Password { get; set; }

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

private string _password;

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

private string Password { get; }

or

private string Password { set; }

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

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

齿顶高

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

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


当前回答

私有get only属性的一个很好的用法是计算值。有几次我有私有只读属性,只是在我的类型中对其他字段进行计算。它不值得作为方法,其他类也不感兴趣,所以它是私有属性。

其他回答

另一种用法是在设置值时执行一些额外的操作。

它发生在WPF在我的情况下,当我显示一些信息基于私有对象(不实现INotifyPropertyChanged):

private MyAggregateClass _mac;

private MyAggregateClass Mac
{
    get => _mac;
    set
    {
        if(value == _mac) return;
        _mac = value;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DisplayInfo)));
    }
}

public string DisplayInfo => _mac.SomeStringInformationToDisplayOnUI;
        

还可以有一些私有方法,例如

private void SetMac(MyAggregateClass newValue)

这样做。

好吧,正如没有人提到的,你可以用它来验证数据或锁定变量。

Validation string _password; string Password { get { return _password; } set { // Validation logic. if (value.Length < 8) { throw new Exception("Password too short!"); } _password = value; } } Locking object _lock = new object(); object _lockedReference; object LockedReference { get { lock (_lock) { return _lockedReference; } } set { lock (_lock) { _lockedReference = value; } } } Note: When locking a reference you do not lock access to members of the referenced object.

惰性引用:当惰性加载时,你可能最终需要异步加载,现在有AsyncLazy。如果你使用的是比Visual Studio SDK 2015更老的版本,或者没有使用它,你也可以使用AsyncEx的AsyncLazy。

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

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

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

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

Conn = foo.bar.LazyDbConnection;

属性和字段不是一对一的。属性是关于类的接口(无论是谈论它的公共接口还是内部接口),而字段是关于类的实现。属性不应该被视为仅仅公开字段的一种方式,它们应该被视为公开类的意图和目的的一种方式。

Just like you use properties to present a contract to your consumers on what constitutes your class, you can also present a contract to yourself for very similar reasons. So yes, I do use private properties when it makes sense. Sometimes a private property can hide away implementation details like lazy loading, the fact that a property is really a conglomeration of several fields and aspects, or that a property needs to be virtually instantiated with each call (think DateTime.Now). There are definitely times when it makes sense to enforce this even on yourself in the backend of the class.

当存在与属性set或get相关的逻辑时(考虑惰性初始化),并且属性在类中的几个地方使用时,这是非常有意义的。

如果它只是一个直接的后场?我想不出什么好理由。