Как проверить версию cocoapods?

C ++ / CLI не имеет эквивалента , используя ключевое слово . Для этого потребовался другой подход, который ожидают программисты на C ++. Кто знаком с очень распространенной идиомой C ++ для реализации детерминированного уничтожения, RAII-шаблона . Вызов этого требует использования «семантики стека». Хорошо работает, требования синтаксиса, однако, довольно неясны.

Сначала я покажу неуклюжий способ, полезный для демонстрации различий синтаксиса. Позволяет использовать StreamReader, одноразовый класс в .NET:

String^ ReadTopLineFromFile(String^ path) {
    StreamReader^ reader = gcnew StreamReader(path);
    try {
        return reader->ReadLine();
    }
    finally {
        delete reader;
    }
}

Try / наконец-то делает код исключительным-безопасным, если ReadLine () генерирует исключение, тогда объект StreamReader все еще расположен, и блокировка файла гарантированно будет выпущена. Это код, который компилятор C # автоматически испускает, когда вы используете оператор using. Также обратите внимание на использование оператора delete, он фактически вызывает метод StreamReader :: Dispose (). Компилятор не позволит вам писать reader->Dispose(), использование оператора является обязательным.

Теперь с использованием версии, которую поддерживает компилятор C ++ / CLI. Вы вызываете семантику стека, эмулируя способ, которым нативный компилятор C ++ рассматривает объект C ++, выделенный в стеке. Например:

String^ ReadTopLineFromFile(String^ path) {
    StreamReader reader(path);
    return reader.ReadLine();
}   // <== disposed here

Обратите внимание на недостающую ^ шляпу на имя переменной, обычно требуемую, когда она хранит ссылку ссылочного типа. Умышленное исключение - это то, что вызывает шаблон. Никакого явного вызова gcnew не требуется, компилятор автоматически испускает его. Также обратите внимание, что вы больше не используете -> для разыменования объекта, теперь вы используете .

Компилятор C ++ / CLI автоматически генерирует блоки try / finally, а также вызов оператора delete. Который испускается при закрывающей скобке блока видимости. Так же, как и собственный компилятор C ++. Хотя выглядит , как управляемый объект выделяется в стеке, это всего лишь синтаксическая иллюзия, он все еще находится в куче GC.

Синтаксис очень отличается, конечно, единственное реальное зависание с функцией. Знание того, когда использовать ^ шляпу и когда полагаться на семантику стека, - это то, что нужно изучить, занимает некоторое время.

18
задан Cœur 25 August 2018 в 22:22
поделиться