0

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

我做错了什么?

4

5 回答 5

6

此行char[] letters = Name.ToCharArray();递归调用属性public String Name

于 2013-05-08T21:16:42.557 回答
4

您的属性Name在 line 中调用自己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);
        }
    }
}
于 2013-05-08T21:17:13.920 回答
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;
            }
        }
于 2013-05-08T21:16:53.073 回答
1

这个:

char[] letters = Name.ToCharArray();

当您尝试从 中读取内容时Name,您正在使用 getter。因此,您造成了无限循环。

于 2013-05-08T21:17:35.077 回答
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; }
}
于 2013-05-08T21:35:53.953 回答