Effective C#原則6:區別實值型別資料和參考型別資料

來源:互聯網
上載者:User

實值型別資料還是參考型別資料?結構還是類?什麼你須要使用它們呢?這不 是C++,你可以把所有類型都定義為實值型別,並為它們做一個引用。這也不是 Java,所有的類型都是實值型別。你在建立每個類型執行個體時,你必須決定它們以什 麼樣的形式存在。這是一個為了取得正確結果,必須在一開始就要面對的重要決 定。(一但做也決定)你就必須一直面對這個決定給你帶來的後果,因為想在後 面再對它進行改動,你就不得不在很多細小的地方強行添加很多代碼。當你設計 一個類型時,選擇struct或者class是件簡單的小事情,但是,一但你的類型發 生了改變,對所有使用了該類型的使用者進行更新卻要付出(比設計時)多得多的工 作。

這不是一個簡單的非此及彼的選擇。正確的選擇取決於你希望你的 新類型該如何使用。實值型別不具備多態性,但它們在你的應用程式對資料的存取 卻是效能有佳;參考型別可以有多態性,並且你還可以在你的應用程式中為它們 定義一些表現行為。考慮你期望給你的類型設計什麼樣的職能,並根據這些職能 來決定設計什麼樣的類型。結構儲存資料,而類表現行為。

因為很多的 常見問題在C++以及Javaj裡存在,因此.Net和C#對實值型別和參考型別的做了區分 。在C++裡,所有的參數和傳回值都是以實值型別的進行傳遞的。以實值型別進行傳 遞是件很有效率的事,但不得不承受這樣的問題:對象的淺拷貝(partial copying)(有時也稱為slicing object)。如果你對一個派生的對象COPY資料時, 是以基類的形式進行COPY的,那麼只有基類的部分資料進行了COPY。你就直接丟 失了派生對象的所有資訊。即使時使用基類的虛函數。

而Java語言呢, 在放棄了實值型別資料後,或多或少有些表現吧。Javs裡,所有的使用者定義型別都 是參考型別,所有的參數及返回資料都是以參考型別進行傳遞的。這一策略在( 資料)一致性上有它的優勢,但在效能上卻有缺陷。讓我們面對這樣的情況,有 些類型不是多態性的--它們並不須要。Java的程式員們為所有的變數準備了一個 記憶體堆分配器和一個最終的記憶體回收行程。他們還須要為每個引用變數的訪問花上 額外的時間,因為所有的變數都是參考型別。在C#裡,你或者用struct聲明一個 實值型別資料,或者用class聲明一個參考型別資料。實值型別資料應該比較小,是 輕量級的。參考型別是從你的類繼承來的。這一節將練慣用不同的方法來使用一 個資料類型,以便你給掌握實值型別資料和參考型別資料之間的區別。

我 們開始了,這有一個從一個方法上返回的類型:

private MyData _myData;
public MyData Foo()
{
return _myData;
}
// call it:
MyData v = Foo();
TotalSum += v.Value;

如果MyData是一個實值型別,那麼回返值會被COPY到V中 存起來。而且v是在棧記憶體上的。然而,如果MyData是一個參考型別,你就已經 把一個引用匯入到了一個內部變數上。同時,

你也違犯了封裝原則(見原 則23)。

或者,考慮這個變數:

private MyData _myData;
public MyData Foo()
{
return _myData.Clone( ) as MyData;
}
// call it:
MyData v = Foo();
TotalSum += v.Value;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.