C# 在C语言中,通过输出和通过引用传递参数有什么区别#

C# 在C语言中,通过输出和通过引用传递参数有什么区别#,c#,methods,parameters,parameter-passing,pass-by-reference,C#,Methods,Parameters,Parameter Passing,Pass By Reference,我一直在努力研究C#方法。有三种方法可以将参数传递给C#方法 值参数:此方法将参数的实际值复制到函数的形式参数中。在这种情况下,对函数内的参数所做的更改对参数没有影响 引用参数:此方法将对参数内存位置的引用复制到形式参数中。这意味着对参数所做的更改会影响参数 输出参数:此方法有助于返回多个值 我通过下面的示例代码理解了上述类型的传递参数 using System; namespace PassingParameterByReference { class MethodWithReferen

我一直在努力研究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

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

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

int someNum;
someMethod(out someNum); //works
someMethod(ref someNum); //gives compilation error
引用参数的引用(引用对象)可能会被方法更改,也可能不会被方法更改

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

请参见此

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

从技术上的差异来看,要有一个好的可读代码,当方法有多个输出时,应该使用out。和使用ref当方法可能仅使用“Reference”参数更新变量时,需要在方法使用它之前指定值。示例中的X和Y需要在方法之外声明。 e、 g.
int x=100;int y=200

对于“输出”参数,在使用它们之前,不必为参数的值指定值。在您的示例中,X和Y可以在没有为它们指定起始值的情况下声明。
e、 g
intx;int-y

参考和输出参数非常相似。 唯一的区别是
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
编译器实际上会以相同的方式查看
ref
out
关键字。例如,如果不能使用重载方法,其中唯一的区别是
ref
out
关键字

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

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

有用的问题。您声称第二个示例编译并运行,但是我得到两个编译器错误。在
swap
中,关于未分配参数x和y的使用,我修复了您所说的一个错误。上述交换方法正在发挥作用。它们以不同的方式产生相同的输出(通过输出和引用将参数传递给方法)