C#中的只读访问器

本文关键字:读访问 | 更新日期: 2023-09-27 18:11:37

所谓的只读访问器是如何工作的,例如Discount

class CableBill
{
    private int rentalFee;
    private int payPerViewDiscount;
    private bool discount;
    public CableBill(int rentalFee)
    {
        this.rentalFee = rentalFee;
        discount = false;
    }
    public bool Discount
    {
        set
        {
            discount = value;
            if (discount)
                payPerViewDiscount = 2;
            else
                payPerViewDiscount = 0;
        }
    }
    public int CalculateAmount(int payPerViewMoviesOrdered)
    {
        return (rentalFee - payPerViewDiscount) * payPerViewMoviesOrdered;
    }
}

当我写时

CableBill january = new CableBill(4);
MessageBox.Show(january.CalculateAmount(7).ToString());

返回值为28

我的问题是:
程序如何知道payPerViewDiscount=0?初始化对象时,我从未使用过Discount属性

C#中的只读访问器

类的所有成员都会自动使用其类型的default值进行初始化。对于int,这是0

顺便说一句,只写属性是不好的风格(根据微软的设计准则(。您可能应该使用一种方法。

如果没有初始化int,其默认值将等于0

int myInt = new int();

上述声明与以下声明具有同等效力:

int myInt = 0;

默认值表

在c#中,可以使用default关键字来确定类型的默认值。

例如:

default(bool)
default(int)
default(int?)

这是因为默认bool设置为false,然后if执行将内部this.discount设置为false的路线,进行检查并进入将payPerViewDiscount设置为0的else。应该始终通过设置默认值来调用构造函数中的只读访问器。

public bool Discount
    {
        set
        {
            this.discount = value;
            if (this.discount)
                this.payPerViewDiscount = 2;
            else
                this.payPerViewDiscount = 0;
        }
    }

您应该将默认值设置为this.Default,而不是基础属性。

public CableBill(int rentalFee)
    {
        this.rentalFee = rentalFee;
        this.Discount = false;
    }

所有基元类型

int、double、long等

自动分配默认值。

default value for int=0;
default value for char=''0';
default value for char=''0';

例如,您不知道某个基元类型的默认值你可以像这个一样访问它们

 public void PassDefaultValues(bool defaultBool, DateTime defaultDateTime)
 {
   // Nothing
 }

你可以这样称呼它

        public void PassDefaultValues(default(bool), default(DateTime));