setter上的'System.StackOverflowException'

时间:2013-12-04 06:51:11

标签: c#

我有一些dto对象,我希望使用wcf通过线路发送。在这个简单的例子中,它有FirstName,LastName和Name。 Name返回first中的firstname和lastname。

通常情况下,我不会将清除器用于Name属性,但我必须这样做,否则它无法序列化,所以我尝试使用内部但我在Name setter上遇到错误

  

类型'System.StackOverflowException'的未处理异常   发生在LibSys.WebServices.dll

[DataMember]
public string FirstName { get; set; }

[DataMember]
public string LastName { get; set; }

[DataMember]
public string Name  {
   get { return string.Format("{0} {1}", FirstName, LastName); }
         internal set { Name = value; }
}

3 个答案:

答案 0 :(得分:6)

你的setter递归调用自己。如果Name的值是从其他属性计算的,则应该完全省略setter。由于它完全是从其他属性计算出来的,因此您可能不需要将其序列化。

如果有一个绝对必须的setter,你可以像这样创建一个空的setter:

public string Name  {
   get { return string.Format("{0} {1}", FirstName, LastName); }
   internal set { }
}

答案 1 :(得分:5)

该错误是Name的设置者。它无条件地调用Name的setter,因此会导致堆栈溢出。

如果NameFirstNameLastName的组合,那么您应该在设置器中拆分value并将这两个值分配给FirstName和{分别为{1}}

LastName

这是一个非常粗略的例子,在签入之前我会添加一些错误检查以确保字符串实际上有空格。

但我真的怀疑为什么这个属性需要一个二传手。它真的是一个计算属性。因此,它应该负责仅显示值。应直接在计算值的属性上设置值。

答案 2 :(得分:0)

问题在于:

public string Name  {
   get { return string.Format("{0} {1}", FirstName, LastName); }
         // you're setting Name to value, that's recursive, you should add another variable.
         internal set { Name = value; }
}