我的单选按钮有问题。我正在做的是创建一个客户对象,同时我想在客户基类中设置每个单选按钮的一个bool属性。我得到的错误消息是“StackOverflowException Unhandeled”。错误指向此“IsClient = value;”在CustomerType类中。
这是我创建Customer对象的位置(在CustomerForm.cs中)
m_customer = new Customer(radioClient.Checked, radioProspect.Checked, radioCompany.Checked, radioPrivate.Checked);
public class Customer : CustomerType
{
private Contact m_contact;
private string m_id;
public Customer()
{
m_id = string.Empty;
}
public Customer(bool client, bool prospect, bool company, bool priv)
{
base.IsClient = client;
base.IsProspect = prospect;
base.IsCompany = company;
base.IsPrivate = priv;
m_id = string.Empty;
}
public Customer(Contact contactData)
{ m_contact = contactData; }
public Customer(string id, Contact contact)
{
m_id = id;
m_contact = contact;
}
public Contact ContactData
{
get { return m_contact; }
set {
if (value != null)
m_contact = value;
}
}
public string Id
{
get { return m_id; }
set { m_id = value; }
}
public override string ToString()
{
return m_contact.ToString();
}
}
public class CustomerType
{
public bool IsClient
{
get { return IsClient; }
set { IsClient = value; }
}
public bool IsCompany
{
get { return IsCompany; }
set { IsCompany = value; }
}
public bool IsPrivate
{
get { return IsPrivate; }
set { IsPrivate = value; }
}
public bool IsProspect
{
get { return IsProspect; }
set { IsProspect = value; }
}
}
答案 0 :(得分:3)
CustomerType
中的所有属性都是递归的 - 它们会炸掉堆栈。
看看这个:
public bool IsClient
{
get { return IsClient; }
set { IsClient = value; }
}
当您尝试获取IsClient
属性的值时,则尝试获取IsClient
属性的值。然后尝试获取IsClient
属性的值...
将这些实现为自动实现的属性:
public bool IsClient
{
get; set;
}
或者有一个合适的支持领域:
private bool isClient;
public bool IsClient
{
get { return isClient; }
set { isClient = value; }
}
答案 1 :(得分:1)
属性是一种功能。你写的相当于写作:
public void DoSomething()
{
DoSomething(); // infinite recursion
}
错误代码:
public bool IsClient
{
get { return IsClient; }
set { IsClient = value; }
}
正确的代码:
public bool IsClient
{
get { return _isClient; }
set { _isClient = value; }
}
private bool _isClient;
或者在C#3.0或更高版本中,您可以将自动实现的属性用于简单的属性:
public bool IsClient { get; set; }