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

private string Password { get; set; }

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

private string _password;

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

private string Password { get; }

or

private string Password { set; }

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

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

齿顶高

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

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


当前回答

在我的代码中,它的主要用途是惰性初始化,就像其他人提到的那样。

在字段上使用私有属性的另一个原因是私有属性比私有字段更容易调试。我经常想知道一些事情,比如“这个领域正在出人意料地设置;谁是第一个设置这个字段的调用者?”如果你能在setter上放一个断点,然后点击go,那就简单多了。你可以把登录放到这里。你可以把绩效指标放进去。您可以放入在调试版本中运行的一致性检查。

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

其他回答

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

我不时地使用它们。当你可以轻松地在属性中添加断点或添加日志记录语句时,它们可以使调试变得更容易。

如果您稍后需要以某种方式更改数据类型或需要使用反射,那么它也很有用。

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

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

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

查看指南(属性(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;
  }
}