每天進步一點點

對關鍵字ref out 在剛開始接觸c#的時候總是用混
1.ref out
在C# 中,既可以通過值也可以通過引用傳遞參數。通過引用傳遞參數允許函數成員更改參數的值,並保持該更改。若要通過引用傳遞參數, 可使用ref或out關鍵字。ref和out這兩個關鍵字都能夠提供相似的功效,其作用也很像C中的指針變量。它們的區別是:

1、使用ref型參數時,傳入的參數必須先被初始化。對out而言,必須在方法中對其完成初始化。

2、使用ref和out時,在方法的參數和執行方法時,都要加Ref或Out關鍵字。以滿足匹配。

3、out適合用在需要retrun多個返回值的地方,而ref則用在需要被調用的方法修改調用者的引用的時候。

注:在C#中,方法的參數傳遞有四種類型:傳值(by value),傳址(by reference),輸出參數(by output),數組參數(by array)。傳值參數無需額外的修飾符,傳址參數需要修飾符ref,輸出參數需要修飾符out,數組參數需要修飾符params。傳值參數在方法調用過程中如果改變了參數的值,那麼傳入方法的參數在方法調用完成以後並不因此而改變,而是保留原來傳入時的值。傳址參數恰恰相反,如果方法調用過程改變了參數的值,那麼傳入方法的參數在調用完成以後也隨之改變。實際上從名稱上我們可以清楚地看出兩者的含義--傳值參數傳遞的是調用參數的一份拷貝,而傳址參數傳遞的是調用參數的內存地址,該參數在方法內外指向的是同一個存儲位置。

轉自:http://blog.donews.com/chouchy/archive/2006/08/16/1002083.aspx
上面是我看過的比較清楚的解釋
第三條體會不深,覺得界限也沒有很明顯,可能是好的編程習慣使然吧
還有一條要解釋一下的
就是 他說的數組參數
其實數組本身就是傳值型的
params的用法是 傳多參數
例如:
public static void UseParams2(params object[] list)
 
UseParams2(1, 'a', "test");
 
 
2.今天還用到了const,於是就想爲什麼不用readonly
 
  • readonlyconst都是用來標識常量的[1]
  • const可用於修飾class的field或者一個局部變量(local variable);而readonly僅僅用於修飾class的field。
  • const常量的值必定在編譯時就已明確並且恆定的;而readonly常量卻有一點不同,那就是其值可以在運行時編譯,當然,它也必須遵守作爲常量的約束,那就是值必須恆定不變。
  • const常量必須在聲明的同時對其進行賦值,並且確保該值在編譯時可確定並恆定;而readonly常量則可以根據情況選擇在聲明的同時對其賦予一個編譯時確定並恆定的值,或者將其值的初始化工作交給實例構造函數(instant constructor)完成。如:public readonly string m_Now = DateTime.Now.ToString();,m_Now會隨着運行時實際情況變化而變化。
  • const常量屬於類級別(class level)而不是實例對象級別(instant object level),並且它不能跟static結合一起使用,該常量的值將由整個類的所有實例對象共同分享(詳細論述參見後面的Remark區域)。
  • readonly常量既可以是類級別也可以是實例對象級別的,這取決於它的聲明以及初始化工作怎麼實施。readonly可以與static結合使用,用於指定該常量屬於類級別,並且把初始化工作交由靜態構造函數(static constructor)完成(有關如何把readonly常量聲明爲類級別或實例對象級別的論述清參見後面的Remark區域)
  • 能被const修飾聲明爲常量的類型必須是以下的基元類型(primitive type):sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, float, bool, decimal, string
  • object, 數組(Array)和結構(struct)不能被聲明爲const常量。
  • 一般情況下,引用類型是不能被聲明爲const常量的,不過有一個例外:string。該引用類型const常量的值可以有兩種情況,stringnull。其實,string雖然是引用類型,但是.NET卻對它特別處理,這種處理叫做字符串恆定性(immutable),使得string的值具有隻讀特性。有關字符串恆定性的內容,可以參考《Microsoft .NET框架程序設計(修訂版)》
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章