C 的引數型別 params out和ref

2022-04-02 11:41:28 字數 1719 閱讀 2735

首先回顧一下c#宣告乙個方法的語法和各項元素,代表可選 

[訪問修飾符] 返回值 方法名([引數型別] 資料型別 引數名) 

這篇文章主要是為了講解 參數列裡面的可選項[引數型別],這個引數型別的設定會影響到我們對引數施加操作後的結果或影響我們對方法的呼叫方式。 

c#之中引數型別分為4種: 

無:預設的,普通引數

params:不定長引數 

out:輸出變數 

ref:引用傳遞 

普通引數,當引數是值型別時傳值,當引數為引用型別時傳址,這個由於各類c#的書都一定會講,此處略過。

params型別的引數搭配陣列使用,實現乙個不定長的陣列引數 

最常用的應該是console.writeline,其中有乙個過載如下: 

public static void writeline(string formatstring, params object values); 

常見的呼叫方式:console.writeline("寬:,高:",this.width,this.height); 

前面的"寬:,高:"被裝入formatstring 

this.width,this.height被裝入values[0]和values[1]之中,如果我們再加幾個引數上去,那將按下標繼續存入陣列中 

out型別的引數做為輸出引數使用,用於乙個方法返回多個值型別的變數,一般對值型別使用。

定義方法: 

void test(out int v1,out float v2) 

呼叫方法: 

int a; 

float b; 

test(out a,out b); 

基本上和sql server的output引數一樣 

ref型別的引數是指在將乙個變數做為乙個引數傳遞給某個方法的時候,使用引用傳遞。

如果變數是值型別的話,ref和out起的效果是一樣,只是ref引數在使用前必須先賦值,而out不用。 

定義方法: 

void test(ref int v1,ref float v2) 

呼叫方法: 

int a = 0; 

float b = 0; 

test(ref a,ref b); 

---------------------無敵分隔線--------------------- 

ref比較容易混淆的地方在於如果引數是引用型別的變數時,處理的結果與直接傳乙個引用型別變數有什麼區別?

測試類: 

public class class1 

定義方法: 

private void test(class1 c) 

private void test(ref class1 c) 

呼叫方法: 

class1 a = new class1(); 

test(a); 

console.writeline("x:,y:",a.x,a.y); 

class1 b = new class1(); 

test(ref b); 

console.writeline("x:,y:",b.x,b.y); 

輸出結果: 

x:10,y:10 

x:0,y:5 

通過輸出結果我們可以看到使不使用ref的區別 

用ref的話,c可以更改指向,從而放棄它原來所引用的那塊記憶體空間 

如果不用的話,只能改c記憶體空間中的資料,不可以更改指向。

C 的引數型別 params out和ref

首先回顧一下c 宣告乙個方法的語法和各項元素,代表可選 訪問修飾符 返回值 方法名 引數型別 資料型別 引數名 這篇文章主要是為了講解 參數列裡面的可選項 引數型別 這個引數型別的設定會影響到我們對引數施加操作後的結果或影響我們對方法的呼叫方式。c 之中引數型別分為4種 無 預設的,普通引數 par...

c 引數型別

1 值引數 using system using system.collections.generic using system.linq using system.text namespace refout static void ff int a 輸出 4 3 2 引用引數 關鍵字 ref 作用...

c 函式的引數型別

引數型別主要包括兩種 一 值型別 在使用值型別引數時,是把乙個值傳遞給函式使用的乙個變數。對函式中此變數的任何修改都不影響函式呼叫中指定的引數 二 引用型別 可以影響引數,引用型別的作用還是比較大。會在以後的實戰專案中經常碰到,暫不多說,下面只給乙個關於引用型別的例子 其中ref和out的區別在於o...