ref 和out 傳值異同

2022-03-16 09:57:50 字數 4861 閱讀 2935

ref關鍵字使引數按引用傳遞。其效果是,當控制權傳遞**用方法時,在方法中對引數所做的任何更改都將反映在該變數中。若要使用ref引數,則方法定義和呼叫方法都必須顯式使用ref關鍵字。例如:

class refexample

static void main()

}傳遞到ref引數的引數必須最先初始化。這與 out 不同,out 的引數在傳遞之前不需要顯式初始化。

示例

按引用傳遞值型別(如上所示)是有用的,但是ref對於傳遞引用型別也是很有用的。這允許被呼叫的方法修改該引用所引用的物件,因為引用本身是按引用來傳遞的。下面的示例顯示出當引用型別作為ref引數傳遞時,可以更改物件本身。

class refrefexample

static void main()

}out關鍵字會導致引數通過引用來傳遞。這與 ref 關鍵字類似,不同之處在於 ref 要求變數必須在傳遞之前進行初始化。若要使用out引數,方法定義和呼叫方法都必須顯式使用out關鍵字。例如:

class outexample

static void main()

}儘管作為out引數傳遞的變數不需要在傳遞之前進行初始化,但需要呼叫方法以便在方法返回之前賦值。

refout關鍵字在執行時的處理方式不同,但在編譯時的處理方式相同。因此,如果乙個方法採用ref引數,而另乙個方法採用out引數,則無法過載這兩個方法。例如,從編譯的角度來看,以下**中的兩個方法是完全相同的,因此將不會編譯以下**:

class cs0663_example

public void samplemethod(ref int i)

}但是,如果乙個方法採用refout引數,而另乙個方法不採用這兩類引數,則可以進行過載,如下所示:

class refoutoverloadexample

public void samplemethod(out int i)

}示例

當希望方法返回多個值時,宣告out方法很有用。使用out引數的方法仍然可以將變數用作返回型別,但它還可以將乙個或多個物件作為out引數返回給呼叫方法。此示例使用out在乙個方法呼叫中返回三個變數。請注意,第三個引數所賦的值為 null。這樣便允許方法有選擇地返回值。

class outreturnexample

static void main()

}ref 和 out 傳遞陣列

與所有的 out 引數一樣,在使用陣列型別的out引數前必須先為其賦值,即必須由被呼叫方為其賦值。例如:

static void testmethod1(out int arr)

與所有的 ref 引數一樣,陣列型別的ref引數必須由呼叫方明確賦值。因此不需要由接受方明確賦值。可以將陣列型別的ref引數更改為呼叫的結果。例如,可以為陣列賦以 null 值,或將其初始化為另乙個陣列。例如:

static void testmethod2(ref int arr)

下面的兩個示例說明outref在將陣列傳遞給方法時的用法差異。

示例1

在此例中,在呼叫方(main 方法)中宣告陣列 thearray,並在 fillarray 方法中初始化此陣列。然後將陣列元素返**用方並顯示。

class testout;}

static void main()}}

輸出1

array elements are:

1 2 3 4 5

示例2

在此例中,在呼叫方(main 方法)中初始化陣列 thearray,並通過使用ref引數將其傳遞給 fillarray 方法。在 fillarray 方法中更新某些陣列元素。然後將陣列元素返**用方並顯示。

class testref

// fill the array:

arr[0] = 1111;

arr[4] = 5555;

}static void main()

;// pass the array using ref:

fillarray(ref thearray);

// display the updated array:

system.console.writeline("array elements are:");

for (int i = 0; i < thearray.length; i++)}}

輸出2

array elements are:

1111 2 3 4 5555

ref關鍵字使引數按引用傳遞。其效果是,當控制權傳遞**用方法時,在方法中對引數所做的任何更改都將反映在該變數中。若要使用ref引數,則方法定義和呼叫方法都必須顯式使用ref關鍵字。例如:

class refexample

static void main()

}傳遞到ref引數的引數必須最先初始化。這與 out 不同,out 的引數在傳遞之前不需要顯式初始化。

示例

