C # & VB6: Как преобразовать оператор 'with' в C #? - PullRequest
6 голосов
/ 15 января 2010

Как я могу преобразовать этот кусок кода VB6 в C #?

http://pastebin.com/f16e19351

Я попробовал самостоятельно и дошел до:

http://pastebin.com/f7ca199f0

РЕДАКТИРОВАТЬ: Код, который я пытаюсь перевести, существует здесь: http://www.codeproject.com/KB/vb-interop/MouseHunter.aspx

Ответы [ 9 ]

7 голосов
/ 15 января 2010

Вы не показали код EventThief, что делает невозможным его на самом деле узнать. Но в целом:

With expression
   .Foo = a
   .Bar = b
End With

будет переводиться на

var x = expression;
x.Foo = a;
x.Bar = b;

(Конечно, вы можете указать тип явно ...)

Общность здесь в том, что expression оценивается только один раз. В конкретном коде, который вы показали, дополнительная переменная, разумеется, не нужна, поскольку выражение только локальная переменная в первую очередь.

Ваша настоящая ошибка выглядит так, как будто она связана с типами EventThief.RIGHT_DOWN и т. Д., А не с оператором WITH.

РЕДАКТИРОВАТЬ: Хорошо, теперь вы показали оригинальный код EventThief, который использует использует логические значения ... но вы не показали свой портированный EventThief код. Вы написали:

Там написано, что et.LEFT_UP - короткий

... но так не должно быть. В оригинале это Boolean, так почему же это short в вашем порту?

4 голосов
/ 15 января 2010

следующее в VB

With EventStealingInfo
    .RIGHT_DOWN = True
    .RIGHT_UP = True
End With

можно грубо перевести на

var EventStealingInfo = new EventThief(){
    RIGHT_DOWN = true,
    RIGHT_UP = true
};

, где RIGHT_UP и RIGHT_DOWN - публичные свойства в классе EventStealingInfo.

Эта конструкция в C # известна как Инициализатор объекта .

2 голосов
/ 15 января 2010

Вроде так

With EventStealingInfo
    .RIGHT_DOWN = True
    .RIGHT_UP = True
End With

становится

EventStealingInfo.RIGHT_DOWN = true;
EventStealingInfo.RIGHT_UP = true;
1 голос
/ 15 января 2010

Могу ли я позвонить по вашему предложению Вариант А .

  1. Взять сообщество Код VB6 , который создает DLL для работы с перехватчиками Windows.
  2. Переведите это на C #

Могу ли я предложить вариант B и вариант C, который, я думаю, будет проще?

Вариант B
1. Начните с кода Microsoft C # для работы с хуками Windows.
2. При необходимости измените его, посмотрев на то, что API называет кодом VB6 .

Вариант C
1. Возьмите встроенную библиотеку VB6 из кода сообщества .
2. Вызовите эту DLL из вашего нового приложения на C # через Interop .

1 голос
/ 15 января 2010

Я думаю, что ближе вы можете пойти:

EventThief EventStealingInfo = new EventThief()
{
    RIGHT_DOWN = true,
    RIGHT_UP = true
};
0 голосов
/ 15 января 2010

Ключевое слово "with" - это просто ярлык для сохранения повторного ввода имени переменной при настройке нескольких свойств. В C # нет эквивалента.

Даже если бы она существовала, у вас все равно была бы проблема, которая, по-видимому, вы пытаетесь присвоить логическому значению для короткого типа данных.

Что находится в классе EventThief? Можете ли вы просто сделать поля LEFT_UP булевыми вместо этого?

0 голосов
/ 15 января 2010

Разве вы не можете просто изменить тип LEFT_UP на bool?

смотря на ваш код и то, как вы используете EventThief, вы можете использовать перечисление флагов, чтобы вы могли устанавливать отдельные биты и затем выполнять побитовые сравнения.

0 голосов
/ 15 января 2010

Нет эквивалента в C #.

0 голосов
/ 15 января 2010

Насколько я знаю, в C # нет эквивалента With, и вам нужно явно перечислить объект при обращении к его функциям / свойствам-членам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...