Логическая ошибка при преобразовании кода VB.Net в С#

У меня есть этот код VB.Net:

Dim t as String = "111100111000011110111110010111101001100001100011101000001010011100110110100110100000101001110010011001101"
Dim i as Integer
If (t.Length Mod 8) <> 0 Then
    For i = 1 To 8 - (t.Length Mod 8)
        t = "0" + t
    Next
End If

Когда я конвертирую его в С#, он становится:

string t = "111100111000011110111110010111101001100001100011101000001010011100110110100110100000101001110010011001101";

int i = 0;
if ((t.Length % 8) != 0)
{
    for (i = 1; i <= (8 - (t.Length%8)); i++)
    {
        t = "0" + t;
    }
}

Проблема в том, что два кода не совпадают. поэтому код VB.net выполняется 7 раз, а код C# выполняется 4 раза.

Подскажите пожалуйста в чем проблема!


person Alaa Masalmeh    schedule 07.04.2015    source источник
comment
как сказал @GSerg в своем ответе о предварительном вычислении, но этот код вы хотите добавить 0 в начало всей строки, если это не как минимум 8, если я понимаю. вы должны использовать t = t.PadLeft(t.Length + (t.Length % 8),'0'); и все   -  person Franck    schedule 07.04.2015


Ответы (1)


For границы в VB вычисляются заранее и не меняются во время выполнения цикла. Таким образом, t.Length Mod 8 вычисляется один раз, а затем используется это значение.

В C# условие оценивается каждый раз, и поскольку вы продолжаете изменять t, t.Length Mod 8 каждый раз дает новое значение.

Кроме того, поскольку строки в .NET неизменяемы, ваш код создает до 7 копий t. Вы действительно должны сделать это:

Dim diff As Integer = t.Length Mod 8

If diff <> 0 Then
    t = New String("0"c, 8 - diff) & t
End If
person GSerg    schedule 07.04.2015
comment
благодарю вас. теперь работает!!. вот почему мне нравится stackoverflow.com - person Alaa Masalmeh; 07.04.2015