Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以使用相同的方法(带和不带ref)?_C# - Fatal编程技术网

C# 是否可以使用相同的方法(带和不带ref)?

C# 是否可以使用相同的方法(带和不带ref)?,c#,C#,我有一个采用ref参数的方法。有没有办法通过不将参数作为ref传递来使用相同的方法(无重载)?据我所知,如果方法签名指定ref,那么您需要将参数作为ref传递。这样编译器知道在传递之前需要初始化值,与将某物作为out传递相反,在方法内部初始化/分配它。否。。。您可能需要复制一个要作为参数传入的值,以便ref不会修改您的原始值?否。ref关键字指定方法可以修改传递的值(我相信,如果ref是非值类型,则为reference) 编译器将强制执行参数的“ref ness”,以确保作为使用者,您知道调用后

我有一个采用ref参数的方法。有没有办法通过不将参数作为ref传递来使用相同的方法(无重载)?

据我所知,如果方法签名指定ref,那么您需要将参数作为ref传递。这样编译器知道在传递之前需要初始化值,与将某物作为out传递相反,在方法内部初始化/分配它。

否。。。您可能需要复制一个要作为参数传入的值,以便ref不会修改您的原始值?

否。ref关键字指定方法可以修改传递的值(我相信,如果ref是非值类型,则为reference)

编译器将强制执行参数的“ref ness”,以确保作为使用者,您知道调用后值可能不同

如果您真的不想更改变量,请创建一个副本,并使用该副本调用它

是否有一种方法可以使用相同的方法(无重载),即不将参数作为ref传递

是的,但是这个功能可能对你没有帮助

在C#4中,在调用带有可选ref参数的COM对象时使用“ref”是可选的

此新功能的原因是,有许多旧式COM对象是为与VB6一起使用而设计的。VB6允许您省略ref参数。C#以前没有,这意味着要从C#调用这些方法,必须执行以下操作:

object missing = Type.Missing;
object abc = 10;
foo.Blah(ref missing, ref missing, ref missing, ref abc, ref missing);
恶心。在C#4中,你可以简单地说

foo.Blah( whatever : 10 );
编译器会为你填写所有的参考文献等等


此功能仅适用于传统COM对象,并且仅适用于C#4。在其他情况下,如果签名需要,您仍然必须将内容作为“ref”传递。

亲爱的Eric,您能分享一些包含更多信息的链接吗?这里是foo.Blah(随便什么:10);到底是什么?这是一个你需要指定的类型还是一个关键字请解释?@Ravisha:在C#4中,你可以调用一个方法,通过指定你想通过名称传递的参数来获取可选参数。如果你有M(intx=1,inty=2,intz=0),那么你可以说M(y:123),我们称之为M(1123,0)。