C#获取/设置导致堆栈溢出
本文关键字:堆栈 栈溢出 设置 获取 | 更新日期: 2023-09-27 17:58:56
使用索引的get/set部分会导致堆栈溢出。我试着把这些值放在一个列表中,而不是放在get集中,但结果很糟糕。
class TrackList : CollectionBase
{
public Tracks this[int i]
{
get
{
return this[i];
}
set
{
this[i] = value;
}
}
}
Main:
class Program
{
public static void Main(string[] args)
{
TrackList l1 = new TrackList();
l1[0] = new Tracks(1, "Random");
l1[1] = new Tracks(2, "Random");
l1[2] = new Tracks(3, "Random");
}
}
答案:我在我的发球台里绕圈。这是工作代码:
class TrackList : CollectionBase
{
public Tracks this[int i]
{
get
{
return (Tracks) List[i];
}
set
{
List[i] = value;
}
}
}
Main:
class Program
{
public static void Main(string[] args)
{
TrackList l1 = new TrackList();
l1.Add(new Tracks(1, "random"));
l1.Add(new Tracks(2, "random"));
l1.Add(new Tracks(3, "random"));
}
}
您正在无限次递归调用属性索引器。我想你想要这个:
public Tracks this[int i]
{
get
{
return (Tracks) List[i];
}
set
{
List[i] = value;
}
}
然后,添加您的物品:
TrackList l1 = new TrackList();
l1.List.Add(new Tracks(1, "Random"));
l1.List.Add(new Tracks(2, "Random"));
l1.List.Add(new Tracks(3, "Random"));
然后使用索引器替换项目:
l1[1] = new Tracks(2, "Replacement");
或者使用索引器检索项目:
var firstItem = l1[0];
尝试使用l1[i]
,其中i <= l1.Count
将生成ArgumentOutOfRangeException
,正如您所期望的那样。
首先,您的stackoverflow异常是由对自身调用索引器引起的:
return this[i];
你调用你的索引器,它调用索引器,然后调用索引器等等
你的主程序应该是这样的:
class Program
{
public static void Main(string[] args)
{
TrackList l1 = new TrackList();
l1.Add(new Tracks(1, "Random"));
l1.Add(new Tracks(2, "Random"));
l1.Add(new Tracks(3, "Random"));
}
}
您不能只访问列表中尚未存在的索引。
在你添加它之后,可以从中获得某个元素:
Tracks t = l1[2]; // to get the third element in your list
请勿在索引器setter中使用list.Add
。这违反了最小惊奇原则。
否则,唯一的可能性是在构造函数中创建一个具有预定义数量的null元素的列表。但我不建议这样做。
TrackList l1 = new TrackList(3); // in constructor create a list of 3 null elements
整个方法的正确方法是使用List<Tracks>
,您就完成了。