技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營(yíng)

贊助商

分類目錄

贊助商

最新文章

搜索

[示例]詳細(xì)介紹C#中ref與out使用方法、區(qū)別及使用場(chǎng)景

作者:admin    時(shí)間:2023-5-7 11:50:58    瀏覽:

C# 中有兩個(gè)關(guān)鍵字,即 refout,它們用于傳遞參數(shù),有相似之處,但也有明顯的不同,閱讀下面的文章:

在本文中,我將通過(guò)示例討論C#中的 refout,了解這些關(guān)鍵字在哪些場(chǎng)景中有用,以及如何通過(guò)示例使用它們。

C# 中的 ref 與 out

out 是 C# 中的關(guān)鍵字,用于將參數(shù)作為引用類型傳遞給方法。ref 也是 C# 中的關(guān)鍵字,用于通過(guò)引用傳遞參數(shù)。

為了理解 refout 關(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è)值,如加法、乘法、減法和除法?所以,在這種情況下,我們需要使用 outref 參數(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ù)字的乘積,DivisionSubtraction 也是如此。

所以,實(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í),你需要使用 refout 參數(shù)。

現(xiàn)在,最常被問(wèn)到的面試問(wèn)題是 C# 中的 outref 有什么區(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# 中的 refout,希望你喜歡這篇文章。

參考文章

相關(guān)文章

標(biāo)簽: asp.net  CSharp  out  ref  
x
  • 站長(zhǎng)推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */