《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; }
}
};
{
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;
}
好了,咱们编译一下,嗯?居然编不过?看提示,原来当我们定义了==的重载方法时,就必须相应的定义!=的重载方法:
{
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:
{
if (b1.Name == b2.Name)
return false;
else
return true;
}
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#到底了解有多少?{
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语言的课程都没有学过。我在大学的专业是土木工程,编程语言只学过Fortrun。数据结构,算法,编译原理,软件工程等我都不曾涉足,但凭借我半路出家的热情以及无限的兴趣,使我在应用那些编程语言时得心应手,VB,C++,C#都做过,项目也做过一些。在如何运用这些编程语言进行项目开发的问题上,我绝对不比一个计算机专业出来的学生差。但是,是不是就能丢掉这些基础的东西呢?答案是肯定的,不能。听说很多的编程牛人都不是计算机专业出生,这同时也极大的增加了我的信心,我要努力的把我漏下的基础的东西补上,从一个杂牌军走上正统军的道路。呵呵~所以,我的<<C#高级编程>>笔记系列由此而来,希望以后大家多多支持!:)
微信扫一扫交流
作者:CoderZh
公众号:hacker-thinking (一个程序员的思考)
独立博客:http://blog.coderzh.com
博客园博客将不再更新,请关注我的「微信公众号」或「独立博客」。
作为一个程序员,思考程序的每一行代码,思考生活的每一个细节,思考人生的每一种可能。
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。