未用ref或out修飾符宣告的引數為值引數。
使用值引數,通過將實參的值複製到形參的方式,把資料傳遞到方法。方法被呼叫時,系統做如下操作。
值引數的實參不一定是變數。它可以是任何能計算成相應資料型別的表示式。
看乙個例子:
float func1(float val) //宣告方法下面來呼叫方法
float fvalue1=func1(k); //實參是float型別的變數float fvalue2=func1((k+j)/3); //實參可以計算成float表示式
在把變數作用於實參之前,變數必須賦值(除非是out引數)。對於引用型別,變數可以被設定為乙個實際的引用或null。下面的**展示了乙個名為mymethod的方法,它有兩個引數,乙個是myclass型變數和乙個int。
1我們用圖來表示實參和形參在方法執行的不同階段的值。class
myclass25
class
program
6, f2:
", f1.val, f2);13}
14static
void main(string
args)
15, f2:
", a1.val, a2);22}
23 }
使用引用引數時,必須在方法的申明和呼叫中都使用關鍵字ref修飾符。
實參必須是變數,在用作實參前必須被賦值。如果是引用型別的變數,可以賦值為乙個引用或者null值。
下面的**闡明了引用引數的宣告和呼叫的語法:
void mymethod(refint val) //
方法宣告包含ref修飾符
int y = 1在第一小節的內容中我們知道,對於值引數,系統在棧上為形參分配記憶體,相反對於引用引數:; mymethod(
ref y); //
方法呼叫
mymethod(
ref3+5); //
錯誤,形參必須是變數
由於形參名和實參名的行為,就好象指向相同的記憶體位置,所以在方法的執行過程中,對形參作的任何改變,在方法完成後依然有效(表現在實參變數上)。
在方法的宣告和呼叫上都使用關鍵字ref.下面的**再次展示了方法mymethod,但這一次引數是引用引數而不是值引數。
1同樣,還是用圖來闡明方法執行的不同階段實參和形參的值。class
myclass25
class
program
6, f2:
", f1.val, f2);13}
14static
void main(string
args)
15, f2:
", a1.val, a2);
2223
}24 }
對於乙個引用型別物件,不管是將其作為值引數傳遞還是作為引用引數傳遞,我們都可以在方法成員內部修改它的成員。不過,我們並沒有在方法內部設定形參本身。
下面我們就來看看在方法內部設定形參本身時會發生什麼。
1這段**的輸出如下:class
myclass25
class
program6"
, f1.val);
12 f1 = new
myclass();
13 console.writeline("
after new object creation:
", f1.val);14}
15static
void main(string
args)16"
, a1.val);
20refasparameter(a1);
21 console.writeline("
after method call:
", a1.val);22}
23 }
before method call: 20同樣,還是用圖來闡明以下幾點。after member assignment:
50after
newobject creation: 20
after method call:
50
除了在方法宣告和方法呼叫時使用ref關鍵字之外,與上面的**完全一樣。
1這段**的輸出如下:class
myclass25
class
program6"
, f1.val);
12 f1 = new
myclass();
13 console.writeline("
after new object creation:
", f1.val);14}
15static
void main(string
args)16"
, a1.val);
20 refasparameter(ref
a1);
21 console.writeline("
after method call:
", a1.val);22}
23 }
before method call: 20我們開始說過,引用引數的行為就是將實參作為形參的別名。after member assignment:
50after
newobject creation: 20
after method call:
20
這些都是老生常談的問題,為什麼還要寫?
一是因為今天看書看到了與此相關的內容,回去翻了翻書,然後記錄下來
二是供自己以後查閱,畢竟看部落格比翻書來的快。
最後,祝大家週末愉快,玩的開心。
C 值引數 引用引數和輸出引數
一 值引數 在使用引數時,是把乙個值傳遞給函式使用的乙個變數。對函式中此變數的任何修改都不會影響函式呼叫中指定的引數。由於函式只有乙個返回值,不能用作引數的多個變數值 二 引用引數 即函式處理的變數與函式呼叫中使用的變數相同,而不僅僅是值相同的變數。因此,對這個變數的任何改變都會影響用作引數的變數值...
C 方法引數 值引數,引用引數,輸出引數
使用值引數,通過複製實參的值到形參的方式,把資料傳遞到方法,方法被呼叫的時候,系統做如下操作 在棧中為形參分配空間 複製實參到形參。注意 乙個值引數的實參不一定是變數,它可以是任何能夠計算成相應資料型別的表示式。在把變數用作實參之前,變數必須被賦值 除非是輸出引數,這個稍後介紹 對於引用型別,變數可...
形參,實參,值引數,引用引數
using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace deledemo class program static...