属性 的 get 方法中的无限循环

Infinite loop in get method of a property

我有一个 viewModel,它有一个 ienumerable 的 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" }};
        }
    }

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

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" }};
    }
}

这很奇怪 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,除非你打算实际将它设置为与你的 class 外部不同的值,这不适用于你原来的 [=16] =].

这里不需要 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; }
}

你有一个无限循环的原因是你的 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; 部分