《C#高级编程》笔记系列第一弹-开篇

    虽然以前做过的C#项目也不少了,做过ASP.NET的BS架构的,也做过Winform的CS架构。有一天一位同事给我们看了下面的一个简单的Demo:

    public class MainTest     {         static void Main(string[] agrs)         {             Book book1 = new Book();//定义了一本书book1             Book book2 = new Book();//定义了一本书book2             book1.Name = "C#高级编程";//book1的名字叫C#高级编程             book2.Name = "C#高级编程";//book2的名字也叫C#高级编程             Console.WriteLine(book1 == book2);//问boo1和book2是否为同一本书?         }     };     class Book     {         private string name = string.Empty;         public string Name         {             get { return name; }             set { name = value; }         }     };

    上面的输出结果会是什么呢?有人说两本书都是<<C#高级编程>>啊,所以是同一个本书啦。其他人又有意见了,虽然名字相同,也不一定是同一本啊,我手里的和你手里的就不一样啊。其实这是一个很简单的道理,就是关于值类型和引用类型的概念问题。类属于引用类型,当我们new了不同的书时,已经在内存中不同的地方创建了Book对象,当我们比较两本书时,只是拿两本书的引用地址来比较,这和C++的指针地址原理是一样的,所以上面的比较结果会是FALSE。

    有人又有意见了,明明就是相同名字的书,为什么说他们不相等。对,你的想法是没有错误,往往我们在实际做项目时需要有这样的需求,即通过两本书的名字相同就认为是同一本书,那我们应该怎样来实现,让上面的运行结果为TRUE呢?这时候我们想到了运用操作符重载,因此,我们在Book类中添加下面的方法:

public static bool operator ==(Book b1,Book b2)

{

    if (b1.Name == b2.Name)

        return true;

    else

        return false;

}

    好了,咱们编译一下,嗯?居然编不过?看提示,原来当我们定义了==的重载方法时,就必须相应的定义!=的重载方法:
public static bool operator !=(Book b1, Book b2)

{

    if (b1.Name == b2.Name)

        return false;

    else

        return true;

}

    OK,编译,运行,结果为TRUE。其实这是一个非常简单的问题,而常常有人在使用的时候误以为两个类的属性相等时值也相等,由于这个小小的概念的问题,也许会造成非常严重的后果。这都是关于值类型和引用类型的理解误差。再来看下面一个Demo:
static void Main(string[] agrs)

{

    Book book1 = new Book();//定义了一本书book1

    Book book2 = new Book();//定义了一本书book2

    book1.Name = C#高级编程;//book1的名字叫C#高级编程

    book1 = book2;//将两本书认为是相同的一本书

    book2.Name = C#入门经典;//由于某些原因book2名字改了

    Console.WriteLine(book1.Name);//问boo1还是原来的那本C#高级编程吗?

}

    其实答案不需要我来解释了。我费了很大的劲去说明一个很简单的引用类型的问题,很多牛人也有意见了。嗯,其实我想要表达的是,即便我们能够很熟练的使用C#一门语言,可以用它来开发很多的项目,但我们同时也不能丢掉了一些非常基础的东西,当我们熟练的去开发过了N多的项目,我们有没有扪心自问一下,我们对C#到底了解有多少?

    我并非计算机专业的学生,也没有学习过计算机专业的任何课程,甚至连C语言的课程都没有学过。我在大学的专业是土木工程,编程语言只学过Fortrun。数据结构,算法,编译原理,软件工程等我都不曾涉足,但凭借我半路出家的热情以及无限的兴趣,使我在应用那些编程语言时得心应手,VB,C++,C#都做过,项目也做过一些。在如何运用这些编程语言进行项目开发的问题上,我绝对不比一个计算机专业出来的学生差。但是,是不是就能丢掉这些基础的东西呢?答案是肯定的,不能。听说很多的编程牛人都不是计算机专业出生,这同时也极大的增加了我的信心,我要努力的把我漏下的基础的东西补上,从一个杂牌军走上正统军的道路。呵呵~所以,我的<<C#高级编程>>笔记系列由此而来,希望以后大家多多支持!:)

[温馨提示]:该文章由原博客园导入而来,如排版效果不佳,请移步:http://www.cnblogs.com/coderzh/archive/2007/09/22/902626.html

微信扫一扫交流

作者:CoderZh
微信关注:hacker-thinking (一个程序员的思考)
本文出处:https://blog.coderzh.com/2007/09/22/902626/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。