srilekhamenon Ответов: 3

Преобразуйте следующий код C++ в C#


static unsigned int i = (unsigned short)((signed short)GetTickCount());
       if( ~i  & 2 )
       {
           i+=3U;
       }
       else
       {
           i+=5U;
       }

это какой-то код c++, который я хочу преобразовать в c# plz help

Что я уже пробовал:

uint i = GetTickCount();

                if( ~i  & 2 )
                {
                    i+=3U;
                }
                else
                {
                    i+=5U;
                }

3 Ответов

Рейтинг:
2

OriginalGriff

Единственное существенное различие, которое я вижу, - это static на оригинальной и не имеющей эквивалент в C#.
В C и C++ статическая локальная переменная привязана к функции, но ее значение не основано на стеке - оно сохраняется во всех исполнениях метода, поэтому, если вы измените его на этот раз, оно будет иметь новое значение при следующем вызове функции. В C# нет ничего подобного, поэтому ваша переменная должна быть объявлена на уровне класса, С или без static ключевое слово в зависимости от объявления метода.

Но в целом преобразование кода C или C++ непосредственно в C# - плохая идея: вы не получите "хороший C#". Переписать его для использования функций C# и классов .NET обычно гораздо лучше.


Рейтинг:
2

Jochen Arndt

То GetTickCount() вызов используется для получения случайного начального значения, хранящегося в статической переменной (она вызывается только один раз при запуске программы). Кастинг на short ограничит значение до 16 бит (игнорируйте старшие биты).

Вы можете создать статический класс, а также использовать случайный Класс C# для аналогичного поведения :

public class MyClass
{
    static int i;
    static MyClass()
    {
        i = Environment.TickCount() & 0xffff;
        // Or
        //Random random = new Random();
        //i = random.Next(0, 0xffff);
    }
    void DoIt()
    {
       if( ~i  & 2 )
       {
           i+=3U;
       }
       else
       {
           i+=5U;
       }
    }
};


Рейтинг:
1

KarstenK

Это должно сработать, но вы пропустили статический квалификатор. Это приводит в коде C++ к тому, что код только выполняется однажды- то , что я бы назвал запахом или жуком. Я не знаю вашего кода, но думаю, что статика ошибочна.

Кстати: в коде C++ вы ограничиваете количество тиков беззнаковым коротким и поэтому теряете старшие биты, но они вам не нужны для вашего if.