2016-05-09 9 views
0

Below Zugriff, wenn ich die _currentTemp Variable zu verwenden versuchen, soll das wurde über die Auto-Eigenschaften Funktionalität automatisch generiert werden, habe ich eine Variable nicht gefunden Meldung:den privaten Bereich einer Auto implementiert Eigenschaft

Der Name _currentTemp existiert im aktuellen Kontext nicht.

Mit { get; set; } sollte automatisch diese private Variable (_currentTemp), oder?

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

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

_ "das sollte automatisch über die Auto-Eigenschaften Funcitonality generiert werden" _ - können Sie erklären, was Sie so denken ließ? – CodeCaster

Antwort

8

Backing erstellt Felder, die von Auto-Eigenschaften sind nicht für Sie mit dem Code in Ihrer Quelle zu interagieren, wie es durch den Compiler erzeugt wird.

Wenn Sie mit dem Hintergrundfeld interagieren möchten, müssen Sie Ihre Eigenschaften ausführlich erstellen.

+1

Ein weiterer nützlicher Beitrag: http://stackoverflow.com/questions/40730/how-do-you-give-ac-sharp-auto-property-a-default-value?rq=1 - könnte nützlich sein –

+2

_ "nicht verfügbar für Sie mit in Ihrem Quellcode zu interagieren, wie es vom Compiler generiert wird "_ ist nicht wirklich richtig. Letzteres schließt das erstere nicht aus. Mithilfe der Reflektion können Sie das Feld finden und darauf zugreifen. "nicht [direkt] zugänglich" ist eine richtigere Aussage. – CodeCaster

+0

@CodeCaster: Reflection, mein Erzfeind. – AntiTcb

-2

Basierend auf @ Alex Gravely Antwort ...

Wenn ich für eine volle Eigenschaft Ihre Notwendigkeit bin zu verstehen: Sie volle Eigenschaften und Unterstützung Felder wie folgt erstellen:

private double _currentTemp; 

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

Dann in Ihrem Konstruktor für DogTemperature, brauchen Sie nur die CurrentTemp dem Doppel setzen Sie bestanden:

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

Je nachdem, welche Verwendung Sie erhalten möchten aus der CurrentTemp Eigenschaft - d. h. um sie in einer Ansicht anzuzeigen und zu aktualisieren; Vielleicht möchten Sie in die Implementierung von INotifyPropertyChanged lesen. Hier ist ein Link: https://msdn.microsoft.com/en-us/library/ms229614(v=vs.100).aspx

Wenn es nur eine einfache alte Eigenschaft ist, und nicht für etwas Besonderes verwendet (wie zum Beispiel in einem Modell); dann die

public double DogTemperature { get; set; } 

Eigenschaft wird ausreichen; setze es im Konstruktor wie oben.

Hoffe, das hilft!

-2

Meiner Meinung nach ist es völlig sinnlos, eine Eigenschaft wie diese zu definieren, wenn Sie nur einen Wert speichern möchten.

Alles, was Sie hier tun, gibt dem privaten Kontext zwei Möglichkeiten, den gleichen Wert festzulegen. Sie können das _currentTemp-Feld direkt festlegen, oder Sie können die CurrentTemp-Eigenschaft festlegen, die das _currentTemp-Feld festlegt. Wenn Sie mit der Eigenschaft nichts tun, dann benutzen Sie einfach die Standard-get/set wie folgt aus:

public double CurrentTemp { get; set; } 

Wenn Sie komplexere Arbeiten in der Eigenschaft tun müssen, dann gehen Sie vor und ein Feld wie folgt definieren. Komplexere Arbeiten wie Bedingungen, Berechnungen oder Erhöhung Ereignisse:

double _currentTempFarenheit; 
double _currentTempCelcius; 

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

Außerdem, wenn Sie den Wert Ihrer Immobilie wollen durch den Konstruktor Ihrer DogTemperature Klasse festgelegt werden, dann sollten Sie die Setter privat machen. Dadurch kann die Eigenschaft nur öffentlich gelesen werden.

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

Sie können entweder den Standardwert '{get; einstellen; } ', oder eine komplexere Methode des' get'/'set' Rechnens; aber das hängt von der Nutzung der Immobilie an erster Stelle ab. Die langatmige Full-Property-Methode ist nützlich, wenn Sie PropertyChanged-Ereignisse auslösen müssen - nicht sinnlos. –

+0

@GeoffJames Ja, die Verwendung der PropertyChanged-Ereignisse fällt in das "komplexere" Beispiel, das ich angegeben habe. Wenn Sie nur einen Wert und nichts mehr als dann bieten, ist es sinnlos, den langatmigen Weg zu verwenden. – CathalMF

+0

@CathaIMF: Allein - ja; einverstanden. Auch hier kommt es auf die Nutzung der Immobilie an erster Stelle an. Zum Beispiel: Ich habe keine 'INotifyPropertyChanged' Implementierung in nur Modellklassen und verwende nur' {get; einstellen; } 'Erklärung. Offensichtlicher; Es macht Sinn, diese Eigenschaften in ViewModels zu haben –

Verwandte Themen