按引用傳遞值型別(如上所示)是有用的,但是ref對於傳遞引用型別也是很有用的。這允許被呼叫的方法修改該引用所引用的物件,因為引用本身是按引用來傳遞的。下面的示例顯示出當引用型別作為ref引數傳遞時,可以更改物件本身。

class refrefexample

static void main()

}out關鍵字會導致引數通過引用來傳遞。這與 ref 關鍵字類似,不同之處在於 ref 要求變數必須在傳遞之前進行初始化。若要使用out引數,方法定義和呼叫方法都必須顯式使用out關鍵字。例如:

class outexample

static void main()

}儘管作為out引數傳遞的變數不需要在傳遞之前進行初始化,但需要呼叫方法以便在方法返回之前賦值。

refout關鍵字在執行時的處理方式不同,但在編譯時的處理方式相同。因此,如果乙個方法採用ref引數,而另乙個方法採用out引數,則無法過載這兩個方法。例如,從編譯的角度來看,以下**中的兩個方法是完全相同的,因此將不會編譯以下**:

class cs0663_example

public void samplemethod(ref int i)

}但是,如果乙個方法採用refout引數,而另乙個方法不採用這兩類引數,則可以進行過載,如下所示:

class refoutoverloadexample

public void samplemethod(out int i)

}示例

當希望方法返回多個值時,宣告out方法很有用。使用out引數的方法仍然可以將變數用作返回型別,但它還可以將乙個或多個物件作為out引數返回給呼叫方法。此示例使用out在乙個方法呼叫中返回三個變數。請注意,第三個引數所賦的值為 null。這樣便允許方法有選擇地返回值。

class outreturnexample

static void main()

}ref 和 out 傳遞陣列

與所有的 out 引數一樣,在使用陣列型別的out引數前必須先為其賦值,即必須由被呼叫方為其賦值。例如:

static void testmethod1(out int arr)

與所有的 ref 引數一樣,陣列型別的ref引數必須由呼叫方明確賦值。因此不需要由接受方明確賦值。可以將陣列型別的ref引數更改為呼叫的結果。例如,可以為陣列賦以 null 值,或將其初始化為另乙個陣列。例如:

static void testmethod2(ref int arr)

下面的兩個示例說明outref在將陣列傳遞給方法時的用法差異。

示例1

在此例中,在呼叫方(main 方法)中宣告陣列 thearray,並在 fillarray 方法中初始化此陣列。然後將陣列元素返**用方並顯示。

class testout;}

static void main()}}

輸出1

array elements are:

1 2 3 4 5

示例2

在此例中,在呼叫方(main 方法)中初始化陣列 thearray,並通過使用ref引數將其傳遞給 fillarray 方法。在 fillarray 方法中更新某些陣列元素。然後將陣列元素返**用方並顯示。

class testref

// fill the array:

arr[0] = 1111;

arr[4] = 5555;

}static void main()

;// pass the array using ref:

fillarray(ref thearray);

// display the updated array:

system.console.writeline("array elements are:");

for (int i = 0; i < thearray.length; i++)}}

輸出2

array elements are:

1111 2 3 4 5555

ref傳值和out傳值

目錄 ref,out區別 out傳值 ref傳值 1.定義方法時,引數用out修飾,在呼叫該方法的時候,引數也需要用out修飾。2.在定義方法時,必須給引數賦初值。2.在呼叫該方法時,可以賦初值,也可以不賦初值。4.out這個單詞是 出去 的意思,所以引數加out就是將方法裡面賦的那個值傳到外面去了...

ref 和out傳參的不同

今天又遇到這個問題了,問了問同事,他說最近面試的時候,也問道他了,於是給我講了講,現在大概是記住了,記錄下來,以備自用。首先是看下面的code例子 string b bb public void a ref b string d public void c out d 方法a是引用參 數b但是 b必...

c 中傳值用的 ref 和out 好用哦!!

ref是傳遞引數的位址,out是返回值,兩者有一定的相同之處,不過也有不同點。使用ref前必須對變數賦值,out不用。out的函式會清空變數,即使變數已經賦值也不行,退出函式時所有out引用的變數都要賦值,ref引用的可以修改,也可以不修改。區別可以參看下面的 using system static...