【问题标题】:Is a public getter and a private setter with same name possible in C#?在 C# 中是否可以使用同名的公共 getter 和私有 setter?
【发布时间】:2011-08-30 06:23:38
【问题描述】:

如何为属性创建公共 getter 和私有 setter?以下是正确的吗?

public String Password
{
    set { this._password = value; }
}

private String Password
{
    get { return this._password; }
}

【问题讨论】:

  • 您的文本要求输入公共字符串密码 {get; private set} 但您的代码用于 public String Password { set; private get;} 其中一个显然是错误的。
  • @Yaur:很好,我没有注意到。但是任何一个都可以使用相同的语法。

标签: c# properties


【解决方案1】:

是的,即使使用自动属性也是可能的。我经常使用:

public int MyProperty { get; private set; }

【讨论】:

  • 你能解释一下这个人对你的回答的看法吗? stackoverflow.com/questions/1073392/…他是说这样不行吗?我很困惑
  • 那个问题和乔恩的回答说在某些情况下这是不行的,特别是如果值应该是只读的(在 ctor 运行后无法设置),那么使用 auto 属性是错误的。与任何语言功能一样,有正确和错误的用法。
【解决方案2】:
public String Password
{
    private set { this._password = value; }
    get { return this._password; }
}

或者您可以使用自动实现的属性:

public String Password { get; private set; }

【讨论】:

  • 这会使两者都公开对吗?我想让 getter 方法只对类本身可用,意味着私有。
  • 第一位代码不正确。它不执行请求的操作。第二位确实有效。
  • 我喜欢将 getter 放在 setter 之前,这是具有相同访问级别的属性的习惯做法。
【解决方案3】:
public String Password
{
    private set { this._password = value; }
    get { return this._password; }
}

MSDN:

get 和 set 方法一般是 与其他方法没有什么不同。他们 可以执行任何程序逻辑,抛出 例外,被覆盖,并被 使用允许的任何修饰符声明 编程语言。

编辑: MSDN 引用只是为了澄清为什么 geter 和 setter 可以有不同的访问 mdofiers,@Cody Gray 提出的好点:

是的,属性可以执行程序 逻辑和抛出异常。但是他们 不应该。属性旨在 是非常轻量级的方法, 相当于访问一个字段。这 程序员应该期望能够 像使用它们一样使用它们 任何明显的表现 影响。太重了 强烈建议不要使用程序逻辑。 虽然 setter 可以抛出异常 如有必要,吸气剂应该几乎 从不抛出异常

【讨论】:

  • 如果你仔细想想,这不是真的 - 它们与其他功能没有什么不同。
  • 是的,属性可以执行程序逻辑并抛出异常。但他们不应该。属性旨在成为非常轻量级的方法,类似于访问字段。程序员应该期望能够像使用字段一样使用它们,而不会产生任何明显的性能影响。因此,强烈建议不要使用过多繁重的程序逻辑。虽然 setter 可以在必要时抛出异常,但 getter 几乎应该抛出异常。
  • +1 @Cody Gray - 总的来说我同意,只是引用了 msdn 的说法。
  • 很公平。该声明的唯一要点是描述它们的实现。它们在底层实现为两个独立的方法。它没有提供设计建议,这在微软网站的其他地方可以找到。但是大多数人从不费心去看那些,我在这里看到的很多代码就是证明。仅仅因为你可以做某事并不意味着你应该做。
【解决方案4】:

public string Password { get; private set; }

【讨论】:

    【解决方案5】:

    是的,从 C# 2.0 开始,您可以为属性的 getter 和 setter 指定不同的访问级别。

    但是您的语法错误:您应该将它们声明为同一属性的一部分。只需用private 标记您要限制的那个。例如:

    public String Password
    {
        private get { return this._password; }
        set { this._password = value; }
    }
    

    【讨论】:

      【解决方案6】:

      获得“挖掘机”徽章,并更新答案 - 只读字段由 get-only 属性封装

      private readonly int myVal;
      public int MyVal get { return myVal; }
      

      现在(从 C# 6.0 开始)可能缩短为

      public int MyVal { get; }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-18
        • 1970-01-01
        • 2021-06-19
        相关资源
        最近更新 更多