C# 'System.StackOverflowException'

C# 'System.StackOverflowException'

我是 C# 新手。我正在尝试创建一个名为 'Product' 的 class。它有一些名为“productName”、“discountRate”、“productPrice”的变量。我想使用 productPrice(例如 6000)和 discountRate(例如 10)来计算新价格。如果 discountRate 为 0,那么它应该 return productPrice,如果 discountRate 不为 0,那么它应该 return 新价格。

产品价格 - ((产品价格 * discountRate) / 100)

但是我收到这个错误:

An unhandled exception of type 'System.WhosebugException' occurred in Class_intro.dll

这是我的代码:

using System;

namespace Class_intro
{
    class Program
    {
        static void Main(string[] args)
        {
            Product product1 = new Product();
            product1.productName = "Huawei Notebook";
            product1.discountRate = 10;
            product1.productPrice = 6000;

            Product product2 = new Product();
            product2.productName = "Lenovo Notebook";
            product2.discountRate = 25;
            product2.productPrice = 4000;


            Product[] products = new Product[] { product1, product2 };

            foreach (var product in products)
            {
                Console.WriteLine("Product Name: " + product.productName
                    + "\nProduct Price: " + product.productPrice
                    + "\nDiscount Rate: " + product.discountRate
                    + "\n-----------------");
            }
        }
    }

    class Product
    {
        public string productName { get; set; }
        public int discountRate { get; set; }
        public double productPrice
        {
            get
            {
                if (discountRate == 0)
                {
                    return productPrice;
                }
                else
                {
                    return productPrice - ((productPrice * discountRate) / 100);
                }
                
            }
            set { productPrice = value; }


        }
        

    }
}

为了清楚起见,您需要为您的产品价格提供支持字段 属性:

class Product
{
    public string ProductName { get; set; }
    public int DiscountRate { get; set; }
    private double productPrice;
    public double ProductPrice
    {
        get
        {
            if (DiscountRate == 0)
            {
                return productPrice;
            }
            else
            {
                return productPrice - ((productPrice * DiscountRate) / 100);
            }
            
        }
        set { productPrice = value; }

    }
}

通常我对属性使用句子大小写,对私有字段的开头使用 _,但是对于私有字段以小写开头的驼峰式大小写同样有效。最好选择一些东西并坚持下去。

您需要声明另一个 double 来保存您的“productPrice”值,您可以 return 在 get 上这样做,并按计划在 set 上设置它。

试试这个:

using System;

namespace Class_intro
{
    class Program
    {
        static void Main(string[] args)
        {
            Product product1 = new Product();
            product1.productName = "Huawei Notebook";
            product1.discountRate = 10;
            product1.ProductPrice = 6000;

            Product product2 = new Product();
            product2.productName = "Lenovo Notebook";
            product2.discountRate = 25;
            product2.ProductPrice = 4000;


            Product[] products = new Product[] { product1, product2 };

            foreach (var product in products)
            {
                Console.WriteLine("Product Name: " + product.productName
                    + "\nProduct Price: " + product.ProductPrice
                    + "\nDiscount Rate: " + product.discountRate
                    + "\n-----------------");
            }
        }
    }

    class Product
    {
        public string productName { get; set; }
        public int discountRate { get; set; }

        private double productPrice;
        public double ProductPrice
        {
            get
            {
                if (discountRate == 0)
                {
                    return productPrice;
                }
                else
                {
                    return productPrice - ((productPrice * discountRate) / 100);
                }

            }
            set { productPrice = value; }
        }
    }
}

错误的原因是在getter和setter中都引用了属性,这导致了无限循环,但是你的设计有点混乱,因为你使用了“毛”产品价格和“折扣”产品价格相同 属性。我只会对产品价格使用普通的 属性,对折扣价使用单独的只读 属性。这也摆脱了无限循环:

class Product
{
    public string productName { get; set; }
    public int discountRate { get; set; }
    public double productPrice {get; set;}
    public double discountedPrice 
    {
        get
        {
            return productPrice - ((productPrice * discountRate) / 100);
        }
    }
}

请注意,您不需要 if (discountRate == 0) 大小写,因为在数学上它是相同的,但如果您想将它保留在那里以提高可读性,那很好。