繁体   English   中英

在C#中通过输出和参考传递参数之间的区别是什么

[英]What Is The Difference Between Passing Parameters By Output And By Reference In C#

我一直在努力研究C#方法。 有三种方法可以将参数传递给C#方法。

值参数 :此方法将参数的实际值复制到函数的形式参数中。 在这种情况下,对函数内部参数所做的更改对参数没有影响。

引用参数 :此方法将对参数的内存位置的引用复制到形参中。 这意味着对参数所做的更改会影响参数。

输出参数 :此方法有助于返回多个值。

我通过以下示例代码了解了上述类型的传递参数。

using System;
namespace PassingParameterByReference
{
   class MethodWithReferenceParameters
   {
      public void swap(ref int x)
      {
        int temp = 5;
        x = temp;
      }

      static void Main(string[] args)
      {
         MethodWithReferenceParameters n = new MethodWithReferenceParameters();
         /* local variable definition */
         int a = 100;
         Console.WriteLine("Before swap, value of a : {0}", a);
         /* calling a function to swap the value*/
         n.swap(ref a);
         Console.WriteLine("After swap, value of a : {0}", a);
         Console.ReadLine();

      }
   }
}

编译并执行上述代码时,会产生以下结果:

在交换之前,a的值为:100

交换后,a:5的值

使用此代码,我可以理解通过引用将参数传递给方法。 然后我检查下面的代码,以了解输出方法的传递参数。

using System;
namespace PassingParameterByOutput
{
   class MethodWithOutputParameters
   {
      public void swap(out int x)
      {
        int temp = 5;
        x = temp;
      }

      static void Main(string[] args)
      {
         MethodWithOutputParameters n = new MethodWithOutputParameters();
         /* local variable definition */
         int a = 100; 
         Console.WriteLine("Before swap, value of a : {0}", a);
         /* calling a function to swap the value */
         n.swap(out a);
         Console.WriteLine("After swap, value of a : {0}", a);
         Console.ReadLine();
       }
   }
}

编译并执行上述代码时,会产生以下结果:

在交换之前,a的值为:100

交换后,a:5的值

这些示例代码以不同的方式执行相同的操作。 并且我无法理解两种方法之间的区别。(通过输出和参考将参数传递给方法)。 两个例子的输出是相同的。 这个小差异是什么?

在调用方法之前不必初始化输出参数,就像参考参数的情况一样。

int someNum;
someMethod(out someNum); //works
someMethod(ref someNum); //gives compilation error

此外,需要在方法中设置或更改输出参数,这对于参考参数不是必需的。

使用“Reference”参数时,需要在方法可以使用之前分配值。 您的示例中的X和Y需要在方法之外声明。 例如, int x = 100; int y =200; int x = 100; int y =200;

使用“输出”参数时,不必为参数值分配值,然后才能使用它们。 可能已在您的示例中声明了X和Y,但没有为其分配起始值。 例如int x; int y; int x; int y;

输出参数需要在方法内更改它的值,否则编译器将抛出错误。

参考参数可以或可以不具有由该方法改变的参考(参考对象)。

此外,值类型(在结构中定义的类型)不能通过引用传递。

请参阅“ref”和“out”关键字之间的区别是什么?

不同之处在于,对于out参数,您必须在离开方法之前进行设置。 因此,即使您在调用方法之前未将其设置为任何值,编译器也会知道它将在方法调用期间获取值。

从技术差异来看,要有一个良好的可读代码,你应该在方法有多个输出时使用。 并且当方法可以更新变量时使用ref

参考和输出参数非常相似。 唯一的区别是必须初始化ref参数。

int myInt = 1;
SomeMethod(ref myInt); //will work
SomeMethod(out myInt); //will work

int myInt;
SomeMethod(ref myInt); //won't work
SomeMethod(out myInt); //will work

编译器实际上会查看refout关键字。 例如,如果您不能重载方法,唯一的区别是refout关键字。

编译器将查看以下方法签名,因此这不是有效的重载。

private void SomeMethod(ref int Foo){};
private void SomeMethod(out int Foo){};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM