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

贊助商

分類目錄

贊助商

最新文章

搜索

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

作者:admin    時間:2023-5-7 11:50:58    瀏覽:

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

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

C# 中的 ref 與 out

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

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

所以,實際發(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、floatBoolean 等用于創(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ù)有多個輸出時,你需要使用 refout 參數(shù)。

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

參考文章

相關(guān)文章

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