Ich verwende .NET 4.5 in einem VSTO-Addin für Outlook 2013. Ich habe Probleme, Eigenschaften und Zugriffsmethoden vollständig zu erfassen. Automatisch implementierte Accessoren, die ich annehme, wenn du gerade schreibst, bekommst; einstellen; anstatt {// code} usw. zu bekommen, bereitet mir auch Schwierigkeiten. Ich habe ein Wörterbuch, das ich intern in meiner Klasse verwende. Hier ist mein Code:Eigenschaften und automatische Implementierungen
private Dictionary<string, string> clientDict { get; set; }
private Dictionary<string, string> clientHistoryDict { get; set; }
dann später:
clientDict = new Dictionary<string, string>();
clientHistoryDict = new Dictionary<string, string>();
ich die gleichen Namen verwenden wie die Eigenschaften im Code später, innerhalb der gleichen Klasse.
Ich schreibe eigentlich nie:
private Dictionary<string, string> _clientDict; // etc.
die Variablen erstellen ich direkt die Eigenschaft nur wurde mit.
Ich habe versucht, meinen Code zu ändern, um dies zu tun, und ich hatte einige Probleme und erkannte, dass mein Verständnis von Eigenschaften ein wenig durcheinander ist.
Hier sind ein paar Fragen, die ich geklärt haben muss, dass ich nicht scheinen kann, die richtige Antwort zu finden.
Erstens, gibt es einen Grund, ein Privateigentum zu benutzen? Auf meine Wörterbücher wird niemals außerhalb der Klasse oder in abgeleiteten Klassen zugegriffen. Gibt es also einen Grund, Eigenschaften zu verwenden? Ich verwende keine spezielle Validierung oder irgendetwas im Setter oder so etwas.
Zweitens, als ich versuchte, meinen Code zu ändern, um Variablen zu verwenden und dann über die Eigenschaften wie Ihr typisches Beispiel auf Eigenschaften zuzugreifen, stieß ich auf Probleme. Ich fand ein Beispiel, wo der Getter auf return _clientDict
gesetzt wurde, aber der Setzer war nur Es gab mir den Fehler: dass ich einen Körper geben muss, weil es nicht abstrakt oder teilweise ist. Warum würde es den Setzer für mich in diesem Fall nicht automatisch implementieren?
Zuletzt, wenn ich neu auf die Eigenschaften in der gleichen Klasse, in der es deklariert ist, aufrufen, was ist der Unterschied zwischen dies mit einer Eigenschaft und eine normale Variable des gleichen Typs tun? Unterscheiden sich Eigenschaften in diesem Fall überhaupt von Variablen? Ist es eine schlechte Praxis, Eigenschaften auf diese Weise zu verwenden, wenn sie mit privaten Variablen ausgeführt werden sollen?
Diese können einige fehlgeleitete Fragen sein, aber ich kann keinen anderen Ort finden, der die Informationen hat, um mir zu helfen, diese Unterscheidungen zu verstehen. Ich habe mit Grundstücken herumgespielt, um das alles herauszufinden, aber ich könnte mir so Hilfe gebrauchen.
Riesige Hilfe vielen Dank, nur eine Klarstellung? Was meinen Sie mit Feldern, die keine Zugriffsspezifizierer haben können? Wäre nicht eine private Mitgliedsvariable ein Beispiel dafür? Ich denke, ich vermisse, was Sie mit Feld meinen. – shenk
Das Argument für private Immobilien ist das Potenzial für zukünftige Veränderungen. Obwohl Sie jetzt keine Validierungslogik haben, können Sie in der Zukunft und bereits eine Eigenschaft Ihnen einen einzigen Platz geben, um diese Logik zu ändern, anstatt jede Ortszuweisung in Ihrer Klasse zu tun, wodurch Ihre Klasseninvarianten einfacher zu verwalten sind. Es ist vielleicht kein besonders gutes Argument, aber es kann dazu beitragen, einige Arten von Volatilität einzubeziehen. –
@shenk Eine Eigenschaft kann dies tun: 'public string Foo {get; geschütztes Set; } ', was bedeutet, dass nur abgeleitete Typen den Wert von' Foo' setzen können. Ein Feld kann das nicht. –