C 框架閱讀筆記 引用引數ref和out區別

2021-06-01 18:09:39 字數 1364 閱讀 4115

引用引數ref和out區別

這兩個關鍵字的區別在於那個方法負責初始化引用物件,如果方法的引數標記為out,

那麼呼叫者不希望在呼叫方法之前初始化物件,被呼叫的方法不能讀取物件的值,而且被

呼叫的方法必須在返回之前為物件賦值。如果方法的引數標記為ref,那麼呼叫者必須在

呼叫方法之前首先初始化引數的值,被呼叫的方法可以讀取引數或者為引數賦值。

例2:using system;

using system.io;

public sealed class program

}private static void processfiles(ref fs)

if(nomorefilestoprocess)

else }}

例3:如何利用ref關鍵字實現乙個用於交換兩個引用型別的方法:

public static void swap(ref object a, ref object b)

為了交換兩個string物件的引用,看一下錯誤的**:

public static void somemethod()

但是,上述**無法通過編譯。問題在於按引用傳遞給方法的變數的型別必須與方法簽名中

宣告型別相同,換句話說,swep希望有兩個object引用,而不是兩個string應用。為了交換string

引用,需要向下面這樣的**:

public static void somemethod()

這個版本的somemethod可以通過編譯, 並且如預期的一樣執行。傳遞的引數必須與方法期望的引數相匹配,旨在確保型別安全

下面的**(訊號不會進行編譯),顯示了型別安全吃如何進行折中的:

internal sealed class sometype

public sealed class program

private static void getanobject(out object o)

}前面**中,main顯然希望getanobject方法返回乙個sometype物件。但是,因為getanobject的簡明表示的是乙個object引用,

所以getanobject可以將o初始化某個型別的物件。在這個範例中,當getanobject返回main時,st將引用string物件,這明顯不是sometype物件,

因此對console.writeline的呼叫肯定會失敗。幸虧c#編譯器無法編譯前面的**,因為st是對sometypd

物件的引用,而getanobject要求的是object物件引用。

可以用泛型(getneric)來修正這些方法,以便他們按照期望的方式執行,下面是前面示範的swap方法的修正:

public static void swap(ref t a, ref t b)

C 的out引數和ref引數

剛學c 的時候看過out引數和ref引數的用法,但是一直沒有根據實際專案做過。今天寫webservice介面的時候用到了 本來我是寫乙個方法查詢乙個資料庫,返回乙個dataset給別人呼叫,沒問題,完成了 我的上篇部落格寫有 但是專案總是變化 的,有人要求同時將dataset的總記錄條數也返回給他們...

ref和out 傳遞引數 C

1.引數傳遞預設都是傳遞棧空間裡面儲存的內容 2.如果新增了ref那麼傳遞的都是棧空間位址,而不再是棧空間裡面的內容 3.如果新增了out,那麼傳遞的也是棧空間的位址 1 寫乙個方法計算乙個int型別陣列中每個元素的總和以及最大值和最小值 2 3 4 5 6 7static void gatvalu...

C 學習筆記 引用引數

值型別 引用型別 方法外部的變數當前引用的物件的hashcode和name屬性的值 console.writeline iwantsideeffect ref outterstu 方法體裡列印出來的hashcode和name屬性的值 console.writeline hashcode name o...