当前位置:首页 > Windows程序 > 正文

C# 程序员最常犯的 10 个错误

2021-03-25 Windows程序

C#是达成微软公共语言运行库(CLR)的少数语言中的一种。达成CLR的语言可以受益于其带来的特性,如跨语言集成、异常处理、安全性增强、部件组合的简易模型以及调试和分析服务。作为现代的CLR语言,C#是应用最为广泛的,其应用场景针对Windows桌面、移动手机以及服务器环境等复杂、专业的开发项目。

C#是种面向对象的强类型语言。C#在编译和运行时都有的强类型检查,使在大多数典型的编程错误能够被尽早地发现,而且位置定位相当精准。相比于那些不拘泥类型,在违规操作很久后才报出可追踪到莫名其妙错误的语言,这可以为程序员节省很多时间。然而,许多程序员有意或无意地抛弃了这个检测的有点,这导致本文中讨论的一些问题。

 

关于本文

本文描述了10个 C# 程序员常犯的错误,或应该避免的陷阱。

尽管本文讨论的大多数错误是针对 C# 的,有些错误与其他以 CLR 为目标的语言,或者用到了 Framework Class Library (FCL) 的语言也相关。

技术分享

常见错误 #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)一样,没有空值。未能认识到这是一个非常简单和常见的错误,在C#中

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67142.html