2017-12-05 1 views
-1

Mein Team folgt der allgemeinen .NET-Konvention, dass Sie öffentliche Eigenschaften für Ihre Typen verfügbar machen sollten, anstatt Felder freizugeben. Allerdings habe ich in eine Klasse kommen, die meist Felder aussetzt ... aber dann enthält diese für seine zwei ‚Identifizierung‘ Stücke von Daten:Kann ich eine schreibgeschützte Eigenschaft für ein schreibgeschütztes öffentliches Feld sicher ersetzen?

public readonly int WidgetId; 
public readonly string WidgetName; 

Ich bin wirklich schwer diese zu Refactoring versucht in Eigenschaften, dh

public int WidgetId { get; } 
public string WidgetName { get; } 

So entsprechen sie den Konventionen des Rests der Klasse. Mir sind die Argumente für und gegen öffentliche Felder gegenüber Eigenschaften bekannt. Aber, da Nur-Lese-Auto-Eigenschaften insbesondere sind eine relativ neue C# Funktion, möchte ich wissen:

Was sind die semantischen Unterschiede zwischen public readonly int Foo und public int Foo { get; }, wenn überhaupt? Unterscheiden sie sich sinnvoll vom Compiler?

+0

@PeterDuniho scheint mir nicht ein Duplikat. Die Frage bezieht sich auf schreibgeschützte Eigenschaften und Felder, nicht auf schreibgeschützte und private Schlüsselwörter. – Backs

+0

@Backs: _ "nicht über readonly und private Schlüsselwörter" _ - selbstverständlich ist es. 'readonly' wendet _only_ auf Felder an. Eine "schreibgeschützte" Eigenschaft ist einfach eine ohne einen barrierefreien Setter. Ob die Unzugänglichkeit ist, weil der Setter einfach nicht vorhanden ist oder weil es "privat" ist, ist völlig irrelevant. Dies ist immer noch eine Frage, die mit allen anderen übereinstimmt, die im Laufe der Jahre gestellt wurden. –

+0

Mir geht es gut, dass dies als doppelt markiert wird, wenn es zu Informationen führt, die die Frage materiell beantworten. Da das Feature ** readonly-auto-property ** in C# relativ neu ist, trifft leider vieles nicht zu. Die Sache, die ich fand, dass * strikt * die Frage beantwortet "Wie unterscheiden sich ein öffentliches readonly Feld und eine öffentliche readonly Eigenschaft in der Semantik?" ist [hier] (https://www.red-gate.com/simple-talk/dotnet/.net-framework/whats-new-in-c-6/), was die IL für eine öffentliche readonly Eigenschaft demonstriert: sieht aus, als gäbe es keinen semantischen Unterschied. –

Antwort

0

Ihre neue Eigenschaft ist gleich:

private readonly string _widgetName = GetWidgetName(); 
public string ` 
{ 
    get { return _widgetName; } 
} 

So wird der Wert in _widgetName gespeichert ist, und es ist sicher, weil es nur lesbar ist, und Sie können es Wert nicht ändern, wie zuvor.

Mit der Eigenschaft WidgetName können Sie nur den Zugriff auf das Feld _widgetName ändern, nicht den Wert. Zum Beispiel:

private readonly string _widgetName = GetWidgetName(); 
public string ` 
{ 
    get 
    { 
     if (_widgetName == null) throw new Exception("Value is not set"); 
     return _widgetName; 
    } 
} 

Sie erhalten mehr Kontrolle auf Ihre Daten, sondern gemeinsam Fall - es gibt keinen Unterschied, wenn man nur readonly Feld readonly propery replcae.

Einige Informationen über Eigenschaften ist here.

Verwandte Themen