C# 填写列表时System.StackOverflowException
我会先粘贴代码,这样你就可以看到我在说什么:C# 填写列表时System.StackOverflowException,c#,list,class,C#,List,Class,我会先粘贴代码,这样你就可以看到我在说什么: namespace Radni_sati { public class Blagdani { public List<Blagdani> Blagdani_lista = new List<Blagdani>(); public DateTime datum { get; set; } public string dan_u_tjednu { get; set; } public Blagda
namespace Radni_sati
{
public class Blagdani
{
public List<Blagdani> Blagdani_lista = new List<Blagdani>();
public DateTime datum { get; set; }
public string dan_u_tjednu { get; set; }
public Blagdani()
{
Blagdani KlasaBlagdan6 = new Blagdani();
KlasaBlagdan6.datum = new DateTime(2017, 08, 05);
KlasaBlagdan6.dan_u_tjednu = "Subota";
Blagdani_lista.Add(KlasaBlagdan6);
Blagdani KlasaBlagdan7 = new Blagdani();
KlasaBlagdan7.datum = new DateTime(2017, 08, 15);
KlasaBlagdan7.dan_u_tjednu = "Utorak";
Blagdani_lista.Add(KlasaBlagdan7);
//test blagdan
Blagdani KlasaBlagdan8 = new Blagdani();
KlasaBlagdan8.datum = new DateTime(2017, 09, 29);
KlasaBlagdan8.dan_u_tjednu = "Petak";
Blagdani_lista.Add(KlasaBlagdan8);
}
//some code afterwards
名称空间Radni_sati
{
公共类Blagdani
{
公共列表Blagdani_lista=新列表();
公共日期时间数据{get;set;}
公共字符串danu__tjednu{get;set;}
公共Blagdani()
{
Blagdani KlasaBlagdan6=新Blagdani();
KlasaBlagdan6.datum=新日期时间(2017年8月5日);
KlasaBlagdan6.dan___tjednu=“Subota”;
Blagdani_lista.Add(KlasaBlagdan6);
Blagdani KlasaBlagdan7=新Blagdani();
KlasaBlagdan7.datum=新日期时间(2017年8月15日);
KlasaBlagdan7.dan___tjednu=“Utorak”;
Blagdani_lista.Add(KlasaBlagdan7);
//测试blagdan
Blagdani KlasaBlagdan8=新Blagdani();
KlasaBlagdan8.datum=新日期时间(2017年9月29日);
KlasaBlagdan8.dan___tjednu=“Petak”;
Blagdani_lista.Add(KlasaBlagdan8);
}
//一些代码
所以,我在这里的目的是填写这个列表,以便我以后可以使用它,我不太确定我从互联网上读到的信息中了解到我的案例中发生了什么。请给出一些解释
另外,如果有人能给我一个例子,说明如何使用这两个属性(datum、dan____tjednu)在同一个类中填写该列表,那就太好了。为什么不在另一个类中管理该列表? 从Blagdani类中删除列表,并修改构造函数,如下所示:
public Blagdani(string Xdan_u_tjednu_, DateTime Xdatum)
{
dan_u_tjednu = Xdan_u_tjednu_;
datum = Xdatum;
}
然后创建一个新类,如:
public class ListManager
{
public List<Blagdani> Blagdani_lista = new List<Blagdani>();
}
为什么不在另一个类中管理列表? 从Blagdani类中删除列表,并修改构造函数,如下所示:
public Blagdani(string Xdan_u_tjednu_, DateTime Xdatum)
{
dan_u_tjednu = Xdan_u_tjednu_;
datum = Xdatum;
}
然后创建一个新类,如:
public class ListManager
{
public List<Blagdani> Blagdani_lista = new List<Blagdani>();
}
此构造函数是递归的。因为每次调用它时,它都会创建同一类的新实例,所以实际上,您有一个无限循环,只有在运行时内存或堆栈空间不足时才会终止。此构造函数是递归的。因为每次调用它时,它都会创建同一类的新实例调用时,实际上有一个无限循环,只有在运行时内存或堆栈空间不足时才会终止
Let me Explain what is happening in your case:
Below is your code:
1. Please focus on the comments section i.e which are in the form (// something )
or is in the italic font
名称空间Radni_sati
{
公共类Blagdani
{
公共列表Blagdani_lista=新列表();
公共日期时间数据{get;set;}
公共字符串danu__tjednu{get;set;}
public Blagdani()
{
**Blagdani KlasaBlagdan6 = new Blagdani();** // *recursive call to the constructor again and again*
KlasaBlagdan6.datum = new DateTime(2017, 08, 05);
KlasaBlagdan6.dan_u_tjednu = "Subota";
Blagdani_lista.Add(KlasaBlagdan6);
Blagdani KlasaBlagdan7 = new Blagdani();
KlasaBlagdan7.datum = new DateTime(2017, 08, 15);
KlasaBlagdan7.dan_u_tjednu = "Utorak";
Blagdani_lista.Add(KlasaBlagdan7);
//test blagdan
Blagdani KlasaBlagdan8 = new Blagdani();
KlasaBlagdan8.datum = new DateTime(2017, 09, 29);
KlasaBlagdan8.dan_u_tjednu = "Petak";
Blagdani_lista.Add(KlasaBlagdan8);
}
名称空间Radni_sati
{
公共类Blagdani
{
公共列表Blagdani_lista=新列表();
公共日期时间数据{get;set;}
公共字符串danu__tjednu{get;set;}
public Blagdani()
{
**Blagdani KlasaBlagdan6 = new Blagdani();** // *recursive call to the constructor again and again*
KlasaBlagdan6.datum = new DateTime(2017, 08, 05);
KlasaBlagdan6.dan_u_tjednu = "Subota";
Blagdani_lista.Add(KlasaBlagdan6);
Blagdani KlasaBlagdan7 = new Blagdani();
KlasaBlagdan7.datum = new DateTime(2017, 08, 15);
KlasaBlagdan7.dan_u_tjednu = "Utorak";
Blagdani_lista.Add(KlasaBlagdan7);
//test blagdan
Blagdani KlasaBlagdan8 = new Blagdani();
KlasaBlagdan8.datum = new DateTime(2017, 09, 29);
KlasaBlagdan8.dan_u_tjednu = "Petak";
Blagdani_lista.Add(KlasaBlagdan8);
}
试试这个,你递归地调用你的构造函数,每次初始化对象都会进入无止境的循环,所以你得到了溢出异常将列表转换为静态,您不会递归地调用constructor,,每个构造函数都会做自己的工作,将变量定义为静态将保留您的
Blagdani
,如果它不是静态的,则每个Blagdani
属性都将是最后一个值
public static List<Blagdani> Blagdani_lista = new List<Blagdani>();
public DateTime datum { get; set; }
public string dan_u_tjednu { get; set; }
public Blagdani() {
DateTime date = new DateTime(2017, 08, 05);
string something = "Subota";
Blagdani b = new Blagdani(date, something);
date = new DateTime(2017, 08, 15);
something = "Utorak";
b = new Blagdani(date, something);
date = new DateTime(2017, 08, 29);
something = "Petak";
Blagdani qwe = new Blagdani(date, something);
}
public Blagdani(DateTime dt, string something) { // override constructor
this.datum = dt;
this.dan_u_tjednu = something;
Blagdani_lista.Add(this);
}
publicstaticlist Blagdani_lista=newlist();
公共日期时间数据{get;set;}
公共字符串danu__tjednu{get;set;}
公共Blagdani(){
DateTime日期=新的日期时间(2017年8月5日);
string something=“Subota”;
Blagdani b=新的Blagdani(日期,某物);
日期=新的日期时间(2017年8月15日);
something=“Utorak”;
b=新的Blagdani(日期,某物);
日期=新的日期时间(2017年8月29日);
something=“Petak”;
Blagdani qwe=新的Blagdani(日期,某物);
}
公共Blagdani(DateTime dt,string something){//重写构造函数
这个数据=dt;
this.dan____tjednu=某物;
Blagdani_lista.添加(此);
}
希望有帮助,试试这个,你递归地调用构造函数,每次初始化对象都会进入无止境的循环,所以你得到了溢出异常。通过重写构造函数(或者你可以使用方法)将列表转换为静态,您不会递归地调用constructor,,每个构造函数都会做自己的工作,将变量定义为静态将保留您的
Blagdani
,如果它不是静态的,则每个Blagdani
属性都将是最后一个值
public static List<Blagdani> Blagdani_lista = new List<Blagdani>();
public DateTime datum { get; set; }
public string dan_u_tjednu { get; set; }
public Blagdani() {
DateTime date = new DateTime(2017, 08, 05);
string something = "Subota";
Blagdani b = new Blagdani(date, something);
date = new DateTime(2017, 08, 15);
something = "Utorak";
b = new Blagdani(date, something);
date = new DateTime(2017, 08, 29);
something = "Petak";
Blagdani qwe = new Blagdani(date, something);
}
public Blagdani(DateTime dt, string something) { // override constructor
this.datum = dt;
this.dan_u_tjednu = something;
Blagdani_lista.Add(this);
}
publicstaticlist Blagdani_lista=newlist();
公共日期时间数据{get;set;}
公共字符串danu__tjednu{get;set;}
公共Blagdani(){
DateTime日期=新的日期时间(2017年8月5日);
string something=“Subota”;
Blagdani b=新的Blagdani(日期,某物);
日期=新的日期时间(2017年8月15日);
something=“Utorak”;
b=新的Blagdani(日期,某物);
日期=新的日期时间(2017年8月29日);
something=“Petak”;
Blagdani qwe=新的Blagdani(日期,某物);
}
公共Blagdani(DateTime dt,string something){//重写构造函数
这个数据=dt;
this.dan____tjednu=某物;
Blagdani_lista.添加(此);
}
希望对您有所帮助,您所要做的就是将
列表和构造函数都设置为static
。这样,构造函数中就没有递归调用,因为static
引用的是类型本身,而不是类型的实例:
public class Blagdani
{
public static List<Blagdani> Blagdani_lista;
public DateTime datum { get; set; }
public string dan_u_tjednu { get; set; }
static Blagdani()
{
Blagdani_lista = new List<Blagdani>
{
new Blagdani {datum = new DateTime(2017, 08, 05), dan_u_tjednu = "Subota"},
new Blagdani {datum = new DateTime(2017, 08, 15), dan_u_tjednu = "Utorak"},
new Blagdani {datum = new DateTime(2017, 09, 29), dan_u_tjednu = "Petak"}
};
}
}
输出
您所要做的就是将列表和构造函数都设置为static
。这样,构造函数中就没有递归调用,因为static
引用的是类型本身,而不是类型的实例:
public class Blagdani
{
public static List<Blagdani> Blagdani_lista;
public DateTime datum { get; set; }
public string dan_u_tjednu { get; set; }
static Blagdani()
{
Blagdani_lista = new List<Blagdani>
{
new Blagdani {datum = new DateTime(2017, 08, 05), dan_u_tjednu = "Subota"},
new Blagdani {datum = new DateTime(2017, 08, 15), dan_u_tjednu = "Utorak"},
new Blagdani {datum = new DateTime(2017, 09, 29), dan_u_tjednu = "Petak"}
};
}
}
输出
构造函数中的代码不属于那里。构造函数正在递归地调用自身。每次使用new Blagdani()
所有这些代码都被再次调用。为什么Holiday
实例包含一个列表
?也许该列表应该是静态的
,您可以在静态构造函数中创建它。哦,对不起,我假设您是在nati下运行的