Компилятор C# предоставляет конструктора по умолчанию для ссылочных типов (если один не указанный), или CLR?

Едва умный, но достойная практика, возможно. В C/C++:

Всегда возврат из функции внизу, никогда в середине. Единственным исключением к этому является проверка на пустой указатель на обязательных аргументах; это всегда на первом месте и сразу возвращается (иначе, я просто записал бы большое, "если" условие наверху, которое просто выглядит глупым).

int MyIntReturningFuction(char *importantPointer)
{
    int intToReturn = FAILURE;
    if (NULL == importantPointer)
    {
        return FAILURE;
    }
    // Do code that will set intToReturn to SUCCESS (or not).
    return intToReturn;
}

я видел много аргументов в пользу того, почему это действительно не имеет значения, но лучшим аргументом в пользу меня является просто опыт. Слишком часто я царапал голову, спрашивая, "Почему heck не делает моей точки останова около нижней части этой функции, поражены?" только, чтобы найти, что кто-то другой, чем я поместил возврат где-нибудь выше (и обычно изменяющий некоторое условие, которое должно было быть оставлено в покое).

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

5
задан raven 5 September 2009 в 14:34
поделиться

2 ответа

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

Итак, конструктор по умолчанию будет предоставлен компилятором C # за вас.

11
ответ дан 18 December 2019 в 13:16
поделиться

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

.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
    .maxstack 8
    L_0000: ldarg.0 
    L_0001: call instance void [mscorlib]System.Object::.ctor()
    L_0006: ret 
}

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

3
ответ дан 18 December 2019 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: