通过ref不参与从vb.net到c#的转换

时间:2015-04-02 23:12:33

标签: c# vb.net pass-by-reference

我正在尝试使用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)

我收到错误,有一些论据我可以看到的是类型,但我不确定我应该在这一点做什么,任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

在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);

这将适用于您的方法调用。

由于您的函数返回了它正在修改的值,因此将参数作为ref传递并不是真的有意义。这是VB中允许的常见的草率编码,但C#将更加严格。并且你不想在任何地方调用ToString,因为将零加前缀到数字可能是有意义的。所以你应该考虑将函数声明改为:

public string prefixZeros(int number, int stringLength)

但是,如果您要将大型代码库从VB转换为C#,您将需要检查忽略返回值的调用,因为他们希望修改参数。

答案 1 :(得分:1)

string RandomString = RandomClass.Next(0, 999999999).toString().PadLeft(9, '0');