通过 ref 不处理从 vb.net 到 c# 的转换
Pass by ref not working on convesion from vb.net to c#
我正在尝试从以前的开发人员那里编写一些代码,这些代码是在 Vb.Net 中编写的,他创建了以下方法来传递字符串方法 ByRef,如下所示:
Function prefixZeros(ByRef numberString As String, ByVal stringLength As Integer) As String
While numberString.Length < stringLength
numberString = "0" & numberString
End While
Return numberString
End Function
他后来这样称呼它:
Dim RandomClass As New Random()
Dim RandomNumber As Integer
RandomNumber = RandomClass.Next(0, 99999999)
Dim RandomString As String = prefixZeros(RandomNumber, 8)
和
Dim terminalId As String = System.Configuration.ConfigurationManager.AppSettings("terminalId").ToString()
terminalId = prefixZeros(terminalId, 8)
或
prefixZeros(DateTime.Now.Month, 2)
我正在尝试在 C# 中复制这段代码,但到目前为止我一直无法做到,在转换 prefixZeros 方法时我有以下内容:
public string prefixZeros(ref string numberString, int stringLength)
{
while (numberString.Length < stringLength)
{
numberString = "0" + numberString;
}
return numberString;
}
但是如果我尝试以类似的方式调用它:
Random RandomClass = new Random();
int RandomNumber = 0;
RandomNumber = RandomClass.Next(0, 999999999);
string RandomString = prefixZeros(RandomNumber, 9);
或
string terminalId = System.Configuration.ConfigurationManager.AppSettings["terminalId"].ToString();
terminalId = prefixZeros(terminalId, 8);
或
prefixZeros(DateTime.Now.Month, 2)
我收到一些错误,我可以看到一些参数是类型,但我不确定此时我应该做什么,任何帮助将不胜感激
在 C# 中,要将参数作为 ref 传递,您必须在调用站点以及方法定义中指定:
string RandomString = prefixZeros(ref RandomNumber, 9);
除了...你不能那样做,因为 RandomNumber
是一个 int
并且该函数需要一个字符串。通常,在 C# 中,您可能会像这样处理类型转换:
string RandomString = prefixZeros(RandomNumber.ToString(), 9);
除了不适用于 ref
,因为 ToString
的结果只是一个临时值!我猜您正在查看的 VB 代码没有 Option Strict On
。否则 VB 会自动将数字转换为临时字符串,并且 VB 将临时字符串发送到 ByRef
参数也没有问题。另一方面,C# 不允许将临时值传递给 ref
参数。所以你可以这样做:
string numberAsString = RandomNumber.ToString();
string RandomString = prefixZeros(ref numberAsString, 9);
这将适用于您的方法调用。
由于您的函数 return 是它正在修改的值,因此将参数作为 ref
传递确实没有意义。这是 VB 中允许的一种常见的草率编码,但 C# 将更加严格。而且您不想在任何地方都调用 ToString
,因为它可能只在数字前加上零才有意义。所以你应该考虑将函数声明更改为:
public string prefixZeros(int number, int stringLength)
但是,如果您将大型代码库从 VB 转换为 C#,您将需要检查忽略 return 值的调用,因为它们希望参数被修改。
string RandomString = RandomClass.Next(0, 999999999).toString().PadLeft(9, '0');
我正在尝试从以前的开发人员那里编写一些代码,这些代码是在 Vb.Net 中编写的,他创建了以下方法来传递字符串方法 ByRef,如下所示:
Function prefixZeros(ByRef numberString As String, ByVal stringLength As Integer) As String
While numberString.Length < stringLength
numberString = "0" & numberString
End While
Return numberString
End Function
他后来这样称呼它:
Dim RandomClass As New Random()
Dim RandomNumber As Integer
RandomNumber = RandomClass.Next(0, 99999999)
Dim RandomString As String = prefixZeros(RandomNumber, 8)
和
Dim terminalId As String = System.Configuration.ConfigurationManager.AppSettings("terminalId").ToString()
terminalId = prefixZeros(terminalId, 8)
或
prefixZeros(DateTime.Now.Month, 2)
我正在尝试在 C# 中复制这段代码,但到目前为止我一直无法做到,在转换 prefixZeros 方法时我有以下内容:
public string prefixZeros(ref string numberString, int stringLength)
{
while (numberString.Length < stringLength)
{
numberString = "0" + numberString;
}
return numberString;
}
但是如果我尝试以类似的方式调用它:
Random RandomClass = new Random();
int RandomNumber = 0;
RandomNumber = RandomClass.Next(0, 999999999);
string RandomString = prefixZeros(RandomNumber, 9);
或
string terminalId = System.Configuration.ConfigurationManager.AppSettings["terminalId"].ToString();
terminalId = prefixZeros(terminalId, 8);
或
prefixZeros(DateTime.Now.Month, 2)
我收到一些错误,我可以看到一些参数是类型,但我不确定此时我应该做什么,任何帮助将不胜感激
在 C# 中,要将参数作为 ref 传递,您必须在调用站点以及方法定义中指定:
string RandomString = prefixZeros(ref RandomNumber, 9);
除了...你不能那样做,因为 RandomNumber
是一个 int
并且该函数需要一个字符串。通常,在 C# 中,您可能会像这样处理类型转换:
string RandomString = prefixZeros(RandomNumber.ToString(), 9);
除了不适用于 ref
,因为 ToString
的结果只是一个临时值!我猜您正在查看的 VB 代码没有 Option Strict On
。否则 VB 会自动将数字转换为临时字符串,并且 VB 将临时字符串发送到 ByRef
参数也没有问题。另一方面,C# 不允许将临时值传递给 ref
参数。所以你可以这样做:
string numberAsString = RandomNumber.ToString();
string RandomString = prefixZeros(ref numberAsString, 9);
这将适用于您的方法调用。
由于您的函数 return 是它正在修改的值,因此将参数作为 ref
传递确实没有意义。这是 VB 中允许的一种常见的草率编码,但 C# 将更加严格。而且您不想在任何地方都调用 ToString
,因为它可能只在数字前加上零才有意义。所以你应该考虑将函数声明更改为:
public string prefixZeros(int number, int stringLength)
但是,如果您将大型代码库从 VB 转换为 C#,您将需要检查忽略 return 值的调用,因为它们希望参数被修改。
string RandomString = RandomClass.Next(0, 999999999).toString().PadLeft(9, '0');