C#中的ref和out的意義和使用方法
向方法傳遞一個實參時,對應的形參會用實參的一個副本來初始化,不管形參是值型別(例如int),可空型別(int?),還是引用型別,這一點都是成立的。也就是隨便在方法內部進行什麼修改,都不會影響實參的值。例如,對於引用型別,方法的改變,只是會改變引用的資料,但實參本身並沒有變化,它仍然引用同一個物件。
程式碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ref_out
{
class Program
{
static void Main(string[] args)
{
int i = 8;
Console.WriteLine(i);
DoIncrease(i);
Console.WriteLine(i);
}
static void DoIncrease(int a)
{
a++;
}
}
} 執行結果如下:
若使用ref 關鍵字,向形參應用的任何操作都同樣應用於實參,因為形參和實參引用的是同一個物件。PS:實參和形參都必須附加ref 關鍵字做為字首。
程式碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ref_out
{
class Program
{
static void Main(string[] args)
{
int i = 8;
Console.WriteLine(i); // 8
DoIncrease(ref i); // 實參前也必須加ref
Console.WriteLine(i); // 9 // ref 關鍵字使對形參的動作也應用於實參
}
static void DoIncrease(ref int a) // 形參前必須加ref
{
a++;
}
}
} 執行結果如下:
ref 實參使用前也必須初始化,否則不能通過編譯。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ref_out
{
class Program
{
static void Main(string[] args)
{
int i; // ref 實參沒有初始化,所以程式不能通過編譯
Console.WriteLine(i);
DoIncrease(ref i);
Console.WriteLine(i);
}
static void DoIncrease(ref int a)
{
a++;
}
}
}
有時我們希望由方法本身來初始化引數,這時可以使用out 引數。
程式碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ref_out
{
class Program
{
static void Main(string[] args)
{
int i; // 沒有初始化
//Console.WriteLine(i); // 此處i 未初始化,編譯錯誤
DoIncrease(out i); // 用方法來給實參賦初值
Console.WriteLine(i);
}
static void DoIncrease(out int a)
{
a = 8; // 在方法中進行初始化
a++; // a = 9
}
}
}
執行結果如下:
相關文章
- c#基礎系列3—深入理解ref 和outC#
- out關鍵字和ref關鍵字的區別
- C#/Vsto中CustomTaskPanes和Ribbon的使用方法C#
- vue中的 ref 和 $refsVue
- Lua中呼叫ref和out修飾引數的函式/過載函式函式
- 關於System.out.println的意義
- Rust 中 *、&、mut、&mut、ref、ref mut 的用法和區別Rust
- Kotlin 泛型中的 in 和 outKotlin泛型
- 實踐和思考的重要意義
- Vue 標籤中的ref屬性和refsVue
- 軟體測試的目的和意義
- ref和reactiveReact
- Flutter自定義Widget和使用方法Flutter
- out,ref,params引數傳遞
- SQL中DATEADD和DATEDIFF的使用方法SQL
- postgresql和mysql中的limit使用方法MySqlMIT
- Python中類的建立和使用方法Python
- Java培訓分享void的用法和意義Java
- Java技術分享:void的用法和意義Java
- Vue 學習 Ref shallowRef triggerRef customRef (Ref 和 Reactive的對比)VueReact
- k8s-Pod的概念和存在的意義K8S
- C#中?和??及?:的用法C#
- Unfolder中的補丁和元素使用方法
- Makefile中:=, =, ?=和+=的含義
- 介面對前後端和測試的意義後端
- 簡述回撥函式的意義和作用函式
- HBase中Memstore存在的意義以及多列族引起的問題和設計
- 容器,Docker,Kubernetes和Kyma,以及Kyma對SAP的意義Docker
- 容器,Docker, Kubernetes和Kyma,以及Kyma對SAP的意義Docker
- 優思學院|精益管理的目的和意義
- C++中&和*的含義C++
- Jquery 和 Ajax的 使用方法jQuery
- c# 方法引數(傳值,傳引用,ref,out,params,可選引數,命名引數)C#
- C#中Hashtable和HashMap的區別C#HashMap
- c#中的ReadOnlySequence<T>和ReadOnlySequenceSegment<T>C#
- C# 中的 in 引數和效能分析C#
- C#中的?.和!.運算子(連結)C#
- C#中的協變和逆變C#
- C#中EXCEL的輸入和倒出C#Excel