C#學習筆記三:類初步相關知識要點(1) (轉)

worldblog發表於2008-01-22
C#學習筆記三:類初步相關知識要點(1) (轉)[@more@]

:namespace prefix = o ns = "urn:schemas--com::office" />

附加說明:寫關於class之類的東西是最枯燥的,本文只是保證筆記的完整性,如果你已經很熟悉,就無需浪費時間。

常量欄位與靜態欄位的比較:

常量欄位(const)的值是在編譯時設定的,只讀欄位(readonly)是在執行時設定的。

只讀欄位加上static可以無需對類進行例項化從而直接引用。

const 和static readonly均可直接引用,那麼其區別在哪裡呢?請看一個理解兩者關係的經典的msdn的例子:

using System;

namespace Program1

{

  public class Utils

  {

  public static readonly int X = 1;

  }

}

namespace Program2

{

  class Test

  {

  static void Main() {

  Console.WriteLine(Program1.Utils.X);

  }

  }

}

Program1 和 Program2 名稱空間表示兩個單獨編譯的。由於 Program1.Utils.X 宣告為靜態只讀欄位,因此 Console.WriteLine 語句要輸出的值在編譯時是未知的,直到在執行時才能獲取。這樣,如果更改 X 的值並重新編譯 Program1,則即使 Program2 未被重新編譯,Console.WriteLine 語句也將輸出新值。但是,假如 X 是常數,X 的值將在編譯 Program2 時獲取,並且在重新編譯 Program2 之前不會受到 Program1 中的更改的影響。

我相信,上面解釋得很清楚了。但當我們同時可以用以上兩種方法初始化欄位時,我們希望知道兩種方法的問題。剛開始我們曾經說過,常量是編譯時設定的,也就是形成硬編碼保持在PE(或DLL)中,而只讀靜態欄位是在執行時設定的,也就是說,當有大量值需要設定的時候,常量欄位更有優勢。當然,同上篇討論裝箱和拆箱一樣,對效能的影響是比較小的。

方法引數:關於值傳遞(by value)和引用傳遞(by reference)的討論

一、首先我們討論最簡單的情形(by value 不使用ref和out關鍵字的情形)。

1.值傳遞值型別的方法引數,是將值的一個副本傳遞給方法,不影響傳遞的變數。

2.引用傳遞的是引用的一個副本(對相同資料的另一個引用,這裡我們幾乎可以把它看作C++裡面的“指標”),因此,此時對引數的修改就是對原始資料進行的。關於2,一個簡單的例子增強我們感性認識。

class AnotherClass

{

  public int ID;

}

class SomeClass

{

  public AnotherClass Change(AnotherClass ref1)

  {

  ref1.ID = ref1.ID*2;

  return ref1;

  }

}

當我們以下方法時:ref1.ID和ref2ID均為6。

notherClass ref1 = new AnotherClass();

ref1.ID = 3;

AnotherClass ref2 = sc.ChangeObject(ref1);

二、透過引用(by reference)傳遞值型別(value type):

ref方法引數:可以改變值,呼叫方法前必須初始化變數,在方法中無需對引數進行設定(賦值)。

out方法引數:可以改變值,呼叫方法前不需初始化變數,在方法中必須對傳遞的引數進行設定(賦值)。

三、透過引用(by reference)傳遞引用型別(reference type):

out引數同上一樣必須在方法中設定(賦值)。

其餘和透過值傳遞引用型別(以上討論的情形一)一樣。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998149/,如需轉載,請註明出處,否則將追究法律責任。

相關文章