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

private string Password { get; set; }

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

private string _password;

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

private string Password { get; }

or

private string Password { set; }

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

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

齿顶高

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

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


当前回答

我一直在做的一件事是将“全局”变量/缓存存储到HttpContext中。当前的

private static string SomeValue{
  get{
    if(HttpContext.Current.Items["MyClass:SomeValue"]==null){
      HttpContext.Current.Items["MyClass:SomeValue"]="";
    }
    return HttpContext.Current.Items["MyClass:SomeValue"];
  }
  set{
    HttpContext.Current.Items["MyClass:SomeValue"]=value;
  }
}

其他回答

我在序列化中使用它们,比如DataContractSerializer或protobuf-net,它们支持这种用法(XmlSerializer不支持)。如果你需要简化一个对象作为序列化的一部分,它是有用的:

public SomeComplexType SomeProp { get;set;}
[DataMember(Order=1)]
private int SomePropProxy {
    get { return SomeProp.ToInt32(); }
    set { SomeProp = SomeComplexType.FromInt32(value); }
}

显式字段的一些更奇特的用法包括:

你需要使用ref或out的值-可能因为它是一个联锁计数器 它旨在表示基本布局,例如在具有显式布局的结构上(可能映射到c++转储或不安全代码) 在历史上,该类型一直与带有自动字段处理的BinaryFormatter一起使用(更改为auto-props会更改名称,从而破坏序列化器)

我知道这个问题很老了,但下面的信息没有出现在任何当前的答案中。

我无法想象什么时候我需要内部获取而不是设置

如果你正在注入你的依赖项,你可能很想在属性上有一个Getter,而不是一个setter,因为这将表示一个只读属性。换句话说,Property只能在构造函数中设置,不能由类中的任何其他代码更改。

此外,Visual Studio Professional将提供关于属性而不是字段的信息,从而更容易看到您的字段正在被使用。

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

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

我使用私有属性来减少访问经常使用的子属性的代码。

    private double MonitorResolution
    {
        get { return this.Computer.Accesories.Monitor.Settings.Resolution; }
    }

如果有很多子属性,它是有用的。