属性 的 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;
部分
我有一个 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;
部分