Почему не может nullables быть объявленным константой?

установка DEFAULT_SCHEMA в sys.database_principles

  • SQL Server предоставляет большой гибкости определение имен. Однако определение имен происходит в стоимость и может стать заметно дорогим в специальных рабочих нагрузках, которые не полностью определяют ссылки на объект. 2005 SQL Server позволяет новую установку DEFEAULT_SCHEMA для каждого принципа базы данных (также известный как “user”), который может устранить эти издержки, не изменяя Ваш код TSQL.

Ссылка

14
задан Markus Jarderot 22 July 2015 в 11:56
поделиться

5 ответов

Это не просто значения NULL; только типы, встроенные в среду выполнения, могут быть объявлены const (из памяти, это bools, различные типы int, float / double и строки).

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

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

Изменить: ] как указывает Эрик Липперт, все не так просто. Например, const decimal работает.

Это:

private const decimal TheAnswer = 42;

... компилируется (ну, Reflectors) в это:

[DecimalConstant(0, 0, (uint) 0, (uint) 0, (uint) 42)]
private static readonly decimal TheAnswer;
20
ответ дан 1 December 2019 в 06:28
поделиться

http://en.csharp-online.net/const,_static_and_readonly

Константы должны быть целочисленного типа (sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool или string), перечисление или ссылка на null.

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

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

13
ответ дан 1 December 2019 в 06:28
поделиться

У вас не может быть ссылочного типа const (или структуры), поэтому у вас не может быть const int? который на самом деле является просто Nullable .

Вы можете пометить его как readonly

readonly int? projectID = null;

Тогда его нельзя будет изменить вне конструкторов класса.

8
ответ дан 1 December 2019 в 06:28
поделиться

Вы можете вместо этого рассмотреть возможность использования модификатора "readonly".

const s вычисляются во время компиляции, тогда как readonly s принудительно применяются при запуске время. Экземпляры сложных типов не могут быть скомпилированы в сборку, поэтому должны быть созданы во время выполнения.

3
ответ дан 1 December 2019 в 06:28
поделиться

Вы в основном говорите:

У меня есть класс с полем projectId. это может иметь или не иметь значение, но что на самом деле НИКОГДА не имеет ценности, это всегда не определено.

С логической точки зрения ... само объявление не имеет смысла.

3
ответ дан 1 December 2019 в 06:28
поделиться
Другие вопросы по тегам:

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