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相同的答案。现在你扩大了答案,我又投了反对票。我没有投反对票,但尽管这个答案是正确的