2013-05-29 2 views
2

Поскольку я не знаю, как этот тип конструкции даже называется, я не знаю, как начать поиск ответа, поэтому я прошу его напрямую: что такое синтаксис C#, эквивалентный этому коду из C++?Что такое эквивалентный синтаксис этого фрагмента кода C++ в C#?

#define DoExit { \ 
    if (pDialog) delete pDialog; \ 
    if (lib) FreeLibrary(lib); \ 
    if (MadeNew) delete pRS; \ 
    return retval;} 

Это было взято из метода класса, поэтому это встроенное объявление функции, которая будет вызываться позже. На самом деле, вот пример того, где он был использован:

if (pRS->GetSize() == 0) DoExit 

Обратите внимание на отсутствие либо () или прекращения запятой.

Мое первое предположение было какой-то встроенной конструкцией делегата, но я тоже не очень разбираюсь в них, так что это всего лишь предположение.

Так что у вас есть все, что вы C++ гуру!

+3

это макрос C++. в C# нет точно эквивалента, вам просто нужно написать это как некоторую рутину. –

+2

Ну, в C# вы не удаляете указатели, вы позволяете GC управлять памятью, поэтому на C# вы просто ничего не делаете ... – Servy

+2

@Servy Если они не сопоставлены с ресурсами, которые необходимо расположить ... в которых например, вам может понадобиться вызывать 'Dispose()' на них (хотя может также быть и инструкция 'using') –

ответ

1

Это макрос в C++ - вы в основном просто добавить этот код, так что «фактический» код будет:

if (pRS->GetSize() == 0) 
{ 
    if (pDialog) delete pDialog; 
    if (lib) FreeLibrary(lib); 
    if (MadeNew) delete pRS; 
    return retval; 
} 

Там нет никакого способа сделать эквивалент непосредственно в C#. Вам нужно будет развернуть код вручную, затем по мере необходимости передать расширенный код или преобразовать макрос в метод и вызвать его.

+1

Теперь мне просто любопытно ... так как использование метода для этого было бы возможно на C++, зачем вообще использовать макрос? – DonBoitnott

+0

макросы расширяют гарантированный встроенный. Таким образом, вы уверены, что не будет никаких накладных расходов на вызов метода (ключевое слово inline в c/C++ не гарантирует inlining). Вероятно, не причина, почему он используется в этом примере. – Toad

+0

С помощью макроса можно также выполнять мета-программирование. Итак, генераторы кода. Я не уверен, что препроцессор c завершен, но вы можете пройти долгий путь с умными макро-трюками. Разумеется, убедитесь, что человек, который должен поддерживать ваш код, не известен как жестокий; ^) – Toad

0

То, с чем вы столкнулись, называется macro. В C# нет эквивалента.

2

Эквивалент этого кода в C# является

; 

, потому что:

delete something 

делается сборщиком мусора, так нон необходимости делать это. Библиотеки (т. Е. Сборка управляется платформой .NET, так что строго говоря, вы не управляете загрузкой разгрузок сборок, если вы не загружаете неуправляемые библиотеки) Единственная часть, которую вы можете найти, равна FreeLibrary, если вы сделали LoadLibraryP/Invoke где-нибудь еще. В этом случае смотрите здесь: FreeLibrary.

Смежные вопросы