Chinaunix首页 | 论坛 | 博客
  • 博客访问: 255725
  • 博文数量: 63
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1860
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-07 14:41
文章分类

全部博文(63)

文章存档

2015年(2)

2014年(61)

我的朋友

分类: C#/.net

2014-09-27 11:55:19

常见错误 #1: 把引用当做值来用,或者反过来
C++ 和其他很多语言的程序员,习惯了给变量赋值的时候,要么赋单纯的值,要么是现有对象的引用。然而,在C# 中,是值还是引用,是由写这个对象的程序员决定的,而不是实例化对象并赋值的程序员决定的。这往往会坑到 C# 的新手程序员。
如果你不知道你正在使用的对象是否是值类型或引用类型,你可能会遇到一些惊喜。例如:
  Point point1 = new Point(20, 30);  Point point2 = point1;  point2.X = 50;  Console.WriteLine(point1.X);       // 20 (does this surprise you?)  Console.WriteLine(point2.X);       // 50    Pen pen1 = new Pen(Color.Black);  Pen pen2 = pen1;  pen2.Color = Color.Blue;  Console.WriteLine(pen1.Color);     // Blue (or does this surprise you?)  Console.WriteLine(pen2.Color);     // Blue
如你所见,尽管Point和Pen对象的创建方式相同,但是当一个新的X的坐标值被分配到point2时, point1的值保持不变 。而当一个新的color值被分配到pen2,pen1也随之改变。因此,我们可以推断point1和point2每个都包含自己的Point对象的副本,而pen1和pen2引用了同一个Pen对象 。如果没有这个测试,我们怎么能够知道这个原理?
一种办法是去看一下对象是如何定义的(在Visual Studio中,你可以把光标放在对象的名字上,并按下F12键)
  public struct Point { … }     // defines a “value” type  public class Pen { … }        // defines a “reference” type
如上所示,在C#中,struct关键字是用来定义一个值类型,而class关键字是用来定义引用类型的。 对于那些有C++编程背景人来说,如果被C++和C#之间某些类似的关键字搞混,可能会对以上这种行为感到很吃惊。
如果你想要依赖的行为会因值类型和引用类型而异,举例来说,如果你想把一个对象作为参数传给一个方法,并在这个方法中修改这个对象的状态。你一定要确保你在处理正确的类型对象。
常见的错误#2:误会未初始化变量的默认值
在C#中,值得类型不能为空。根据定义,值的类型值,甚至初始化变量的值类型必须有一个值。这就是所谓的该类型的默认值。这通常会导致以下,意想不到的结果时,检查一个变量是否未初始化:
  class Program {      static Point point1;      static Pen pen1;      static void Main(string[] args) {          Console.WriteLine(pen1 == null);      // True          Console.WriteLine(point1 == null);    // False (huh?)      }  }
为什么不是【point 1】空?答案是,点是一个值类型,和默认值点(0,0)一样,没有空值。万博88未能认识到这是一个非常简单和常见的错误,在C#中
很多(但是不是全部)值类型有一个【IsEmpty】属性,你可以看看它等于默认值:
Console.WriteLine(point1.IsEmpty);        // True
当你检查一个变量是否已经初始化,确保你知道值未初始化是变量的类型,将会在默认情况下,不为空值。
阅读(682) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~