Трехстороннее объединение с агрегацией с использованием HIVE и HDFS

Если на какой-то момент мы не будем игнорировать проблему контрольного блока, то в ситуации, которая недостаточно четко определена, сложнее будет работать намного сложнее. Хотя это не невозможно, ошибка определения области охвата также заставляет вас, автора кода, реализовать импликацию кода, который вы пишете (что строка s может быть нулевой в блоке catch). Если ваш код был законным, в случае исключения OutOfMemory s даже не гарантированно выделяется слот памяти:

// won't compile!
try
{
    VeryLargeArray v = new VeryLargeArray(TOO_BIG_CONSTANT); // throws OutOfMemoryException
    string s = "Help";
}
catch
{
    Console.WriteLine(s); // whoops!
}

CLR (и, следовательно, компилятор) также заставляет вас инициализировать переменные прежде чем они будут использованы. В представленном блоке catch он не может этого гарантировать.

Итак, мы получаем компилятор, который должен много работать, что на практике не приносит большой пользы и, вероятно, путает людей и побуждает их спрашивать, почему try / catch работает по-разному.

В дополнение к согласованности, не позволяя ничего фантазии и придерживаясь уже установленной семантики семантики, используемой на всем языке, компилятор и CLR могут обеспечить большую гарантию состояния переменной внутри catch блок. Это означает, что он существует и был инициализирован.

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

например с использованием ключевого слова с объектами IDisposable в:

using(Writer writer = new Writer())
{
    writer.Write("Hello");
}

эквивалентно:

Writer writer = new Writer();
try
{        
    writer.Write("Hello");
}
finally
{
    if( writer != null)
    {
        ((IDisposable)writer).Dispose();
    }
}

Если ваш try / catch / наконец-то трудно понять, попробуйте рефакторинг или введите другой слой косвенности с промежуточным классом, который инкапсулирует семантику того, что вы пытаетесь выполнить. Не видя реального кода, трудно быть более конкретным.

0
задан Brian Gurka 18 January 2019 в 17:17
поделиться