2009-07-13 3 views
6

Ich verwende VS 2008, und auf meinen Eigenschaftenseiten für das Projekt sehe ich, dass ich auf .Net 3.5 abziele. HierAutomatische Eigenschaften in C# 3 - Muss einen Körper für get deklarieren, wenn ich einen für Satz deklariere?

ist der Fehler, den ich immer bin, wenn sie versuchen zu kompilieren:

AMSDataModels.Vehicle.VIN.get‘muss einen Körper erklären, weil es nicht abstrakt markiert ist, extern oder teilweise

Und hier ist der Code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace AMSDataModels 
{ 
    public class Vehicle 
    { 
     //NodeID for datastore persistance 
     public Guid NodeID { get; set; } 

     public string VIN { get; 
      set { 
       if (value.Length != 17) throw new ArgumentOutOfRangeException("VIN", "VIN must be 17 characters"); 
      } } 

     public string Make { get; set; } 
     public string Model { get; set; } 
    } 
} 

Wenn ich den Körper von Satz Streifen, so dass seine gerade:

public string VIN { get; set; } 

Alles funktioniert, aber ich verliere meine Fähigkeit, die VIN zu überprüfen, wie es eingestellt ist.

Hat jemand einen Vorschlag, wie man diesen oder einen besseren Weg, um das Problem zur Hand zu gehen beheben?

Ich mag wirklich die Kurzschreibweise - aber die Legitimität der Eingabe zu überprüfen ist auch wichtig!

+0

Vielen Dank an alle, die bemerkt haben, dass ich den Wert nicht wirklich irgendwo gesetzt habe - ehrlich gesagt hatte ich noch nicht herausgefunden, was die lokale Variable, die der Compiler erstellt hat, genannt wurde. Gibt es ein spezielles Keyword? – Matt

+1

Kein spezielles Schlüsselwort - es gibt keine Möglichkeit, vom Compiler auf die automatisch erzeugten Daten zuzugreifen. Was macht denn die Macht des generierten Codes ist in seiner Einfachheit und die Fähigkeit des Compilers, genau zu wissen, wie es zugegriffen wird. Wenn Sie das automatische Feld definieren oder darauf zugreifen konnten, konnte der Compiler nicht annähernd so viele Annahmen über seine Verwendung treffen. –

+0

Sie werden auf das gleiche Problem stoßen, wenn Sie versuchen, INotifyPropertyChanged zu verwenden, die Schönheit der automatischen Eigenschaften ist schnell verloren :( – Nate

Antwort

17

Wenn Sie Logik in das Set einfügen, müssen Sie es auch in das Get hinzufügen. Beachten Sie, dass Sie in Ihrem Set keinen Wert für irgendwas setzen?

ein Trägerfeld hinzufügen,

private string _vin; 

und zurück, dass in der get.

public string VIN 
{ 
    get { return _vin; } 
    set 
    { 
     if (value.Length != 17) 
     throw new ArgumentOutOfRangeException("VIN", "VIN must be 17 characters"); 
     else 
     _vin = value; 
    } 
} 
+0

Danke, ich denke, meine erste Priorität war sicherzustellen, dass ich nicht unnötige Arbeit machte das private Feld oder wasn 't irgendwie versuchen, die automatischen Eigenschaften falsch zu verwenden – Matt

+0

Eigentlich müssen Sie nicht ein Feld erstellen nur VIN zurückgeben :) –

+5

"Return VIN"? Das wäre eine rekursive Funktion, es sei denn, ich vermisse etwas Offensichtliches ... –

3

Ja, Sie müssen die Implementierung ebenfalls deklarieren. Oh, und dein Set-Code macht nichts anderes als Validierung. Sie müssen dafür auch zusätzliche Implementierungen bereitstellen, vorausgesetzt, Sie möchten den Wert festlegen, wenn er die Validierung besteht.

Wenn Sie mehr als nur grundlegende Get/Set-Implementierung benötigen, müssen Sie die gesamte Eigenschaft implementieren, nicht nur den Unterschied.

6

Wenn automatische Eigenschaften verwendet werden, generiert der Compiler automatisch ein Backer-Feld. Wenn Sie eine eigene Methode deklarieren, können Sie nicht wissen, welches Feld für die Methode get verwendet werden soll. Sie müssen also beide oder keine deklarieren.

Übrigens, Ihre aktuelle set-Methode prüft nur auf den Wert - es wird es nie wirklich etwas zugewiesen.

+0

Zurück zur IDE Ich denke - danke. – Matt

2

Sie müssen das gute alte Hintergrundfeld verwenden. Die Kurzschreibweise kann nicht gemischt werden. Der einzige zusätzliche Spaß ist es, den Zugriffsmodifikator beim Abrufen und Einstellen zu ändern, z. bekommen; privates Set;

Verwandte Themen