2016-02-05 47 views
-2

案例一:关于封装:性能

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

    } 
} 

上面的代码显示编译时错误,因为我只是改变值类型的int字节

错误:恒定值-1不能转换为字节...

什么Console.WriteLine方法真的?

+0

这不是'Console.WriteLine'是做什么特别的。你误解了ABC.Roll = -1实际上做了什么。 – Mark

回答

1

这是因为assigment表达式返回在这种情况下分配的值是-1。它不转让后输出属性值返回ABC.Roll,您可以验证:

Console.WriteLine(ABC.Roll = -1); //-1 
Console.WriteLine(ABC.Roll); //0 

所以ABC.Roll却从未改变验证逻辑的原因在setter方法。

1

一个赋值有一个返回值(赋值)。所以即使你不存储-1它仍然是作业本身的返回值。

这将打印0

ABC.Roll = -1; 
Console.WriteLine(ABC.Roll); 
+0

笑 我知道.... 它会给我输出0 为我的业务逻辑是> 0 和编译器都默认为0 INT设定值值类型 –

+0

你的问题是,为什么它打印'-1'时在你的例子中,你期待'0',我告诉你为什么:因为你写的是作业的返回值而不是属性,我向你展示了它的不同之处。 – Mark