C# 在C语言中,通过输出和通过引用传递参数有什么区别#
我一直在努力研究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
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、 gintx;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的使用,我修复了您所说的一个错误。上述交换方法正在发挥作用。它们以不同的方式产生相同的输出(通过输出和引用将参数传递给方法)