【问题标题】:property: private method or private get/set?属性:私有方法还是私有获取/设置?
【发布时间】:2012-09-03 18:54:42
【问题描述】:

如果我想将我的属性设置在一个私有类中,那么应该只能在这个类中使用和设置这个属性,有什么更好的方法?这个

public string Name { private get; private set }

private string Name { get; set }

嗯,还有

private string Name { private get; private set }

【问题讨论】:

  • 你想将该属性设置为类的私有变量吗?
  • @KundanSinghChouhan 是的,我想是的...不确定我是否得到你想要的 ^^
  • @Sila 我已经添加了我的答案。看看吧。
  • 请先尝试编译。关于哪个“更好”的问题将首先出现在哪个“可编译”的问题之后。
  • 所有示例在set 之后都缺少分号;。但即便如此,只有第二个是合法的(见我的回答)。

标签: c# .net properties


【解决方案1】:

值得注意的是,最初,C# 不允许您在 getter 或 setter 上设置不同的访问权限,因此唯一可能的选择是:

public string Name { get; set; }
protected internal string Name { get; set; }
internal string Name { get; set; }
protected string Name { get; set; }
private string Name { get; set; }

(就此而言,您不能拥有自动属性,并且总是必须自己写入和从支持字段写入,但我们将忽略这一点,因为这样我们会有更短的示例)。

对两者进行不同的访问通常很有用,通常是比 getter 更具限制性的 setter,等等

public string Name { get; private set; }

被介绍了。

现在,通过扩展,这似乎是合乎逻辑的:

public string Name { private get; private set; }
private string Name { private get; private set; }

但是,这两个是什么意思呢?

第二个还不错,只是不必要的重复。尽管如此,很可能是一些混乱的想法让我们到达了那里(很可能是不完整的重构)。好的代码就像让计算机做某事一样表达你正在做的事情(如果有的话,更是如此),最好让它表达清楚。

因此,如果您最终得到{ private get; private set; } 之类的内容,那么可能值得再次查看并考虑您在这里真正想说的内容。万岁,这是一个编译器错误。

第一种情况更糟。它说“这个属性是公共的,除了 setter 是私有的,getter 是私有的”。这也不例外,“就是这件事,除了所有的时间”并不是任何事情的真实表达。加倍欢呼编译器不让我们这样做。

【讨论】:

  • 只是为了迂腐:没有在 getter 或 setter 上指定不同的访问权限,还有第五种可能性:protected internal string Name { get; set; }
  • @JeppeStigNielsen 是的。我有一半的想法是 protected internal 不在 C#1.0 中,后来才出现,但快速搜索似乎表明它一直在那里。
  • internal 现在不小心变成了private
  • @JeppeStigNielsen 哈哈。有时一个人应该独自离开。
  • 不错的读物,虽然对于新手来说最明显的用法可能会很方便: public string name { get; private set} 仅仅意味着类可以读取这个属性,但类本身设置它。这可能是由构造函数或此类内部方法的结果。
【解决方案2】:

您是否尝试过编译示例?只有中间的会翻译。

如果您想指定额外的可访问性级别关键字,您只能在其中一个访问器(getter/setter)上执行,并且该访问器级别必须比整个属性的可访问性更具限制性。

这里是规则:Restricting Accessor Accessibility

【讨论】:

  • 是的,你是对的。如果使用私人获取,我无法编译;仅当我使用 private 获取或设置时才使用私有集
  • @silla 那是因为您使用一个访问修饰符设置属性,同时使用不同的访问修饰符设置所有可能的访问器。使用 get 将其设置为 public 并 set private 否定公共部分,因此它不会编译。如果设置为私有,get 和 set 自动为私有,所以不需要设置....
【解决方案3】:
public string Name { get; private set; }

这就是我认为你想要做的。

除非您只想让您的班级看到它,否则当属性为公共时,尝试将其设为私有是没有意义的。在这种情况下,您应该使用:

private string Name { get; set; }

更新:在第二次阅读时,您肯定想要第二个示例。

【讨论】:

    【解决方案4】:

    更好的方法取决于你想要什么:

    public string Name { private get; private set } 该属性是public,但没有人可以读取或写入它,除了类本身。那是完全没用的,所以只使用 private string Name { get; set }.

    一般来说,如果您将属性视为几个方法(实际上是)

    private string get_Name() {  }
    
    private string set_Name(value) {  }
    

    我希望,有可能将该标识符应用于属性get/set 的原因很明显。

    【讨论】:

    • 仅供参考,我不是反对者。我想你的意思是private void set_Name(string value) { }
    • public string Name { private get; private set; } 不会编译 Cannot specify accessibility modifiers for both accessors of the property or indexer 'Program.Name'
    【解决方案5】:

    对于私有成员,您不需要定义访问器。 只需这样做:

    private string _name;
    

    【讨论】:

      【解决方案6】:

      看来你想要

      private string name;
      
      public string Name
      
      {
      
          get { return name; }
      
          set { name = value; }
      
      }
      

      这将允许您访问private string Name

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-02
        • 1970-01-01
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        • 2013-08-16
        相关资源
        最近更新 更多