使用getter时的C#StackOverflowException

时间:2013-05-08 21:15:14

标签: c# 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
                {

                }
            }

我做错了什么?

5 个答案:

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