雖然以前做過的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#進階編程>>筆記系列由此而來,希望以後大家多多支援!:)