C# 可选功能参数,默认值参照
通过将VB.NET编写的代码自动转换为C#我在VB.NET的函数声明中有这样的情况:C# 可选功能参数,默认值参照,c#,vb.net,C#,Vb.net,通过将VB.NET编写的代码自动转换为C#我在VB.NET的函数声明中有这样的情况: Private Function dataArchiver(ByVal toPlace As String, Optional ByVal aExtension As String = ".7z", Optional ByRef createdName As String = "")
Private Function dataArchiver(ByVal toPlace As String,
Optional ByVal aExtension As String = ".7z",
Optional ByRef createdName As String = "") As Integer
用于自动转换的工具在C#中执行此操作:
这当然行不通。最后一个参数前的关键字“ref”用红色下划线。
为什么会这样?因为字符串createdName可能(不必)在函数中生成,在这种情况下必须从函数中传递出去。
这段代码可以与NETFramework3.5一起使用,这一点很重要
有没有办法在不太熟悉VB.NET程序的情况下在C#中实现此功能?在这种情况下,您可以使用
out
关键字:
string createdName;
int retVal = dataArchiver("to place", out createdName, extension);
还有你的新方法签名
private int dataArchiver(string toPlace,
out string createdName,
string aExtension = ".7z")
{
createdName = "some value";
// rest of your code
}
唯一的变化是,
out
不能有方法签名默认值,因此您需要在方法内部设置它。您必须为此创建重载方法(在C#获取可选参数功能之前,您必须这样做):
我认为C不支持
ref
params的默认值。他们毕竟是不同的语言。解决方案是什么?假设一个null
值,或者创建一个传递空字符串的dataArchiver
重载。是的,谢谢,不是很优雅,但重载似乎可以解决。以后使用另一个工具-转换为[ref string createdName=”“]是一个糟糕的转换(因为它无法编译)。您确定原始VB.NET代码实际上需要字符串为ByRef
?方法或它调用的东西是否实际更改了对字符串的引用?因此,如果调用方将myCreatedName
作为该参数传递,调用dataArchiver
后myCreatedName
是否会有所不同?是的,可以更改dataArchiver内部的createdName,并且在离开此函数后,程序应该知道它是否已更改或更精确地创建(不是空的).我不确定这是否能满足所有需求,我无法测试,因为自动转换仍然会产生很多问题。你知道VisualBasicNet中关键字“out”的哪一个等价物吗?在VB中没有可比性的东西,但由于ByRef
在VB中的工作方式,它似乎可以互换。是的,我已经按照“ByteBlast”的建议进行了测试,这可能会起作用,谢谢。但是,通过这个解决方案,我们遇到了一个问题,即使用任何最常用的工具都无法自动翻译具体的代码和平?@user973238:尝试一些,你会发现有些翻译正确,有些则不正确。
private int dataArchiver(string toPlace,
out string createdName,
string aExtension = ".7z")
{
createdName = "some value";
// rest of your code
}
private int dataArchiver(string toPlace, string aExtension)
{
string tempVar = "";
return dataArchiver(toPlace, aExtension, ref tempVar);
}
private int dataArchiver(string toPlace)
{
string tempVar = "";
return dataArchiver(toPlace, ".7z", ref tempVar);
}
private int dataArchiver(string toPlace, string aExtension, ref string createdName)
{
return 0;
}