|
|
|
|
|
C# 中有兩個(gè)關(guān)鍵字,即 ref
和 out
,它們用于傳遞參數(shù),有相似之處,但也有明顯的不同,閱讀下面的文章:
在本文中,我將通過(guò)示例討論C#中的 ref
與 out
,了解這些關(guān)鍵字在哪些場(chǎng)景中有用,以及如何通過(guò)示例使用它們。
C# 中的 ref 與 out
out
是 C# 中的關(guān)鍵字,用于將參數(shù)作為引用類型傳遞給方法。ref
也是 C# 中的關(guān)鍵字,用于通過(guò)引用傳遞參數(shù)。
為了理解 ref
和 out
關(guān)鍵字的基本原理,請(qǐng)看下面的例子。在這里,你可以看到我們創(chuàng)建了一個(gè)名為 Math
的函數(shù),此 Math
函數(shù)采用兩個(gè)整數(shù)參數(shù),然后此函數(shù)將這兩個(gè)數(shù)字相加并返回結(jié)果。從 Main
方法中,我們調(diào)用 Math
函數(shù),然后在控制臺(tái)中打印結(jié)果。
using System;
namespace RefvsOutDemo
{
class Program
{
static void Main(string[] args)
{
int Result = Math(100, 200);
Console.WriteLine($"Result: {Result}");
Console.ReadKey();
}
public static int Math(int number1, int number2)
{
return number1 + number2;
}
}
}
輸出
Result: 300
現(xiàn)在,我的要求是,當(dāng)我調(diào)用 Math
函數(shù)時(shí),我想返回傳遞給該函數(shù)的兩個(gè)數(shù)字的加法、乘法、減法和除法。但是,函數(shù)只能返回一個(gè)輸出。
如果你查看 Math
函數(shù),返回類型為 int
,這意味著它只會(huì)在任何給定時(shí)間點(diǎn)返回單個(gè)值。現(xiàn)在,我們?nèi)绾畏祷囟鄠€(gè)值,如加法、乘法、減法和除法?所以,在這種情況下,我們需要使用 out
和 ref
參數(shù)。
使用ref從函數(shù)返回多個(gè)輸出的示例
現(xiàn)在,讓我們先看看 ref
如何幫助我們從函數(shù)提供多個(gè)輸出。為了從 Math
函數(shù)返回四個(gè)值(加法、乘法、減法和除法),Math
函數(shù)應(yīng)接受四個(gè)參數(shù),并且應(yīng)使用 ref
關(guān)鍵字聲明參數(shù)。然后,我們需要設(shè)置這些 ref
參數(shù)中的值,如下面的代碼所示,修改 Math
函數(shù)如下。由于我們使用 ref
參數(shù)返回輸出,因此我們將此方法的返回類型更改為 void
。
public static void Math(int number1, int number2, ref int Addition, ref int Multiplication, ref int Subtraction, ref int Division)
{
Addition = number1 + number2;
Multiplication = number1 * number2;
Subtraction = number1 - number2;
Division = number1 / number2;
}
現(xiàn)在,在 Main
方法中,在調(diào)用上述 Math
函數(shù)時(shí),除了兩個(gè)整數(shù)之外,我們還需要傳遞四個(gè)整數(shù) ref
參數(shù)。為此,首先,我們需要聲明四個(gè)整型變量。所以在這里我們聲明了四個(gè)變量,即加法、乘法、減法和除法。然后我們需要將這四個(gè)變量傳遞給 Math
函數(shù),然后 Math
函數(shù)將為我們提供這些變量的更新值。為了將更新后的值返回到這些變量中,同時(shí)將這些變量傳遞給 Math
函數(shù),我們需要再次使用 ref
關(guān)鍵字,如下圖所示。
現(xiàn)在,Addition
變量將保存我們傳遞給 Math
函數(shù)的兩個(gè)數(shù)字的加法。類似地,Multiplication
變量將為我們提供傳遞給 Math
函數(shù)的兩個(gè)數(shù)字的乘積,Division
和 Subtraction
也是如此。
所以,實(shí)際發(fā)生的是,當(dāng)我們?cè)?Math
函數(shù)中更新 ref
變量時(shí),它實(shí)際上會(huì)在 Main
函數(shù)中更新相同的變量。例如,如果我們更新 Math
函數(shù)中的 Addition
變量,它實(shí)際上會(huì)更新 Main
方法中存在的 Addition
變量。乘法、減法和除法也一樣。完整的示例代碼如下。
using System;
namespace RefvsOutDemo
{
class Program
{
static void Main(string[] args)
{
int Addition = 0;
int Multiplication = 0;
int Subtraction = 0;
int Division = 0;
Math(200, 100, ref Addition, ref Multiplication, ref Subtraction, ref Division);
Console.WriteLine($"Addition: {Addition}");
Console.WriteLine($"Multiplication: {Multiplication}");
Console.WriteLine($"Subtraction: {Subtraction}");
Console.WriteLine($"Division: {Division}");
Console.ReadKey();
}
public static void Math(int number1, int number2, ref int Addition, ref int Multiplication, ref int Subtraction, ref int Division)
{
Addition = number1 + number2;
Multiplication = number1 * number2;
Subtraction = number1 - number2;
Division = number1 / number2;
}
}
}
輸出
因此,你可以看到,通過(guò)使用 ref
參數(shù),我們?nèi)绾文軌驈膯蝹€(gè)函數(shù)獲得多個(gè)輸出。
重要筆記
在這里,我們傳遞的參數(shù)是值類型,這意味著 int
、float
、Boolean
等用于創(chuàng)建值類型變量。我們已經(jīng)知道C#中機(jī)制中按值調(diào)用的概念。在值類型的情況下,變量的不同副本被傳遞給調(diào)用方法。如果你在 Calling
方法中做任何更改,它不會(huì)影響相同的原始變量。但是因?yàn)槲覀冊(cè)谶@里使用了 ref
,所以它實(shí)際上是在這里傳遞一個(gè)指向原始變量的指針。因此,使用指針更改值實(shí)際上是在更改原始變量的值。
使用out從函數(shù)返回多個(gè)輸出的示例
讓我們先看例子,然后我們將了解 C# 中 out
參數(shù)的概念。請(qǐng)查看以下示例代碼。這與上一個(gè)示例相同,只是我們?cè)谶@里使用 out
而不是 ref
。
using System;
namespace RefvsOutDemo
{
class Program
{
static void Main(string[] args)
{
int Addition = 0;
int Multiplication = 0;
int Subtraction = 0;
int Division = 0;
Math(200, 100, out Addition, out Multiplication, out Subtraction, out Division);
Console.WriteLine($"Addition: {Addition}");
Console.WriteLine($"Multiplication: {Multiplication}");
Console.WriteLine($"Subtraction: {Subtraction}");
Console.WriteLine($"Division: {Division}");
Console.ReadKey();
}
public static void Math(int number1, int number2, out int Addition, out int Multiplication, out int Subtraction, out int Division)
{
Addition = number1 + number2;
Multiplication = number1 * number2;
Subtraction = number1 - number2;
Division = number1 / number2;
}
}
}
輸出
很好,我們得到了相同的結(jié)果。這意味著使用 out
我們還可以從 Math
函數(shù)中獲取更新的值。因此,它的工作方式與 ref
參數(shù)非常相似。
你需要記住的第一點(diǎn)是,當(dāng)你希望一個(gè)函數(shù)有多個(gè)輸出時(shí),你需要使用 ref
和 out
參數(shù)。
現(xiàn)在,最常被問(wèn)到的面試問(wèn)題是 C# 中的 out
和 ref
有什么區(qū)別?
C#中out和ref有什么區(qū)別?
那么它們之間有什么區(qū)別呢?讓我們通過(guò)一個(gè)例子來(lái)理解差異。請(qǐng)看下面的例子,以下是我們?cè)谇皟蓚€(gè)示例中已經(jīng)解釋過(guò)的代碼。
using System;
namespace RefvsOutDemo
{
class Program
{
static void Main(string[] args)
{
//Call the function using Ref
int AdditionRef = 0;
int SubtractionRef = 0;
MathRef(200, 100, ref AdditionRef, ref SubtractionRef);
Console.WriteLine($"AdditionRef: {AdditionRef}");
Console.WriteLine($"SubtractionRef: {SubtractionRef}");
//Call the function using out
int AdditionOut = 0;
int SubtractionOut = 0;
MathOut(200, 100, out AdditionOut, out SubtractionOut);
Console.WriteLine($"AdditionOut: {AdditionOut}");
Console.WriteLine($"SubtractionOut: {SubtractionOut}");
Console.ReadKey();
}
public static void MathRef(int number1, int number2, ref int Addition, ref int Subtraction)
{
Addition = number1 + number2;
Subtraction = number1 - number2;
}
public static void MathOut(int number1, int number2, out int Addition, out int Subtraction)
{
Addition = number1 + number2;
Subtraction = number1 - number2;
}
}
}
輸出
好的!獲得預(yù)期的輸出。
C# 中的 ref 與 out 區(qū)別1:
當(dāng)我們調(diào)用帶有“out
”變量的函數(shù)時(shí),必須更新函數(shù)內(nèi)部的 out
變量。但如果你使用 ref
變量,這不是強(qiáng)制性的。例如,請(qǐng)看下面的代碼。在這里,我們正在評(píng)論第二個(gè)更新語(yǔ)句。作為參考,我們沒(méi)有收到任何編譯時(shí)錯(cuò)誤。但是對(duì)于 out
,我們會(huì)收到一個(gè)編譯時(shí)錯(cuò)誤,提示“在控制離開(kāi)當(dāng)前方法之前必須將 out 參數(shù)‘Subtraction’分配給”,如下所示。
因此,你需要牢記的第一點(diǎn)是,如果你要聲明一些 out
變量,則必須在函數(shù)內(nèi)初始化或更新 out
變量,否則我們將遇到編譯器錯(cuò)誤。但是對(duì)于 ref
,更新方法內(nèi)部的 ref
變量是可選的。
C# 中的 ref 與 out 區(qū)別2:
當(dāng)我們使用 ref
參數(shù)時(shí),你必須初始化 ref
參數(shù),否則你會(huì)得到編譯時(shí)錯(cuò)誤。這是因?yàn)槭褂?ref
參數(shù),更新方法內(nèi)部的值是可選的。因此,在傳遞 ref
參數(shù)之前,應(yīng)該對(duì)其進(jìn)行初始化。另一方面,初始化輸出參數(shù)是可選的。如果你沒(méi)有初始化 out
參數(shù),沒(méi)問(wèn)題,因?yàn)?out
參數(shù)是在方法內(nèi)部強(qiáng)制初始化或更新的。為了更好地理解,請(qǐng)看下面的代碼。在這里,我們沒(méi)有初始化第二個(gè)參數(shù)。對(duì)于 SubtractionOut
參數(shù),我們沒(méi)有得到任何錯(cuò)誤,但是對(duì)于 SubtractionRef
,我們得到一個(gè)編譯器錯(cuò)誤,提示使用未分配的局部變量“SubtractionRef”,如下所示。
因此,你需要記住的第二個(gè)要點(diǎn)是,在將此類變量傳遞給方法之前必須初始化 ref
參數(shù),而初始化 out
參數(shù)變量是可選的。
什么時(shí)候使用ref?
當(dāng)你想將一些值傳遞給函數(shù)并且你希望函數(shù)修改這些值并返回給你時(shí),你需要使用 ref
。為了更好地理解這一點(diǎn),請(qǐng)看下面的示例。在這里,我們有一個(gè)名為 AddTen
的函數(shù)。此函數(shù)采用一個(gè)整數(shù)參數(shù)并將其值遞增 10。因此,在這種情況下,你需要使用 ref
。因此,你正在傳遞一些值,并且希望該值被函數(shù)修改。
using System;
namespace RefvsOutDemo
{
class Program
{
static void Main(string[] args)
{
//Use of Ref in C#
int Number = 10;
AddTen(ref Number);
Console.WriteLine(Number);
Console.ReadKey();
}
public static void AddTen(ref int Number)
{
Number = Number + 10;
}
}
}
當(dāng)你有一些值并且你希望調(diào)用函數(shù)修改并返回該值時(shí),你需要使用 ref
。
什么時(shí)候使用out?
在 out
參數(shù)中,你只需要輸出,你不想提供任何輸入。因此,當(dāng)你不想將任何值傳遞給函數(shù)并且你希望函數(shù)應(yīng)該并且必須更新該值時(shí),你需要使用 out
。為了更好地理解,請(qǐng)看下面的示例。在這里,我們將兩個(gè)整數(shù)傳遞給 Add
函數(shù),我們希望 Add
函數(shù)更新結(jié)果輸出參數(shù)。
using System;
namespace RefvsOutDemo
{
class Program
{
static void Main(string[] args)
{
//Use of out in C#
int Result;
Add(10, 20, out Result);
Console.WriteLine(Result);
Console.ReadKey();
}
public static void Add(int num1, int num2, out int Result)
{
Result = num1 + num2;
}
}
}
out
參數(shù)從不將值帶入方法定義中,因此,聲明時(shí)不需要初始化 out
參數(shù)。所以,這里初始化out
參數(shù)是沒(méi)有用的。這是因?yàn)?out
參數(shù)將由該方法初始化。那么你可能會(huì)想到一個(gè)問(wèn)題。如果不需要初始化 out
變量,那我們?yōu)槭裁匆阉鼈兊氖褂梅殖蓛刹糠帜兀渴紫?,聲明變量,然后使?ref
關(guān)鍵字將變量傳遞給函數(shù)。
隨著 C# 7 的引入,現(xiàn)在可以直接在方法中聲明輸出參數(shù)。因此,上面的程序可以重寫(xiě)如下所示,并給出相同的輸出。在這里,你可以看到我們?cè)诜椒ㄕ{(diào)用時(shí)直接聲明變量即Add(10, 20, out int Number);
. 這將消除將 out
變量的使用分成兩部分的需要。
using System;
namespace RefvsOutDemo
{
class Program
{
static void Main(string[] args)
{
//Use of out in C#
Add(10, 20, out int Number);
Console.WriteLine(Number);
Console.ReadKey();
}
public static void Add(int num1, int num2, out int Result)
{
Result = num1 + num2;
}
}
}
總結(jié)
在本文中,我嘗試通過(guò)示例解釋C# 中的 ref
與 out
,希望你喜歡這篇文章。
參考文章
相關(guān)文章