C 中的ref與out關鍵字

2022-08-30 13:42:19 字數 3625 閱讀 1083

上一次隨筆中提到有winform程式有兩個知識點挺重要點,第乙個是tryparse方法和parse方法區別,這一次來談談另乙個學習心得,就是c#中的關鍵字out與ref

view code

1

using system;

2using system.collections.generic;

3using system.componentmodel;

4using system.data;

5using system.drawing;

6using system.linq;

7using system.text;

8using system.windows.forms;910

namespace windowsformstest

11 18

19private

void btncompute_click(object sender, eventargs e)

20

30if (int.tryparse(secondnum, out i2) == false)

31

3536

int result = i1 + i2;

37 txtresult.text = convert.tostring(result);

38 }

39 }

40 }

以前也沒怎麼注意這兩個關鍵字,今天學到了它們,就必須把它們搞明白。發現visual c# 2008大學教程上有講這兩個關鍵字,我做了一下筆記希望對大家有用。

我們先來看一下這兩個keyword的說明。

許多程式語言中呼叫函式的兩種方法是按值呼叫(call-by-value)和按引用呼叫(call-by-reference)。引數按值呼叫(c#預設)傳遞時,生成引數值副本並傳給被呼叫函式。副本的改變並不影響呼叫者的原始變數值,這樣就可以防止意外的***影響開發正確、可靠的軟體系統。按引用呼叫時、呼叫者讓被呼叫函式能夠直接訪問呼叫者的資料,並允許被呼叫函式能夠修改其中的資料。按引用呼叫的安全性較差,因為被呼叫函式能夠直接訪問和修改呼叫者的資料。

如果要按引用傳遞乙個變數,使被調方法可以修改變數值,該怎麼辦呢?為此,c#提供了關鍵字ref與out。引數宣告中使用關鍵字ref可以按引用將變數傳遞給方法-被調方法可以修改呼叫者的原變數。ref關鍵字用於呼叫方法中已經初始化的變數。通常,呼叫方法包含未初始化變數變元時,編譯器產生乙個錯誤。在引數前面加上關鍵字out可以建立輸出引數,告訴編譯器這個變元按引用傳入被調方法,被呼叫方法對呼叫者的原變數賦值。如果方法中沒有在每個執行路徑上對輸出引數賦值,則編譯器產生乙個錯誤。這樣就使編譯器不會對傳入方法的未初始化變數變元產生錯誤訊息。乙個方法只能通過return語句向呼叫者返回乙個值,但指定多個輸出引數(ref或out)可以返回多個值。

也可以按引用傳遞引用型變數,從而修改傳遞的引用型變數,使用引用新物件。按引用傳遞引用句是個複雜的技術。

下面的例子用關鍵字ref與out操縱整數值。refandoutkeyword類包含三個方法,計算整數的平方。方法squareref將引數x自乘,將新值賦予x。squareref方法的引數x宣告為ref int,表示傳入這個方法的變元應為按引用傳遞的整數。由於變元按引用傳遞,因此第39行賦值時修改呼叫者的原變元值。

squareout方法將引數賦值為6,然後求這個值的平方。squareout的引數宣告為out int,表示傳入這個方法的變元應為按引用傳遞的整數,變元不必事先初始化。

square方法將引數x自乘,將新值賦予x。呼叫這個方法時,變元的副本傳入引數x。這樣,即使方法中修改引數x,呼叫者的原值也不會修改。

1

using system;

2using system.collections.generic;

3using system.linq;

4using system.text;56

class program

9

16 }

17class refandoutkeyword

18

", y);

26 console.writeline("

z的原始值是:未初始化\n

");27

28//

傳遞y和z的引用

29 squareref(ref y);//

這裡必須使用關鍵字ref

30 squareout(out z);//

這裡必須使用關鍵字out

3132

//y和z的值分別被方法squareref、squareout修改之後顯示y和z的值

33 console.writeline("

呼叫方法squareref之後y的值是:

", y);

34 console.writeline("

呼叫方法squareout之後z的值是:\n

", z);

3536

//傳遞y和z的副本

37 square(y);

38 square(z);

3940

//當將y和z的副本被函式square呼叫之用顯示它們的值並沒有被修改

41 console.writeline("

呼叫方法square之後y的值是:

", y);

42 console.writeline("

呼叫方法square之後z的值是:\n

", z);

4344 }

4546

private

void square(int x)

47

5051

private

void squareout(out

int x)

52

5657

private

void squareref(ref

int x)

58

6162

63 }

64 }

方法demonstraterefandoutkeyword(第19-44行)呼叫squareref、squareout與square方法,這個方法首先將變數y初始化為5,宣告但不初始化變數z。第29-30行呼叫squareref和squareout方法,注意變數傳入帶引用引數的方法時,變元前面要加上宣告引用引數時所用的關鍵字(ref或out)。第33-34行顯示呼叫squareref和squareout方法之後的y值和z值。注意y變成25,z設定成36。

第37-38行用y、z變元呼叫square方法。這裡,兩個變元都按值傳遞---只將其數值副本傳入square方法,結果,y、z值仍然保持25和36。第41-42行輸出y、z值,顯示其沒有修改。

注意:方法呼叫中的out與int變元要與方法宣告中指定的引數相符,否則會發生編譯錯誤。

程式執行結果:

ref 關鍵字out關鍵字

using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace outandref ref修飾方法的引數,在呼叫的時候必須...

C 中ref與out 關鍵字的區別

首先,我們都知道,ref和out關鍵字生命的引數都是傳址的,那麼二者有區別嗎?使用ref關鍵字時,引數必須先初始化,而out關鍵字則不需要,out關鍵在宣告的關鍵字,在函式中必須被初始化,用 來說明.public void use int t 100 int k refmethod ref t 注意...

c 中關鍵字ref與out的區別

一 關鍵字ref的使用 static void main string args private static void change string temp private static void changebyref ref string temp 輸出結果 aa refchanged 在ch...