2012-01-27 2 views
7

У меня есть свойство, как это:У свойств всегда есть значение, если оно не установлено?

public Tuple<String, String>[] Breadcrumbs { get; set; } 

и у меня есть тест в одном из моих методов, как это:

if (Breadcrumbs != null && Breadcrumbs.Length > 0) { } 

В зависимости от того, когда этот метод вызывается, Breadcrumbs, возможно, не были установлены , В одном тесте Breadcrumbs == null evaulates to true.

Устранение свойств всегда имеет значение? (Всегда будет null?)

ответ

18

Автоматически реализованное свойство, которое не было явно задано никаким кодом, всегда будет иметь значение по умолчанию для типа свойства - которое является нулевым для ссылочных типов. (Для int это будет 0, для char это будет '\ 0' и т. Д.).

Автоматически реализовано свойство, как это просто эквивалентно:

private PropertyType property; 
public PropertyType Property 
{ 
    get { return property; } 
    set { property = value; } 
} 

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

+2

+1 для «невыразимого имени» :) –

3

Авто-свойства используют поля поддержки и скомпилированы для регулярных свойств.

Если тип свойства является ссылочным типом, значение будет равно null, если значение не будет значением по умолчанию.

2

Переменные элемента класса (называемые полями) и, таким образом, поддерживающие переменные свойств, всегда инициализируются значением по умолчанию, если они явно не инициализированы, то есть null для ссылочных типов. Значение по умолчанию для всех типов - это значение, двоичное представление которого состоит из всех битов, установленных на 0.

С другой стороны, C# требует, чтобы вы явно инициализировали локальные переменные. Это: переменные, объявленные в методах, конструкторах и аксессуарах свойств и параметры метода out; то есть они считаются неопределенными, пока вы не присвоите им значение.

+0

Упс, я кодировал C# до сих пор под впечатлением, что мне нужно инициализировать все или рискнуть найти много случайного мусора. Я думаю, что я буду поддерживать привычку, хотя, поэтому я не делаю одну из этих ужасно тонких ошибок, когда я возвращаюсь к C. – Oliver

+0

Компилятор C# хорош в обнаружении потенциально неинициализированных переменных, поэтому не беспокойтесь слишком много! –

+2

@Oliver: Нет, вы никогда не найдете случайный мусор; менеджер памяти всегда инициализирует его. (В безопасном коде, в небезопасном коде, вы сами по себе. Вот почему он называется «небезопасным».) Однако C# требует, чтобы вы инициализировали все локальные переменные явно до того, как они будут прочитаны; это не мешает вам видеть мусор, это значит, чтобы вы не писали ошибки. –

0

Это невозможно для того, чтобы не иметь значения. Он должен будет что-то вернуть, несколько пучков из 1 и 0, которые, по крайней мере, считаются ссылкой на Tuple<String, String>[], поэтому до такой степени он имеет значение.

Это также случай, когда все поля в классах приготовьтесь их значение по умолчанию (default(T) для любого типа T они, что null для всех ссылочных типов). В противном случае можно было бы иметь объект, который был в состоянии, которое не только не имело никакого смысла с точки зрения его действия, но и не имело никакого смысла в правилах того, что .NET ожидает от объектов. Это включает скрытые поля за автоматическими свойствами.

Теперь на некоторых языках мы можем сделать эквивалент этого:

public Tuple<String, String>[] Breadcrumbs 
{ 
    get 
    { 
    Tuple<String, String>[] whatIWillSend; 
    return whatIWillSend; 
    } 
} 

Если бы это было разрешено, whatIWillSend будет иметь значение, определяемое не любое экономное решением с вашей стороны, но то, что случилось, в памяти в то время. Он может быть нулевым, он может быть действительным Tuple<String, String>[] по чистому совпадению (но не тот, который вы хотели использовать!), может быть Dictionary<int, List<string>>, что время выполнения теперь будет на самом деле Tuple<String, String>[] (там идет безопасность типа всей системы), это может быть четверть структуры decimal. (На языках, которые позволяют такие вещи, также может быть хорошо известно, что отладчики для таких языков устанавливаются в этих случаях именно так, чтобы помочь найти ошибки, вызванные им).

Это самая близкая вещь, которую мы можем получить в собственности, не имеющей значения. Обратите внимание, что это:

  1. Это все равно будет иметь значение, а не значимую ценность.
  2. Нам не разрешено делать это на C# в любом случае.
Смежные вопросы