【问题标题】:Is property a container and accessor in C#?属性是 C# 中的容器和访问器吗?
【发布时间】:2013-07-31 06:46:13
【问题描述】:

我的班级中有这个属性:

public string A
{
    set
    {
        A = value;
    }
}

每当我尝试为 A 赋值时,它都会给我一个错误。实际上,我的 IIS Express 停止并且没有给出任何线索。

我有一种感觉,这给 A 创造了无限的价值分配,就像一个递归。我的问题:

  1. 我的代码中发生了什么?
  2. 当您指定实现时,属性是否只是访问器(getter/setter)而不是容器?
  3. 使用自动实现的属性时,该属性是容器还是访问器?

【问题讨论】:

    标签: c# properties


    【解决方案1】:

    您将遇到 StackOverflow 异常,因为您在其 setter 中分配属性本身,这会导致无休止的分配。

    【讨论】:

      【解决方案2】:

      您不能将属性变量本身设置为容器.. 你可以这样写。

      场景 1:

      public string A
      {
          set;
      }
      

      场景 2:

      private string _A=String.Empty;
      public string A
      {
          set{_A=value;}
      }
      

      如果有任何问题,请告诉我。

      【讨论】:

        【解决方案3】:

        当您使用自动实现的属性时,编译器会为值和方法生成一个容器以使用该容器(获取和设置)。

        当您像您一样自己实现该适当性时,编译器仅生成一个 set 方法,然后调用自身,从而导致无限循环。正确的做法是:

        private string _a;
        public string A
        {
            set
            {
                _a = value;
            }
        }
        

        在这种情况下,编译器会生成一个方法来设置_a的值,并且不会发生递归。

        【讨论】:

        • 所以属性只是语法糖?我的意思是,它将 getter 和 setter 转换为方法?
        • 是的,没错。你可以在 set 方法中做任何你想做的事情,当从代码中“分配”属性时,它将被执行。与 get 相同,只是您必须返回一些内容才能使其编译。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        • 2014-08-18
        • 2021-12-09
        • 1970-01-01
        • 2017-02-21
        • 2016-05-09
        相关资源
        最近更新 更多