2016-05-09 2 views
0

Ниже, когда я пытаюсь использовать переменную _currentTemp, который должен был быть автоматически генерируется посредством функции автоматического свойств, я получаю переменную не найден сообщение:Доступ к частной области авто Реализуемый собственности

В текущем контексте имя _currentTemp не существует.

Использование { get; set; } должно автоматически создать эту приватную переменную (_currentTemp), справа?

public class DogTemperature 
{ 
    public double CurrentTemp { get; set; } 

    public DogTemperature(double dCurrentTemp) 
    { 
     _currentTemp = dCurrentTemp; //***this line*** 
    } 
} 
+0

_ ", который должен был быть сгенерирован автоматически с помощью функции свойств свойств" _ - Вы можете объяснить, что заставило вас так думать? – CodeCaster

ответ

8

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

Если вы хотите взаимодействовать с полем поддержки, вам нужно будет создать свои свойства многословным способом.

+1

Другое полезное сообщение: http://stackoverflow.com/questions/40730/how-do-you-give-ac-sharp-auto-property-a-default-value?rq=1 - может быть полезно –

+2

_ "not доступный для вас, чтобы взаимодействовать с исходным кодом, поскольку он генерируется компилятором «_ на самом деле не так. Последнее не исключает первого. Используя отражение, вы можете найти и получить доступ к полю. «не [напрямую] доступный» является более правильным утверждением. – CodeCaster

+0

@CodeCaster: Отражение, мой заклятый враг. – AntiTcb

-2

На основании ответа @Alex Gravely в ...

Если я понять вашу необходимость полной собственности: вы можете создавать полные свойства и отступающие поля, как это:

private double _currentTemp; 

public double CurrentTemp 
{ 
    get { return _currentTemp; } 
    set { _currentTemp = value; } 
} 

Тогда в вашем конструктор для DogTemperature, вам просто нужно установить CurrentTemp к двойному переданному в:

public void DogTemperature(double temp) 
{ 
    DogTemperature = temp; 
} 

в зависимости от того, что использование вы хотите получить из свойства CurrentTemp - то есть для отображения в представлении и его обновлении; вы, возможно, захотите ознакомиться с внедрением INotifyPropertyChanged. Вот ссылка: https://msdn.microsoft.com/en-us/library/ms229614(v=vs.100).aspx

Если это простое старое свойство и не используется ни для чего особого (например, в модели); то

public double DogTemperature { get; set; } 

недвижимости достаточно; устанавливая его в конструкторе, как указано выше.

Надеюсь, это поможет!

-2

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

double _currentTemp; 
public double CurrentTemp 
{ 
    get { return _currentTemp; } 
    set { _currentTemp = value; } 
} 

Все, что вы здесь делаете, дает частному контексту два способа установить одно и то же значение. Вы можете установить поле _currentTemp напрямую, или вы можете установить свойство CurrentTemp, которое задает поле _currentTemp. Если вы ничего не делаете со свойством, то просто использовать по умолчанию получить/установить, как это:

public double CurrentTemp { get; set; } 

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

double _currentTempFarenheit; 
double _currentTempCelcius; 

public double CurrentTemp 
{ 
    get 
    { 
     if(UseFarenheit) 
      return _currentTempFarenheit; 
     else 
      return _currentTempCelcius; 
    } 
    set 
    { 
     if(UseFarenheit) 
      _currentTempFarenheit = value; 
     else 
      currentTempCelcius = value; 
    } 
} 

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

public double CurrentTemp { get; private set; } 
+0

Вы можете использовать либо '' get; задавать; } 'или более сложный способ вычисления' get'/'set'; но это зависит от использования собственности в первую очередь. Метод long-winded full property полезен, если вам нужно поднимать события PropertyChanged - не бессмысленно вообще –

+0

@GeoffJames Да, конечно, использование событий PropertyChanged относится к «более сложному» примеру, который я дал. Если вы просто предоставляете ценность и не более, то ее бессмысленно использовать длинный путь. – CathalMF

+0

@CathaIMF: сам по себе - да; согласовано. Опять же, это зависит от использования собственности в первую очередь. Например: я обычно не имею реализацию 'INotifyPropertyChanged' только в классах моделей и использую только' {get; задавать; } '. Более очевидно; имеет смысл иметь такие свойства в ViewModels –

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