Warum können wir öffentliche Felder nicht für die Datenbindung in C # verwenden?

8

Ich bin mir der Vorteile bewusst, die die Verwendung von Eigenschaften gegenüber Feldern bietet, wie zum Beispiel die Möglichkeit, in Zukunft zusätzliche Logik bereitzustellen.

Aber ich frage mich wirklich, warum es nicht möglich ist, öffentliche Felder für die Datenbindung oder sogar für JSON-Serialisierer wie die JavaScriptSerializer-Klasse zu verwenden.

Gibt es einen guten Grund, öffentliche Felder in diesen Fällen zu ignorieren? Oder ist es nur eine Art Konvention? Oder um Benutzer zu zwingen, Eigenschaften zu verwenden?

    
sapito 20.12.2014, 16:55
quelle

3 Antworten

6

Die kurze Version ist, dass immer die Verwendung von Eigenschaften anstelle von public (oder wirklich, auch protected ) Felder von Anfang an eine grundlegende Designoption in .NET war.

Die etwas längere Version ist, dass das Hinzufügen von Unterstützung für public -Felder dem Datenbindungsframework Komplexität hinzufügt (je nachdem, auf welches Sie sich beziehen). Felder enthalten auch keine Unterstützung für die Änderungsbenachrichtigung, was ein ziemlich wichtiger Aspekt der Datenbindung ist (zumindest in einer zustandsbehafteten Umgebung wie der Winforms-Entwicklung). Selbst auf der Ebene des Abrufens und Festlegens von Werten sind Felder und Eigenschaften unterschiedlich; Während die Syntax in VB.NET oder C # zum Abrufen oder Festlegen des Werts einer Eigenschaft (von Entwurf) dieselbe ist wie die eines Felds, ist der in einem programmatischen Szenario wie der Datenbindung verwendete Mechanismus für Eigenschaften vs. Felder.

Am Ende bedeutet dies nur, dass es mehr Arbeit in Anspruch nehmen würde, jedem Datenbindungsszenario Unterstützung für öffentliche Felder hinzuzufügen, da es sich sowieso um ein Anti-Pattern handelt, ist diese Arbeit nicht erledigt.

    
Adam Robinson 20.12.2014, 17:02
quelle
3

Diese Einschränkung hat keinen technischen Grund: Es ist durchaus möglich, der Liste der Eigenschaften öffentliche Felder hinzuzufügen und deren Bindung zuzulassen. Tatsächlich gibt es in .NET APIs, die basierend auf einem Namen automatisch eine Eigenschaft oder ein öffentliches Feld auswählen. Zum Beispiel hat LINQs Expression PropertyOrField Methode, die das eine oder das andere auswählen würde, basierend auf dem Typ, der von dem Ausdruck in seinem ersten Parameter zurückgegeben wird.

Wenn Sie die Felder jedoch öffentlich zugänglich machen, können Sie sich einer Reihe potentieller Probleme aussetzen. Die Entwickler von Systemen, die auf Reflexion angewiesen sind, versuchen häufig, die Nutzung öffentlicher Felder zu unterbinden, indem sie ihnen die Systemunterstützung verweigern.

Außerdem ist in Systemen, die auf Ereignisse für die Bindung angewiesen sind, die Verwendung eines Felds aus technischen Gründen nicht möglich, da ein Ereignis beim Setzen eines öffentlichen Feldes nicht ausgelöst werden kann.

    
dasblinkenlight 20.12.2014 17:05
quelle
0

Da Sie Felder in Interfaces nicht deklarieren können, sollten Sie keine öffentlichen Felder verwenden. Alle Felder sollten nur privat sein.

Wenn Ihr Code von Abstraktionen abhängt, müssen Sie Interfaces verwenden und hier sind die öffentlichen Felder nicht verfügbar.

    
Sarvesh Mishra 20.12.2014 17:06
quelle