程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 《Effective C#》之減少裝箱和拆箱(3)

《Effective C#》之減少裝箱和拆箱(3)

編輯:關於C語言
實,這樣操作會產生過多裝箱和拆箱操 作。那麼更好的方法,可以通過接口來完成,從而減少裝箱和拆箱操作。對於這 個例子的接口實現應該如下。

public interface IPersonName
{
 string Name{ get;set;}
}
public struct Person:IPersonName
{
 private string _Name;
 public string Name
 {
  get{ return _Name; }
  set{ _Name = value; }
 }
 public Person( string PersonName )
  {
  _Name = PersonName;
 }
 public override string ToString()
 {
  return _Name;
 }
}
// Using the person in a collection
ArrayList arrPersons = new ArrayList();
Person p = new Person( "OldName" );
arrPersons.Add( p );
// Change the name
( (IPersonName) arrPersons[0] ).Name = "NewName";
Debug.WriteLine( ( (Person ) arrPersons[0] ).Name );//It's "NewName"

很多人就問,為什麼值類型不能修改,即

( (Person ) arrPersons[0] ).Name = "NewName";//Can't be compiled

而如上的接口 類型就能修改呢,即

( (IPersonName)arrPersons[0] ).Name = "NewName";

這是由於產生的臨時變量的類型不同,前 者已經在前面進行說明了,後者由於產生的臨時變量的類型為IPersonName,屬 於引用類型,那麼相當於臨時變量就是原對象的引用,那麼對於對於它的修改會 直接修改到原對象,因此是可以的。可以說這裡的不同本身在於產生臨時對象的 類型不同,從而造成本質的區別。

通過接口來改寫,這樣就減少了裝箱 和拆箱操作,同時也保證了修改的正確性。不過要注意的是,這裡接口對於的是 引用類型,如果接口訪問的或者返回的是值類型,那麼用接口雖說能實現了,但 是對於裝箱和拆箱操作來說,並沒有減少。

對於裝箱和拆箱操作來說, 基本上就講完了,只要記住頻繁裝箱和拆箱操作會降低程序效率,因此在編寫的 時候要盡量避免。

返回教程目錄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved