《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#高级编程>>笔记系列由此而来,希望以后大家多多支持!:)
原文地址:https://www.cnblogs.com/coderzh/p/902626.html