我已经把首字母串改为首都了。但我得到了StackOverflowException。
namespace ConsoleApplication1
{
class Program
{
class Human
{
public String Name
{
get
{
char[] letters = Name.ToCharArray();
// upper case the first char
letters[0] = char.ToUpper(letters[0]);
// return the array made of the new char array
return new String(letters);
//return Name.First().ToString().ToUpper() + String.Join("", Name.Skip(1));
}
set
{
}
}
我做错了什么?
答案 0 :(得分:6)
此行char[] letters = Name.ToCharArray();
以递归方式调用属性public String Name
答案 1 :(得分:4)
您的媒体资源Name
正在排队char[] letters = Name.ToCharArray();
。您将不得不使用字段而不是属性:
class Human
{
private string _name;
public String Name
{
get
{
if (_name == null)
return null;
if (_name.Length <= 1)
return _name.ToUpper() + _name.Substring(1);
return _name.Substring(0, 1).ToUpper() + _name.Substring(1);
}
set
{
_name = value;
}
}
}
我也自由地尝试让你的功能与上部外壳一起工作。或者在我看来更好:
class Human
{
private string _name = "";
public String Name
{
get
{
return _name;
}
set
{
if (String.IsNullOrEmpty(_name))
_name = value;
else
_name = value.Substring(0, 1).ToUpper() + _value.Substring(1);
}
}
}
答案 2 :(得分:2)
那是因为你正在访问getter中的getter。
您应该创建一个支持变量并访问该变量而不是名称:
class Human
{
private string _name = string.Empty;
public String Name
{
get
{
char[] letters = _name.ToCharArray(); // use the backing variable instead of Name
// upper case the first char
letters[0] = char.ToUpper(letters[0]);
// return the array made of the new char array
return new String(letters);
//return Name.First().ToString().ToUpper() + String.Join("", Name.Skip(1));
return new String(;// ToUpperFirstLetter(this.Imie);
}
set
{
_name = value;
}
}
答案 3 :(得分:1)
此:
char[] letters = Name.ToCharArray();
当您尝试从Name
读取内容时,您正在使用getter。因此,你已经造成了无限循环。
答案 4 :(得分:0)
这是一个有效的Name方法,当你得到这个值时,它会使句子的第一个字母大写。
private string _name;
public string Name
{
get
{
if (string.IsNullOrEmpty(_name))
{
return _name;
}
var charArray = _name.ToCharArray();
charArray[0] = char.ToUpper(charArray[0]);
return new string(charArray);
}
set { _name = value; }
}