【问题标题】:Avoiding Array Recursive Set (C#) [duplicate]避免数组递归集(C#)[重复]
【发布时间】:2018-10-03 02:45:20
【问题描述】:
Class MyClass
{
    public int[] MyArray
    {
        get {return MyArray;}
        set
        {
            if (value == null) { MyArray = new int[2] { 0, 0 }; return;}
            else { MyArray = value; return;}
        }
    }
    public MyClass()
    {
        this.MyArray = new int[2] { 0, 0 };
    }
}

在我的课堂上,我有一个int[],我需要在set 中处理value 的操作,除非我尝试创建MyClass 的新实例时出现堆栈溢出。

当我在构造函数和set 上放置断点时,它会在构造函数中显示myArray = new int[2] {0, 0}; 调用set 方法,一旦set 到达myArray = value 行,它就会再次调用set 方法。这会循环一段时间,然后抛出堆栈溢出异常。我尝试在分配后立即输入return;,但没有达到返回值。

对数组使用 set 方法的任何启示都会很棒。

【问题讨论】:

    标签: c# arrays methods


    【解决方案1】:

    如果您的 getset 有正文,则您需要一个缺少的支持字段。

    class MyClass
    {
        private int[] _myArray;
    
        public int[] MyArray
        {
            get {return _myArray;}
            set
            {
                if (value == null) { _myArray = new int[2] { 0, 0 }; }
                else { _myArray = value; }
            }
        }
        public MyClass()
        {
            this.MyArray = new int[2] { 0, 0 };
        }
    }
    

    在这段代码中,有一个私有字段 _myArray 被用作属性的支持字段。

    【讨论】:

      【解决方案2】:

      问题是你指向的是同一个内存空间:

      public int[] MyArray
      {
          get {return MyArray;}
          ...
      }
      

      访问属性myArray 将访问您的属性myArray,这将导致访问相同的属性!


      对此的答案是使用private variable,它只能从您的班级直接编写。而public property 只会访问这个变量。

      像这样:

      class MyClass
      {
          private int[] _myArray;
          public int[] MyArray
          {
              get { return _myArray; }
              set
              {
                  if (value == null) { _myArray = new int[2] { 0, 0 }; return; }
                  else { _myArray = value; return; }
              }
          }
      }
      

      有关属性的更多详细信息,例如on DotNetPerlsMS Official page

      【讨论】:

        猜你喜欢
        • 2017-09-20
        • 2017-01-31
        • 2019-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多