2015-10-04 6 views
0

Извините, если мой вопрос в значительной степени о стиле кода, но для простых случаев, который из нижеперечисленного лучше?C# - auto-properties VS pre-3.0 свойства

СЛУЧАЙ 1:

private static int number = 1; 
public static int Number 
{ 
    get { return number; } 
    set { number = value; } 
} 

СЛУЧАЙ 2:

public static int Number 
{ 
    get; 
    set; 
} 

Я думаю, что случай 2 лучше, потому что, когда у вас есть много свойств в классе они не будут потреблять так много места и тому размер файла будет уменьшен.

+1

Почему бы вам не задать вопрос, который, как вы знаете, не по теме (в противном случае это то, что «извините») и не показывать подробности о ваших исследованиях по этой теме? По крайней мере, изучение собственного имени «автоматических свойств» было бы приятным прикосновением. Я бы рекомендовал прочитать результаты serach - то есть https: //www.bing.com/search? Q = C% 23 + - + свойства + против + автоматические + свойства ... –

+0

Одно небольшое уведомление: в случае A значение по умолчанию для 'Number' равно 1, а в случае B - 0 – nZeus

+0

Да, я инициализировал его 1 для примера. –

ответ

1

Синтаксис ниже называется auto properties, это не имеет значения в терминах размера файла поскольку во время компиляции, поля генерируется в любом случае (см, декомпиляция в конце ответа) и есть get и set методы в результатах компиляции в обоих случаях.

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

Мы оставим в стороне «В поле без автоматической собственности вы можете присвоить значение по умолчанию» тему для второго (also, it is possible now in auto-properties too in c# 6.0), иногда, вы хотите запустить некоторый код внутри get или set методов собственности , как применение event ручки или проверки значения, что там стандартное объявление собственности входит в картину, например:

private int mNumber; 

public int Number 
{ 
    get 
    { 
     return Number; 
    } 
    set 
    { 
     if (Number == 8) 
     { 
      throw new CannotReceive8Exception(); 
     } 
     else 
     { 
      mNumber = value; 
     } 
    } 
} 

Если посмотреть на декомпилированный код этого кода:

public int Number { get; set; } 

Вы увидите, что компилятор добавил фон частное поле в любом случае:

Fields

+0

Я был бы осторожен с этой ссылкой, некоторые из этих функций были удалены (конструкторы основного тела). –

+0

Как я уже сказал, мой ответ игнорирует тот факт, что авто-свойства могут иметь или не иметь эту функцию по умолчанию. –

0

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

public int Num {get;set;} 

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

Смежные вопросы