我写的课有问题。当我尝试调用它时,我得到一个例外。有关更清晰,请参阅下面的代码。
我有课:
using System;
using System.Data;
namespace People
{
class Person
{
// Auto prop + field
public string Name
{
get { return this.Name; }
private set
{
if (string.IsNullOrEmpty(value))
{
throw new NoNullAllowedException("Name is mandatory");
}
else
{
this.Name = value;
}
}
}
// Auto prop + field
public int Age
{
get { return this.Age; }
private set
{
if (value <= 0 || value > 100)
{
throw new Exception("Age must be between 1 and 100");
}
else
{
this.Age = value;
}
}
}
// Auto prop + field
public string Email
{
get { return this.Email; }
private set { this.Email = value; }
}
// Constructor 1
public Person(string name, int age, string email)
{
this.Name = name;
this.Age = age;
this.Email = email;
}
// Constructor 2
public Person(string name, int age) : this(name,age,"")
{
}
// Write to console
public override string ToString()
{
return string.Format("Name: {0} \nAge: {1} \nEmail: {2}" ,Name,Age,Email);
}
}
}
当我打电话给这堂课时:
Person someone = new Person("First Someone",51,"someone@gmail.com");
Console.WriteLine(someone);
我明白了:
由于StackOverflowException,进程终止。
我无法看到问题 提前谢谢。
答案 0 :(得分:1)
变化
get { return this.Name; }
到
get;
年龄属性也一样。
这是因为this.Name正在使用你要覆盖的get方法,从而创建了光荣的StackOverflowException!如果您需要一个名称和年龄的字段,您必须自己创建一个:
private string name;
public string Name
{
get { return this.name; }
private set
{
if (string.IsNullOrEmpty(value))
{
throw new NoNullAllowedException("Name is mandatory");
}
else
{
this.name = value;
}
}
}
答案 1 :(得分:1)
问题在于,当您尝试获取或设置任何属性时,例如Name
,有一个代码路径调用相同属性的setter:
public string Name
{
get { return this.Name; } // <<<<====== HERE
private set
{
if (string.IsNullOrEmpty(value))
{
throw new NoNullAllowedException("Name is mandatory");
}
else
{
this.Name = value; // <<<<==== HERE
}
}
}
this.Name
表示“Name
的调用getter / setter,其值为value
”。这会产生无限递归,导致堆栈溢出。
要实现具有类似条件的属性,您需要定义存储实际数据的字段。一种常见的方法是将这些字段设为私有,并使用与属性相同的名称命名它们,但第一个字母不应大写:
private string name; // <<<<==== Add this
public string Name
{
get { return name; } // <<<<====== change
private set
{
if (string.IsNullOrEmpty(value))
{
throw new NoNullAllowedException("Name is mandatory");
}
else
{
name = value; // <<<<==== change
}
}
}