C#使用getter时的StackOverflowException

C#使用getter时的StackOverflowException,c#,getter,C#,Getter,我有一个getter,它将字符串的第一个字母改为大写。但我得到了StackOverflowException namespace ConsoleApplication1 { class Program { class Human { public String Name { get {

我有一个getter,它将字符串的第一个字母改为大写。但我得到了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
                {
                
                }
            }

我做错了什么?

这一行
char[]letters=Name.tocharray()
递归调用属性
公共字符串名

,这是因为您正在访问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;
            }
        }

您的属性
Name
正在第
char[]letters=Name.tocharray()行中调用自身。您必须使用字段而不是属性:

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;
        }
    }
}
这:


当您试图从
Name
读取某些内容时,您使用的是getter。因此,您造成了一个无限循环。

这里有一个工作名称方法,当您获得值时,它会使句子的第一个字母大写

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; }
}

亲爱的上帝,我从哪里开始呢?给这个男孩一个机会,他可能是一个初学者,正在努力完成他的第一行代码。首先,你的示例代码无法编译。2个返回语句和一个开括号。其次,getter递归地引用自身。您需要设置一个私有字符串#名称并对其进行计算。是的,这是我在C#中的第一行代码。无论如何,哗众取宠的革命p将您的_name字段移出属性,我将对其进行更新投票。:)@哈哈哈,这是一个又好又愚蠢的错误!谢谢!:)
char[] letters = Name.ToCharArray();
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; }
}