技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营

赞助商

分类目录

赞助商

最新文章

搜索

[示例]详细介绍C#中ref与out使用方法、区别及使用场景

作者:admin    时间:2023-5-7 11:50:58    浏览:

C# 中有两个关键字,即 refout,它们用于传递参数,有相似之处,但也有明显的不同,阅读下面的文章:

在本文中,我将通过示例讨论C#中的 refout,了解这些关键字在哪些场景中有用,以及如何通过示例使用它们。

C# 中的 ref 与 out

out 是 C# 中的关键字,用于将参数作为引用类型传递给方法。ref 也是 C# 中的关键字,用于通过引用传递参数。

为了理解 refout 关键字的基本原理,请看下面的例子。在这里,你可以看到我们创建了一个名为 Math 的函数,此 Math 函数采用两个整数参数,然后此函数将这两个数字相加并返回结果。从 Main 方法中,我们调用 Math 函数,然后在控制台中打印结果。

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

现在,我的要求是,当我调用 Math 函数时,我想返回传递给该函数的两个数字的加法、乘法、减法和除法。但是,函数只能返回一个输出。

如果你查看 Math 函数,返回类型为 int,这意味着它只会在任何给定时间点返回单个值。现在,我们如何返回多个值,如加法、乘法、减法和除法?所以,在这种情况下,我们需要使用 outref 参数。

使用ref从函数返回多个输出的示例

现在,让我们先看看 ref 如何帮助我们从函数提供多个输出。为了从 Math 函数返回四个值(加法、乘法、减法和除法),Math 函数应接受四个参数,并且应使用 ref 关键字声明参数。然后,我们需要设置这些 ref 参数中的值,如下面的代码所示,修改 Math 函数如下。由于我们使用 ref 参数返回输出,因此我们将此方法的返回类型更改为 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;
}

现在,在 Main 方法中,在调用上述 Math 函数时,除了两个整数之外,我们还需要传递四个整数 ref 参数。为此,首先,我们需要声明四个整型变量。所以在这里我们声明了四个变量,即加法、乘法、减法和除法。然后我们需要将这四个变量传递给 Math 函数,然后 Math 函数将为我们提供这些变量的更新值。为了将更新后的值返回到这些变量中,同时将这些变量传递给 Math 函数,我们需要再次使用 ref 关键字,如下图所示。

 

现在,Addition 变量将保存我们传递给 Math 函数的两个数字的加法。类似地,Multiplication 变量将为我们提供传递给 Math 函数的两个数字的乘积,DivisionSubtraction 也是如此。

所以,实际发生的是,当我们在 Math 函数中更新 ref 变量时,它实际上会在 Main 函数中更新相同的变量。例如,如果我们更新 Math 函数中的 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 参数,我们如何能够从单个函数获得多个输出。

重要笔记
在这里,我们传递的参数是值类型,这意味着 intfloatBoolean 等用于创建值类型变量。我们已经知道C#中机制中按值调用的概念。在值类型的情况下,变量的不同副本被传递给调用方法。如果你在 Calling 方法中做任何更改,它不会影响相同的原始变量。但是因为我们在这里使用了 ref,所以它实际上是在这里传递一个指向原始变量的指针。因此,使用指针更改值实际上是在更改原始变量的值。

使用out从函数返回多个输出的示例

让我们先看例子,然后我们将了解 C# 中 out 参数的概念。请查看以下示例代码。这与上一个示例相同,只是我们在这里使用 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;
        }
    }
}

输出

很好,我们得到了相同的结果。这意味着使用 out 我们还可以从 Math 函数中获取更新的值。因此,它的工作方式与 ref 参数非常相似。

你需要记住的第一点是,当你希望一个函数有多个输出时,你需要使用 refout 参数。

现在,最常被问到的面试问题是 C# 中的 outref 有什么区别?

C#中out和ref有什么区别?

那么它们之间有什么区别呢?让我们通过一个例子来理解差异。请看下面的例子,以下是我们在前两个示例中已经解释过的代码。

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;
        }
    }
}

输出

 

好的!获得预期的输出。

C# 中的 ref 与 out 区别1:

当我们调用带有“out”变量的函数时,必须更新函数内部的 out 变量。但如果你使用 ref 变量,这不是强制性的。例如,请看下面的代码。在这里,我们正在评论第二个更新语句。作为参考,我们没有收到任何编译时错误。但是对于 out,我们会收到一个编译时错误,提示“在控制离开当前方法之前必须将 out 参数‘Subtraction’分配给”,如下所示。

 

 因此,你需要牢记的第一点是,如果你要声明一些 out 变量,则必须在函数内初始化或更新 out 变量,否则我们将遇到编译器错误。但是对于 ref,更新方法内部的 ref 变量是可选的。

C# 中的 ref 与 out 区别2:

当我们使用 ref 参数时,你必须初始化 ref 参数,否则你会得到编译时错误。这是因为使用 ref 参数,更新方法内部的值是可选的。因此,在传递 ref 参数之前,应该对其进行初始化。另一方面,初始化输出参数是可选的。如果你没有初始化 out 参数,没问题,因为 out 参数是在方法内部强制初始化或更新的。为了更好地理解,请看下面的代码。在这里,我们没有初始化第二个参数。对于 SubtractionOut 参数,我们没有得到任何错误,但是对于 SubtractionRef,我们得到一个编译器错误,提示使用未分配的局部变量“SubtractionRef”,如下所示。

 

因此,你需要记住的第二个要点是,在将此类变量传递给方法之前必须初始化 ref 参数,而初始化 out 参数变量是可选的。

什么时候使用ref?

当你想将一些值传递给函数并且你希望函数修改这些值并返回给你时,你需要使用 ref 。为了更好地理解这一点,请看下面的示例。在这里,我们有一个名为 AddTen 的函数。此函数采用一个整数参数并将其值递增 10。因此,在这种情况下,你需要使用 ref。因此,你正在传递一些值,并且希望该值被函数修改。

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;
        }
    }
}

当你有一些值并且你希望调用函数修改并返回该值时,你需要使用 ref

什么时候使用out?

out 参数中,你只需要输出,你不想提供任何输入。因此,当你不想将任何值传递给函数并且你希望函数应该并且必须更新该值时,你需要使用 out。为了更好地理解,请看下面的示例。在这里,我们将两个整数传递给 Add 函数,我们希望 Add 函数更新结果输出参数。 

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 参数从不将值带入方法定义中,因此,声明时不需要初始化 out 参数。所以,这里初始化out参数是没有用的。这是因为 out 参数将由该方法初始化。那么你可能会想到一个问题。如果不需要初始化 out 变量,那我们为什么要把它们的使用分成两部分呢?首先,声明变量,然后使用 ref 关键字将变量传递给函数。

随着 C# 7 的引入,现在可以直接在方法中声明输出参数。因此,上面的程序可以重写如下所示,并给出相同的输出。在这里,你可以看到我们在方法调用时直接声明变量即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;
        }
    }
}

总结

在本文中,我尝试通过示例解释C# 中的 refout,希望你喜欢这篇文章。

参考文章

相关文章

标签: asp.net  CSharp  out  ref  
x
  • 站长推荐
/* 左侧显示文章内容目录 */