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

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

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

Value parameters : This method copies the actual value of an argument into the formal parameter of the function. In this case, changes made to the parameter inside the function have no effect on the argument.

Reference parameters : This method copies the reference to the memory location of an argument into the formal parameter. This means that changes made to the parameter affect the argument.

Output parameters : This method helps in returning more than one value.

我了解上面的传递参数类型和下面的示例代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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();

      }
   }
}

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

Before swap, value of a : 100

After swap, value of a : 5

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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();
       }
   }
}

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

Before swap, value of a : 100

After swap, value of a : 5

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


在像引用参数那样调用方法之前,不必初始化输出参数。

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

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


使用"引用"参数时,需要先分配值,然后方法才能使用它。您的示例中的x和y需要在方法外部声明。如int x = 100; int y =200;

对于"输出"参数,在使用之前不必为参数值赋值。X和Y可以在示例中声明,但没有为它们指定起始值。如int x; int y;


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

引用参数的引用(引用对象)可能会被方法更改,也可能不会被方法更改。

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


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

1
2
3
4
5
6
7
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关键字。

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

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

看这个,"ref"和"out"关键字有什么区别?

不同的是,对于out参数,必须在离开方法之前设置它。因此,即使在调用方法之前不将其设置为任何值,编译器也知道在方法调用期间它将获得一个值。

从技术上的差异出发,要有一个好的可读代码,应该在方法有多个输出时使用out。当方法只更新变量时使用ref