我一直在努力研究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的值
这些示例代码以不同的方式执行相同的操作。而且我无法理解两种方法之间的区别。(通过输出和参考将参数传递给方法)。两个示例的输出是相同的。这个小差异是什么?
答案 0 :(得分:7)
在调用方法之前不必初始化输出参数,就像参考参数的情况一样。
int someNum;
someMethod(out someNum); //works
someMethod(ref someNum); //gives compilation error
此外,需要在方法中设置或更改输出参数,这对于参考参数不是必需的。
答案 1 :(得分:3)
使用“Reference”参数时,需要在方法可以使用之前分配值。您的示例中的X和Y需要在方法之外声明。
例如int x; int y;
使用“输出”参数时,不必为参数值分配值,然后才能使用它们。可能已在您的示例中声明了X和Y,但没有为其分配起始值。
例如command [subcommand] [options] [files]
答案 2 :(得分:2)
输出参数需要在方法内更改它的值,否则编译器会抛出错误。
参考参数可能会或可能不会通过该方法更改它的参考(参考对象)。
此外,值类型(在结构中定义的类型)不能通过引用传递。
答案 3 :(得分:1)
请参阅此What's the difference between the 'ref' and 'out' keywords?
不同之处在于,对于out参数,您必须在离开方法之前设置它。因此,即使您在调用方法之前没有将其设置为任何值,编译器也会知道它将在方法调用期间获取值。
来自技术差异的公寓,要有一个良好的可读代码,你应该在方法有多个输出时使用。并且当方法可以更新变量时使用ref
答案 4 :(得分:1)
参考和输出参数非常相似。
唯一的区别是必须初始化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){};