全面分析C#方法中的ref和out
關於C#方法中的REF和OUT大家應該並不陌生吧,今天和大家一起來探討它們的使用。
ref
通常我們向方法中傳遞的是值.方法獲得的是這些值的一個拷貝,然後使用這些拷貝,當方法執行完畢後,這些拷貝將被丟棄,而原來的值不將受到影響.此外我們還有其他向方法傳遞引數的形式,引用(ref)和輸出(out).
有時,我們需要改變原來變數中的值,這時,我們可以向方法傳遞變數的引用,而不是變數的值.引用是一個變數,他可以訪問原來變數的值,修改引用將修改原來變數的值.變數的值儲存在記憶體中,可以建立一個引用,他指向變數在記憶體中的位置.當引用被修改時,修改的是記憶體中的值,因此變數的值可以將被修改.當我們呼叫一個含有引用引數的方法時,方法中的引數將指向被傳遞給方法的相應變數,因此,我們會明白,為什麼當修改引數變數的修改也將導致原來變數的值.
建立引數按引用傳遞的方法,需使用關鍵字ref.例;
using System;
class gump
{
public double square(ref double x)
{
x=x*x;
return x;
}
}
class TestApp
{
public static void Main()
{
gump doit=new gump();
double a=3;
double b=0;
Console.WriteLine(\"Before square->a={0},b={1}\",a,b);
b=doit.square(ref a);
Console.WriteLine(\"After square->a={0},b={1}\",a,b);
}
}
通過測試,我們發現,a的值已經被修改為9了.
out
通過指定返回型別,可以從方法返回一個值,有時候(也許還沒遇到,但是我們應該有這麼個方法),需要返回多個值,雖然我們可以使用ref來完成,但是C#專門提供了一個屬性型別,關鍵字為out.介紹完後,我們將說明ref和out的區別.
using System;
class gump
{
public void math_routines(double x,out double half,out double squared,out double cubed)
//可以是:public void math_routines(//ref double x,out double half,out double squared,out double cubed)
//但是,不可以這樣:public void math_routines(out double x,out double half,out double squared,out double cubed),對本例來說,因為輸出的值要靠x賦值,所以x不能再為輸出值
{
half=x/2;
squared=x*x;
cubed=x*x*x;
}
}
class TestApp
{
public static void Main()
{
gump doit=new gump();
double x1=600;
double half1=0;
double squared1=0;
double cubed1=0;
[Page]
/*
double x1=600;
double half1;
double squared1;
double cubed1;
*/
Console.WriteLine(\"Before method->x1={0}\",x1);
Console.WriteLine(\"half1={0}\",half1); Console.WriteLine(\"squared1={0}\",squared1);
Console.WriteLine(\"cubed1={0}\",cubed1);
doit.math_rountines(x1,out half1,out squared1,out cubed1);
Console.WriteLine(\"After method->x1={0}\",x1);
Console.WriteLine(\"half1={0}\",half1);
Console.WriteLine(\"squared1={0}\",squared1);
Console.WriteLine(\"cubed1={0}\",cubed1);
}
}
通過使用out關鍵字,我們改變了三個變數的值,也就是說out是從方法中傳出值.
我們發現,ref和out似乎可以實現相同的功能.因為都可以改變傳遞到方法中的變數的值.但是,二者本質本質的區別就是,ref是傳入值,out是傳出值.在含有out關鍵字的方法中,變數必須由方法引數中不含out(可以是ref)的變數賦值或者由全域性(即方法可以使用的該方法外部變數)變數賦值,out的宗旨是保證每一個傳出變數都必須被賦值.
上面程式碼中被/**/註釋掉的部分,可以直接使用.也就是說,在呼叫方法前可以不初始化變數.但是\"x1\"是要賦值的,否則要報錯.而ref引數,在傳遞給方法時,就已經是還有值的了,所以ref側重修改.out側重輸出.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-544948/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- c#基礎系列3—深入理解ref 和outC#
- c# 方法引數(傳值,傳引用,ref,out,params,可選引數,命名引數)C#
- out關鍵字和ref關鍵字的區別
- Lua中呼叫ref和out修飾引數的函式/過載函式函式
- out,ref,params引數傳遞
- vue中的 ref 和 $refsVue
- Rust 中 *、&、mut、&mut、ref、ref mut 的用法和區別Rust
- C# 中的 in 引數和效能分析C#
- Kotlin 泛型中的 in 和 outKotlin泛型
- 全面瞭解Vue3的 ref 和相關函式和計算屬性Vue函式
- Vue 標籤中的ref屬性和refsVue
- Spring中ref local=""與ref bean=""的區別SpringBean
- C#/Vsto中CustomTaskPanes和Ribbon的使用方法C#
- ref和reactiveReact
- Vue 學習 Ref shallowRef triggerRef customRef (Ref 和 Reactive的對比)VueReact
- C#中類的屬性訪問器--get和set分析C#
- iOS中Block實現原理的全面分析iOSBloC
- C# 中的 ref 已經被放開,或許你已經不認識了C#
- C#中刪除DataTable中的行的方法C#
- C#中?和??及?:的用法C#
- Vue 中ref()與 reactive() 的區別VueReact
- Vue3 中的各種 refVue
- MySQL全面瓦解22:索引的介紹和原理分析MySql索引
- C#程式設計:ref【引數按引用傳遞】C#程式設計
- [C#]C#中ToString()和Convert.ToString()的區別C#
- 深度分析C#中Array的儲存結構C#
- 簡單介紹Tomcat中catalina.out 和 catalina.log的區別和用途Tomcat
- C#中Hashtable和HashMap的區別C#HashMap
- c#中的ReadOnlySequence<T>和ReadOnlySequenceSegment<T>C#
- C#中的?.和!.運算子(連結)C#
- C#中的協變和逆變C#
- C#中EXCEL的輸入和倒出C#Excel
- React-hooks 父元件透過ref獲取子元件資料和方法ReactHook元件
- 資料分析方法中的杜邦分析法
- C#中的虛方法(virtual)例項講解C#
- Java 中模擬 C# 的擴充套件方法JavaC#套件
- .NET: 談談C#中的擴充套件方法C#套件
- JAVA IPMI Command time out 解決方法Java
- React ref的用法React