上一次隨筆中提到有winform程式有兩個知識點挺重要點,第乙個是tryparse方法和parse方法區別,這一次來談談另乙個學習心得,就是c#中的關鍵字out與ref
view code
1以前也沒怎麼注意這兩個關鍵字,今天學到了它們,就必須把它們搞明白。發現visual c# 2008大學教程上有講這兩個關鍵字,我做了一下筆記希望對大家有用。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 }
我們先來看一下這兩個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方法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。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 }
第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...