|
|
|
|
|
C# 中有兩個關(guān)鍵字,即 ref
和 out
,它們用于傳遞參數(shù),有相似之處,但也有明顯的不同,閱讀下面的文章:
在本文中,我將通過示例討論C#中的 ref
與 out
,了解這些關(guān)鍵字在哪些場景中有用,以及如何通過示例使用它們。
C# 中的 ref 與 out
out
是 C# 中的關(guān)鍵字,用于將參數(shù)作為引用類型傳遞給方法。ref
也是 C# 中的關(guān)鍵字,用于通過引用傳遞參數(shù)。
為了理解 ref
和 out
關(guān)鍵字的基本原理,請看下面的例子。在這里,你可以看到我們創(chuàng)建了一個名為 Math
的函數(shù),此 Math
函數(shù)采用兩個整數(shù)參數(shù),然后此函數(shù)將這兩個數(shù)字相加并返回結(jié)果。從 Main
方法中,我們調(diào)用 Math
函數(shù),然后在控制臺中打印結(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)在,我的要求是,當我調(diào)用 Math
函數(shù)時,我想返回傳遞給該函數(shù)的兩個數(shù)字的加法、乘法、減法和除法。但是,函數(shù)只能返回一個輸出。
如果你查看 Math
函數(shù),返回類型為 int
,這意味著它只會在任何給定時間點返回單個值?,F(xiàn)在,我們?nèi)绾畏祷囟鄠€值,如加法、乘法、減法和除法?所以,在這種情況下,我們需要使用 out
和 ref
參數(shù)。
使用ref從函數(shù)返回多個輸出的示例
現(xiàn)在,讓我們先看看 ref
如何幫助我們從函數(shù)提供多個輸出。為了從 Math
函數(shù)返回四個值(加法、乘法、減法和除法),Math
函數(shù)應(yīng)接受四個參數(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ù)之外,我們還需要傳遞四個整數(shù) ref
參數(shù)。為此,首先,我們需要聲明四個整型變量。所以在這里我們聲明了四個變量,即加法、乘法、減法和除法。然后我們需要將這四個變量傳遞給 Math
函數(shù),然后 Math
函數(shù)將為我們提供這些變量的更新值。為了將更新后的值返回到這些變量中,同時將這些變量傳遞給 Math
函數(shù),我們需要再次使用 ref
關(guān)鍵字,如下圖所示。
現(xiàn)在,Addition
變量將保存我們傳遞給 Math
函數(shù)的兩個數(shù)字的加法。類似地,Multiplication
變量將為我們提供傳遞給 Math
函數(shù)的兩個數(shù)字的乘積,Division
和 Subtraction
也是如此。
所以,實際發(fā)生的是,當我們在 Math
函數(shù)中更新 ref
變量時,它實際上會在 Main
函數(shù)中更新相同的變量。例如,如果我們更新 Math
函數(shù)中的 Addition
變量,它實際上會更新 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;
}
}
}
輸出
因此,你可以看到,通過使用 ref
參數(shù),我們?nèi)绾文軌驈膯蝹€函數(shù)獲得多個輸出。
重要筆記
在這里,我們傳遞的參數(shù)是值類型,這意味著 int
、float
、Boolean
等用于創(chuàng)建值類型變量。我們已經(jīng)知道C#中機制中按值調(diào)用的概念。在值類型的情況下,變量的不同副本被傳遞給調(diào)用方法。如果你在 Calling
方法中做任何更改,它不會影響相同的原始變量。但是因為我們在這里使用了 ref
,所以它實際上是在這里傳遞一個指向原始變量的指針。因此,使用指針更改值實際上是在更改原始變量的值。
使用out從函數(shù)返回多個輸出的示例
讓我們先看例子,然后我們將了解 C# 中 out
參數(shù)的概念。請查看以下示例代碼。這與上一個示例相同,只是我們在這里使用 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ù)非常相似。
你需要記住的第一點是,當你希望一個函數(shù)有多個輸出時,你需要使用 ref
和 out
參數(shù)。
現(xiàn)在,最常被問到的面試問題是 C# 中的 out
和 ref
有什么區(qū)別?
C#中out和ref有什么區(qū)別?
那么它們之間有什么區(qū)別呢?讓我們通過一個例子來理解差異。請看下面的例子,以下是我們在前兩個示例中已經(jīng)解釋過的代碼。
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:
當我們調(diào)用帶有“out
”變量的函數(shù)時,必須更新函數(shù)內(nèi)部的 out
變量。但如果你使用 ref
變量,這不是強制性的。例如,請看下面的代碼。在這里,我們正在評論第二個更新語句。作為參考,我們沒有收到任何編譯時錯誤。但是對于 out
,我們會收到一個編譯時錯誤,提示“在控制離開當前方法之前必須將 out 參數(shù)‘Subtraction’分配給”,如下所示。
因此,你需要牢記的第一點是,如果你要聲明一些 out
變量,則必須在函數(shù)內(nèi)初始化或更新 out
變量,否則我們將遇到編譯器錯誤。但是對于 ref
,更新方法內(nèi)部的 ref
變量是可選的。
C# 中的 ref 與 out 區(qū)別2:
當我們使用 ref
參數(shù)時,你必須初始化 ref
參數(shù),否則你會得到編譯時錯誤。這是因為使用 ref
參數(shù),更新方法內(nèi)部的值是可選的。因此,在傳遞 ref
參數(shù)之前,應(yīng)該對其進行初始化。另一方面,初始化輸出參數(shù)是可選的。如果你沒有初始化 out
參數(shù),沒問題,因為 out
參數(shù)是在方法內(nèi)部強制初始化或更新的。為了更好地理解,請看下面的代碼。在這里,我們沒有初始化第二個參數(shù)。對于 SubtractionOut
參數(shù),我們沒有得到任何錯誤,但是對于 SubtractionRef
,我們得到一個編譯器錯誤,提示使用未分配的局部變量“SubtractionRef”,如下所示。
因此,你需要記住的第二個要點是,在將此類變量傳遞給方法之前必須初始化 ref
參數(shù),而初始化 out
參數(shù)變量是可選的。
什么時候使用ref?
當你想將一些值傳遞給函數(shù)并且你希望函數(shù)修改這些值并返回給你時,你需要使用 ref
。為了更好地理解這一點,請看下面的示例。在這里,我們有一個名為 AddTen
的函數(shù)。此函數(shù)采用一個整數(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;
}
}
}
當你有一些值并且你希望調(diào)用函數(shù)修改并返回該值時,你需要使用 ref
。
什么時候使用out?
在 out
參數(shù)中,你只需要輸出,你不想提供任何輸入。因此,當你不想將任何值傳遞給函數(shù)并且你希望函數(shù)應(yīng)該并且必須更新該值時,你需要使用 out
。為了更好地理解,請看下面的示例。在這里,我們將兩個整數(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ù)從不將值帶入方法定義中,因此,聲明時不需要初始化 out
參數(shù)。所以,這里初始化out
參數(shù)是沒有用的。這是因為 out
參數(shù)將由該方法初始化。那么你可能會想到一個問題。如果不需要初始化 out
變量,那我們?yōu)槭裁匆阉鼈兊氖褂梅殖蓛刹糠帜??首先,聲明變量,然后使?ref
關(guān)鍵字將變量傳遞給函數(shù)。
隨著 C# 7 的引入,現(xiàn)在可以直接在方法中聲明輸出參數(shù)。因此,上面的程序可以重寫如下所示,并給出相同的輸出。在這里,你可以看到我們在方法調(diào)用時直接聲明變量即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é)
在本文中,我嘗試通過示例解釋C# 中的 ref
與 out
,希望你喜歡這篇文章。
參考文章
相關(guān)文章