setter上的'System.StackOverflowException'

use*_*193 1 c#

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

通常情况下,我不会使用清除器为Name属性,但我必须,否则它无法序列化,所以我尝试内部但我在名字设置器上收到错误

LibSys.WebServices.dll中发生了未处理的"System.StackOverflowException"类型异常

[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; }
}
Run Code Online (Sandbox Code Playgroud)

p.s*_*w.g 6

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

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

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


Jar*_*Par 5

这个bug是setter的Name.它无条件地调用setter,Name因此会导致堆栈溢出.

如果Name是组合FirstNameLastName,那么你应该拆分value的调节器和两个值赋给FirstNameLastName分别

public string Name  {
   get { return string.Format("{0} {1}", FirstName, LastName); }
   internal set 
   {
      var values = value.Split(new char[] { ' ' });
      FirstName = values[0];
      LastName = values[1];
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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