任何人都可以找出这个StackOverflowException的原因吗?

Con*_*acF 0 c# stack-overflow

试图学习编程并再次失去信心,因为我认为我已经内化了一个简单的概念,但看起来非常特殊的东西正在发生,或者它只是飞过我的头脑.

当我运行程序时,如果通过为FirstName或SecondName分配字符串来访问该属性,则会出现StackOverFlowException

我的客户类别:

class Customer : ICustomer
{
    public string FirstName
    {
        get
        {
            return FirstName;
        }

        set
        {
            FirstName = value;
        }
    }

    public string fName
    {
        get
        {
            return fName;
        }

        set
        {
            fName = value;
        }
    }

    public string SecondName
    {
        get
        {
            return SecondName;
        }

        set
        {
            SecondName = value;
        }
    }

    public string sName
    {
        get
        {
            return sName;
        }

        set
        {
            sName = value;
        }
    }

    public int ID
    {
        get
        {
            return ID;
        }

        set
        {
            ID = value;
        }
    }

    public int mId
    {
        get
        {
            return mId;
        }

        set
        {
            mId = value;
        }
    }

    public int GetID()
    {
        return mId;
    }

    public void SetID(int id)
    {
        mId = ID;
    }

    public void SetName(string fName, string sName)
    {
        fName = FirstName;
        sName = SecondName;
    }
}
Run Code Online (Sandbox Code Playgroud)

和主程序

class Program
{
    /// <summary>
    /// Create unique string code based off current date and time.
    /// </summary>
    /// <returns>code string</returns>
    static string generateUniqueCode()
    {
        string characters = "abcdefghijklmnopqrstuvqxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        string ticks = DateTime.UtcNow.Ticks.ToString();
        var code = "";
        for (var i = 0; i < characters.Length; i += 2)
        {
            if ((i + 2) <= ticks.Length)
            {
                var number = int.Parse(ticks.Substring(i, 2));
                if (number > characters.Length - 1)
                {
                    var one = double.Parse(number.ToString().Substring(0, 1));
                    var two = double.Parse(number.ToString().Substring(1, 1));
                    code += characters[Convert.ToInt32(one)];
                    code += characters[Convert.ToInt32(two)];
                }
                else
                    code += characters[number];
            }
        }
        return code;
    }

    /// <summary>
    /// Creates unique integer code based off current date and time.
    /// </summary>
    /// <returns>integer code</returns>
    static int generateUniqueCode(int seed)
    {
        string characters = "0123456789";

        Random randInt = new Random(seed);
        var ticks = randInt.Next();

        int code = 0;
        for (var i = 0; i < characters.Length; i += 2)
        {
            if ((i + 2) <= ticks)
            {
                var number = ticks;
                if (number > characters.Length - 1)
                {
                    var one = double.Parse(number.ToString().Substring(0, 1));
                    var two = double.Parse(number.ToString().Substring(1, 1));
                    code += characters[Convert.ToInt32(one)];
                    code += characters[Convert.ToInt32(two)];
                }
                else
                    code += characters[number];
            }
        }
        return code;
    }

    static void Main(string[] args)
    {
        Customer customer = new Customer();

        int generatedIntCode = generateUniqueCode(1);

        customer.FirstName = "Conor";
        customer.SecondName = "MacFirbhisigh";
        customer.SetID(generatedIntCode);
        Console.WriteLine("{0}, {1} {2}", customer.ID, customer.FirstName, customer.SecondName);

        //Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*man 10

FirstName(和所有其他人)的getter和setter中,你一遍又一遍地调用同一个属性.你创建的无限循环将导致a StackOverflowException.

如果您不想为属性添加自定义逻辑,只需使用自动实现的属性:

public string FirstName
{
    get;
    set;
}
Run Code Online (Sandbox Code Playgroud)

如果您确实希望自己实现该属性,创建自己的支持字段,那么它应该是这样的(这实际上与上面的代码生成的内容相同):

private string firstName; // backing field

public string FirstName
{
    get
    {
        return this.firstName; // return the backing field
    }
    set
    {
        this.firstName = value; // set the backing field
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为了教他们正确的方法,`private string _firstName; public string FirstName {get {return _firstName;} set {_firstName = value;}}` (3认同)
  • 是的,当然是,我完全同意你的回答.我只是说他们显然不喜欢如何使用属性,你的回答(正确和我投票)只是告诉他们'不要担心不理解它,只是这样做'. (2认同)