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は、自分自身を呼び出しています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

これは、ゲッター内のゲッターにアクセスしているためです。

バッキング変数を作成し、名前の代わりにその変数にアクセスする必要があります。

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は、ゲッターを使用しています。したがって、無限ループを引き起こしました。

于 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 に答える