Является ли тип значения с методами получения и установки все еще типом значения? - PullRequest
1 голос
/ 08 декабря 2010

В C #, если у меня есть следующий код:

public int VarName { get; set; }
  1. Будет ли VarName все еще быть типом значения?

  2. Произойдет ли бокс или распаковка?

  3. Существуют ли какие-либо издержки для хранения ссылок, относящихся к get / set?

Ответы [ 4 ]

3 голосов
/ 08 декабря 2010

Да, это все еще будет тип значения.

Нет, не будет никакого бокса или распаковки (поскольку вы не рассматриваете его как объект).

И нет, никаких накладных расходов нет, поскольку вы не храните ссылки, относящиеся к get / set. Он просто сохраняет int в сгенерированном компилятором вспомогательном поле.

2 голосов
/ 08 декабря 2010

Получатель и установщик на самом деле являются методами, а не полями.Они установят вспомогательное поле типа int (то есть тип значения) и возвратят то же самое вспомогательное поле.

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

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

1 голос
/ 08 декабря 2010

Будет ли VarName по-прежнему иметь тип значения?

Да.

Также будут происходить какие-либо блокировки или распаковки?

Нет, потому что нет преобразования между ссылочным типом и типом значения.

Существуют ли какие-либо издержки для хранения ссылок, относящихся к get / set?

Нет.Компилятор C # автоматически генерирует оптимизированные методы get и set, которые ничего не делают, кроме как извлекают и устанавливают, соответственно, значение сгенерированной компилятором переменной.Как правило, лучше выставлять переменные как свойства, а не как открытые поля, чтобы такие вещи, как привязка данных, работали правильно, и в качестве общего передового опыта.

0 голосов
/ 08 декабря 2010

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

...