C# 关于封装:属性
案例一:C# 关于封装:属性,c#,encapsulation,console.writeline,C#,Encapsulation,Console.writeline,案例一: class example { private int roll; public int Roll { get { return roll; } set{ if (value > 0) { roll = value; } } } //public example() //{ // roll = 500;
class example
{
private int roll;
public int Roll
{
get {
return roll;
}
set{
if (value > 0)
{ roll = value; }
}
}
//public example()
//{
// roll = 500;
//}
}
class practice_4
{
static void Main(string[] args)
{
example ABC = new example();
Console.WriteLine(ABC.Roll = -1);
Console.ReadLine();
}
}
输出:-1
我已经设置了一个不包含任何非法值的业务逻辑,并在默认情况下为我提供了值“0”
案例二:
class example
{
private byte roll;
public byte Roll
{
get {
return roll;
}
set{
if (value > 0)
{ roll = value; }
}
}
//public example()
//{
// roll = 500;
//}
}
class practice_4
{
static void Main(string[] args)
{
example ABC = new example();
Console.WriteLine(ABC.Roll = -1);
Console.ReadLine();
}
}
上面的代码显示编译时错误,因为我只是将valuetype Int更改为byte
错误:常量值-1无法转换为字节
Console.WriteLine方法真正做的是什么?这是因为assigment表达式返回正在分配的值,在本例中为
-1
。它不会返回ABC.Roll
,您可以通过在赋值后输出属性值来验证:
Console.WriteLine(ABC.Roll = -1); //-1
Console.WriteLine(ABC.Roll); //0
因此,
ABC.Roll
实际上从未改变setter
方法中验证逻辑的原因。赋值有一个返回值(赋值)。因此,即使您没有存储-1
,它仍然是赋值本身的返回值
这将打印0
:
ABC.Roll = -1;
Console.WriteLine(ABC.Roll);
哈哈,我知道。。。。它将给我输出0,因为我的业务逻辑是value>0,并且编译器默认为int-valuetypes设置了0。我们的问题是,在您的示例中,当您期望
0
时,为什么它会打印-1
,我告诉您原因:因为您编写的是赋值的返回值,而不是属性,我正在向您展示不同之处在于,控制台.WriteLine
没有做任何特殊的事情。你误解了ABC.Roll=-1的实际作用。