《C#進階編程》筆記系列第一彈-開篇

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.