Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的只写访问器#_C# - Fatal编程技术网

C# C语言中的只写访问器#

C# C语言中的只写访问器#,c#,C#,所谓的只写访问器是如何工作的,例如折扣 class CableBill { private int rentalFee; private int payPerViewDiscount; private bool discount; public CableBill(int rentalFee) { this.rentalFee = rentalFee; discount = false; } public

所谓的只写访问器是如何工作的,例如
折扣

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
属性

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


顺便说一下,仅写属性的样式不好(根据)。您可能应该改用方法。

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


顺便说一下,仅写属性的样式不好(根据)。您可能应该改用方法。

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

int myInt = new int();
上述声明与以下声明具有相同的效力:

int myInt = 0;

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

例如:

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

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

int myInt = new int();
上述声明与以下声明具有相同的效力:

int myInt = 0;

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

例如:

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

所有基元类型都类似

整数、双精度、长精度等

将自动指定默认值

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));
你可以这样称呼它

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

所有基元类型都类似

整数、双精度、长精度等

将自动指定默认值

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));
你可以这样称呼它

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

这是因为默认bool设置为
false
,然后如果执行将内部
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;
    }

这是因为默认bool设置为
false
,然后如果执行将内部
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,其值将为0。这是有效属性吗?如果是的话,我真的看不出它有什么意义(在我看来,一个方法更合适)
default(int)==0
default(bool)==false
为什么对答案投反对票?如果你从不初始化int,它的值将是0。这是一个有效的属性吗?如果是的话,我真的看不出它有什么意义(在我看来,一个方法更合适)
default(int)==0
default(bool)==false
为什么对答案投反对票?从来没有使用过
Discount
属性。@默认值就是问题所在。这根本不是问题。问题前提是无效的,如果没有任何属性,他将得到相同的结果。这就是为什么
payPerViewDiscount
的默认值为0。如问题所述:我从未使用过折扣属性,因此OP意识到了这一点。@默认设置,那么您是说下一个遇到此问题的人,谁会发现这篇文章,不应该修复错误计算的根本原因?或多或少。。如果由我决定,我可能会改变整个问题,去掉关于setterproperties的内容。对于我来说,接受的答案与默认值有关,这意味着OP认为调用了setterproperty,但它始终只是一个默认值。标题和问题彼此无关(这就是为什么我说问题的前提是无效的)。从不使用
折扣
属性。@默认值就是问题所在。这根本不是问题。问题前提是无效的,如果没有任何属性,他将得到相同的结果。这就是为什么
payPerViewDiscount
的默认值为0。如问题所述:我从未使用过折扣属性,因此OP意识到了这一点。@默认设置,那么您是说下一个遇到此问题的人,谁会发现这篇文章,不应该修复错误计算的根本原因?或多或少。。如果由我决定,我可能会改变整个问题,去掉关于setterproperties的内容。对于我来说,接受的答案与默认值有关,这意味着OP认为调用了setterproperty,但它始终只是一个默认值。标题和问题之间没有任何关系(这就是为什么我说问题的前提是无效的)。只写属性只有在有副作用的情况下才是糟糕的样式。我同意你的答案,但不得不不同意这个前提:)只写属性只有在有副作用的情况下才是糟糕的风格。我同意你的答案,但不得不不同意这个前提:)我没有投反对票,但尽管这个答案在这个问题上是正确的,但总体上是错误的。如果不初始化
int
局部变量,编译器将不允许您以任何方式访问其值。如果你没有初始化一个
int
类字段,那么是的,它的默认值是零。@moez无意冒犯,我投了反对票,因为你基本上给出了和第一个发帖的Sebastian相同的答案。现在你扩大了答案,我又投了反对票。我没有投反对票,但尽管这个答案是正确的