【问题标题】:Infinite loop in get method of a property属性的get方法中的无限循环
【发布时间】:2017-06-18 14:10:41
【问题描述】:

我有一个 viewModel,它有一个可枚举的 selectitemlist 用于下拉框,但是在 get 方法中我遇到了无限循环,我该怎么办?

        public IEnumerable<SelectListItem> TargetList
    {
        get
        {
            return TargetList;
        }
        private set
        {
            TargetList = new List<SelectListItem> { new SelectListItem { Value = "Android", Text = "Android" },
                                                    new SelectListItem { Value= "WebGL", Text="WebGL" },
                                                    new SelectListItem { Value= "Windows", Text="Windows" },
                                                    new SelectListItem { Value= "IOS", Text="IOS" }};
        }
    }

【问题讨论】:

标签: c# asp.net asp.net-mvc viewmodel


【解决方案1】:

这是一个非常奇怪的 setter,因为它不使用您传递给它的任何值。您似乎将 setter 方法与初始化混淆了。试试这个

public IEnumerable<SelectListItem> TargetList{ get; } 
                   = new List<SelectListItem> { new SelectListItem { Value = "Android", Text = "Android" },
                                                new SelectListItem { Value= "WebGL", Text="WebGL" },
                                                new SelectListItem { Value= "Windows", Text="Windows" },
                                                new SelectListItem { Value= "IOS", Text="IOS" }};

这个东西不需要有一个 setter,除非你打算将它实际设置为与你的类之外不同的值,这不适用于你原来的 setter。

【讨论】:

    【解决方案2】:

    您的 get 正在调用 selft。您需要设置一个支持字段。

    private IEnumerable<SelectListItem> _targetList
    
    public IEnumerable<SelectListItem> TargetList
    {
        get
        {
            return _targetList;
        }
        private set
        {
            _targetList = new List<SelectListItem> { new SelectListItem { Value = "Android", Text = "Android" },
                                                    new SelectListItem { Value= "WebGL", Text="WebGL" },
                                                    new SelectListItem { Value= "Windows", Text="Windows" },
                                                    new SelectListItem { Value= "IOS", Text="IOS" }};
        }
    }
    

    【讨论】:

      【解决方案3】:

      这里不需要 getter 或 setter 的主体。

      public class MyClass
      {
          public MyClass()
          {
              this.TargetList = new List<SelectListItem> 
              {
                  new SelectListItem { Value = "Android", Text = "Android" },
                  new SelectListItem { Value= "WebGL", Text="WebGL" },
                  new SelectListItem { Value= "Windows", Text="Windows" },
                  new SelectListItem { Value= "IOS", Text="IOS" }
               }
           }
           public IEnumerable<SelectListItem> TargetList
           {  get ; private set; }
      }
      

      【讨论】:

        【解决方案4】:

        你有一个无限循环的原因是你的 getter 在没有终止条件的情况下递归地调用自己。如果您希望使用一些默认值初始化您的属性并允许调用代码来更改它,您可以使用这样的自动实现属性...

        public IEnumerable<SelectListItem> TargetList { get; set; } =
            new List<SelectListItem>
            {
                new SelectListItem() { Value="Android",Text="Android"},
                new SelectListItem() { Value= "WebGL", Text="WebGL" },
                new SelectListItem() { Value= "Windows", Text="Windows" },
                new SelectListItem() { Value= "IOS", Text="IOS" }
            };
        

        这样,您就拥有了默认项目,并且如果您愿意,仍然可以在运行时将其设置为不同的列表。如果您不想更改列表,则可以不使用属性的 set; 部分。

        【讨论】:

          猜你喜欢
          • 2015-12-28
          • 2021-07-27
          • 2014-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多