Локальная константа инициализируется нулевой ссылкой - PullRequest
7 голосов
/ 11 мая 2011

Я прочитал, что C # позволяет инициализировать локальные константы нулевой ссылкой, например:

const string MyString = null;

Есть ли смысл в этом, однако?Какие возможные варианты использования это будет иметь?

Ответы [ 6 ]

5 голосов
/ 11 мая 2011

Я предполагаю, что нулевое - это действительное значение, которое может быть присвоено ссылочным типам и типам значений NULL.Я не вижу причин, чтобы запретить это.

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

Ex, возможного полезного использования:

#IF (SILVELIGHT)
    public const string DefaultName = null;
#ELSE
    public const string DefaultName = "Win7";
#ENDIF 
2 голосов
/ 11 мая 2011

Может быть использовано, если вы хотите написать код без ключевых слов, если вам это нравится:

const string UninitializedSetting = null;

if (mySetting == UninitializedSetting)
{
    Error("mySetting string not initialized");
}
2 голосов
/ 11 мая 2011

Действительно, вы можете инициализировать локальные const строки и readonly ссылочные типы для null, даже если это кажется избыточным, поскольку их значение по умолчанию равно null.Факт остается фактом: null - это константа времени компиляции, подходящая для инициализации строк и ссылочных типов.Следовательно, компилятор должен будет изо всех сил , чтобы рассмотреть, идентифицировать и отклонить этот особый случай, даже если он все еще совершенно действителен с точки зрения языка.сделать это будет спорным, и это, вероятно, не стоит усилий, в первую очередь.

1 голос
/ 11 мая 2011

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

Я могу вспомнить случай, когда у вас больше или больше одноразовых данных, чем у кода, но вы хотите, чтобы значения не были случайно полученыизменено во время написания или поддержки вашего кода.Такая ситуация довольно часто встречается в модульных тестах:

[Test]
public void CtorNullUserName()
{
    const string expectedUserName = null;

    var user = new User(expectedUserName);

    Assert.AreEqual(expectedUserName, user.Name, "Expected user name to be unchanged from ctor");
}

Вы, возможно, могли бы структурировать такой код множеством способов, которые не предполагали присвоение null для const, но это все еще допустимоoption.

Это также может быть полезно для решения проблем с перегрузкой методов:

public class Something
{
    public void DoSomething(int? value) { Console.WriteLine("int?"); }
    public void DoSomething(string value) { Console.WriteLine("string"); }
}

// ...

new Something().DoSomething(null); // This is ambiguous, and won't compile

const string value = null;
new Something().DoSomething(value); // Not ambiguous
0 голосов
/ 11 мая 2011

Помимо уже упомянутых ситуаций, это может быть связано с причудой языка C #.Спецификация C # 3.0, раздел 8.5.2 гласит:

Тип и выражение константы объявления локальной константы должны следовать тем же правилам, что и правила объявления константы (§10.4).

И в пределах 10.4 это выглядит следующим образом:

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

0 голосов
/ 11 мая 2011

Если вы используете константы, например, для конфигурации вашего приложения, то почему бы и нет? Значение null может представлять действительное состояние - например, что регистратор не установлен. Также обратите внимание, что когда вы объявляете локальную константу, вы можете инициализировать ее значением, заданным глобальной константой (что может быть более интересным сценарием).

РЕДАКТИРОВАТЬ: Другой вопрос, каковы хорошие ситуации для использования const в любом случае? Для конфигурации вы, вероятно, захотите, чтобы файл конфигурации и другие переменные обычно менялись (если они не являются неизменяемыми, но тогда readonly лучше подходит ...)

...