繁体   English   中英

仅在C#中编写访问器

[英]Write only accessors in C#

所谓的只写访问器如何工作,例如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属性

类的所有成员都将使用其类型的default值自动初始化。 对于int该值为0

顺便说一下,只写属性的样式不好(根据Microsoft的设计准则 )。 您可能应该改用一种方法。

如果您未初始化int ,则其默认值将等于0

int myInt = new int();

前面的语句与下面的语句具有相同的作用:

int myInt = 0;

默认值表

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

例如:

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

所有原始类型

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));

这是因为默认布尔值设置为false ,然后如果将将内部this.discount设置为false的路线进行检查,然后进入else将payPerViewDiscount设置为0。应始终通过设置调用构造函数中的只写访问器默认值。

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

您应该将default设置为this.Default而不是基础属性。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM