通过 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');