【问题标题】:What was the name of the set accessor that only lets the value to be set in the constructor?只允许在构造函数中设置值的 set 访问器的名称是什么?
【发布时间】:2010-09-02 20:10:08
【问题描述】:
public class MyClass
{
  public string Name {get; KEYWORD set;}

  public MyClass(string name)
  {
    this.Name = name;
  }
}

知道关键字是什么吗?我到处搜索,但很难在 google 中找到 get/set 访问器。

【问题讨论】:

    标签: c# .net properties accessor


    【解决方案1】:

    如果您希望只能在构造函数中设置值,我建议您使用 readonly 关键字:

    public class MyClass
    {
        private readonly string _name;
        public MyClass(string name)
        {
            _name = name;
        }
    
        public string Name 
        {
            get { return _name; }
        }
    }
    

    【讨论】:

    • 不,不幸的是它不能,这就是为什么你有readonly关键字:-)
    • 谢谢达林。遗憾的是,他们不允许将其用于汽车属性。因为微软可以为汽车属性做,对吧?
    • @Joan,很多事情都是可能的,但正如 Eric Lippert 在他的博客中所写的那样,为了实现一个特性,必须有人来编写规范、实现、测试、记录和发布,这会花费时间和钱,还有必须尊重的优先事项和最后期限。引用:`因此必须有人分析问题空间,权衡可能方法的成本和收益,设计解决方案,实施解决方案,测试它,记录它并将其发送给客户。不涉及魔法!` (blogs.msdn.com/b/ericlippert/archive/2009/03/20/…)
    • 谢谢达林。只是想确定一下,所以理论上是不可能的。但我明白你的意思。
    【解决方案2】:

    private 关键字允许从类中的任何位置设置属性:

    private set;
    

    即:

    public string Name {get; private set;}
    

    如果您还想允许从继承类设置它,您可以改用protected

    您可以使用readonly 关键字只允许设置一次属性,但它不能用于自动实现的属性。

    【讨论】:

    • 您收到错误可能是因为您的属性不是公开的。
    • MyClass.Name 是如何声明的?我猜这不是公共字符串
    • 这个错误听起来好像你已经翻转了:私有字符串名称 {get; public set;} 会说“嘿,公共集并不比私有名称更具限制性。”如果您将属性设置为公开但设置为私有,则不应看到该错误消息。
    • Private 仍然允许在同一类中重置它。该问题明确指出它只能在构造函数中设置。
    • @Joan Venge,防止此类的任何其他部分设置字段的唯一方法是使用 readonly 关键字。
    【解决方案3】:

    我知道在字段上使用 READONLY 关键字可以让您在该字段中写入一次,并且必须仅在构造函数中。

    【讨论】:

      【解决方案4】:

      就像 GenericTypeTea 说的那样,您可能正在寻找 private 关键字。

      但是,为了清楚起见,将您的 set 访问器设为私有并不限制它仅限于构造函数,但无论如何都在类中。

      要使属性只能从构造函数中设置,您需要这样的东西

      public class MyClass
      {
        private string name;
        public string Name {get { return name;} }
      
        public MyClass(string nameString)
        {
          name = nameString;
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-10-08
        • 2019-09-20
        • 1970-01-01
        • 2020-10-12
        • 1970-01-01
        • 1970-01-01
        • 2015-11-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多