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#中ref和out的區別C#
- 全面分析C#方法中的ref和outC#
- ref和out的區別
- ref和out區別
- NET|Ref 和out 的區別和聯絡
- c#基礎系列3—深入理解ref 和outC#
- C#中ref、out及特殊說明引數的用法C#
- vue中的 ref 和 $refsVue
- c# ref out 區別 比較 彙總C#
- 圖解C#的值型別,引用型別,棧,堆,ref,out圖解C#型別
- 加密鹽的意義和用途加密
- C#/Vsto中CustomTaskPanes和Ribbon的使用方法C#
- Kotlin 泛型中的 in 和 outKotlin泛型
- Vue 標籤中的ref屬性和refsVue
- 實踐和思考的重要意義
- JS 中 __proto__ 和 prototype 存在的意義是什麼?JS
- 軟體測試的目的和意義
- 泛型的意義和作用是啥?泛型
- FTP 中ascii 和bin 的區別和使用方法FTPASCII
- out,ref,params引數傳遞
- 預算編制系統中兩棵樹和五類表的作用和意義
- webwork 中 external-ref 和interceptor-ref 共同用出現問題Web
- Python中類的建立和使用方法Python
- Unfolder中的補丁和元素使用方法
- SQL中DATEADD和DATEDIFF的使用方法SQL
- AIX中YUM庫的配置和使用方法AI
- c++中new和delete的使用方法C++delete
- C# 中的INotifyPropertyChanged和ObservableCollectionC#
- C#中?和??及?:的用法C#
- Java技術分享:void的用法和意義Java
- Java培訓分享void的用法和意義Java
- 介面對前後端和測試的意義後端
- Flutter自定義Widget和使用方法Flutter
- Oracle中checkpoint存在的意義Oracle
- C++中&和*的含義C++
- C#中的Unsafe和FixedC#
- C# 中的委託和事件C#事件
- C#中的 ref 傳進出的到底是什麼 解惑篇C#