Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.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#_Encapsulation_Console.writeline - Fatal编程技术网

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的实际作用。