2016-07-08 12 views
4

In unserer .NET-Softwarekomponente verwenden wir die folgende Namenskonvention. Wenn ein Benutzer unsere DLL von VB.NET verwendet, kann der Compiler das distance-Mitgliedsfeld nicht von der Distance-Eigenschaft unterscheiden. Welche Problemumgehung empfehlen Sie?C#: Benennungsregeln für geschützte Mitgliederfelder

Danke.

public class Dimension : Text 
{ 
    private string _textPrefix; 

    protected double distance; 

    /// <summary> 
    /// Gets the real measured distance. 
    /// </summary> 
    public double Distance 
    { 
     get { return Math.Abs(distance); } 
    } 
} 
+5

Ich würde persönlich das Feld privat machen, um damit zu beginnen. Warum brauchst du wirklich das zu schützende Feld? –

+3

Benennen Sie stattdessen das Feld '_distance'? –

+1

@Jon: Wir brauchen den tatsächlichen Wert in abgeleiteten Klassen – abenci

Antwort

7

Sie sollten keine Felder verwenden, die geschützt sind, da Versionierung und Zugriff nicht geschützt werden können. Siehe die Field Design Richtlinien. Ändern Sie Ihr Feld in eine Eigenschaft, die Sie dazu zwingt, in den Namen zu wechseln (da Sie nicht zwei Eigenschaften mit demselben Namen haben können). Oder, wenn möglich, machen Sie das geschützte Feld privat.

Um Ihre Immobilie auf die nur die Vererbungsklassen, verwenden Sie einen geschützten Setter machen Einstellung:

public class Dimension : Text 
{ 
    private string _textPrefix; 

    private double _absoluteDistance; 

    /// <summary> 
    /// Gets the real measured distance. 
    /// </summary> 
    public double Distance 
    { 
     get { return _absoluteDistance } 
     protected set { _absoluteDistance = Math.Abs(distance); 
    } 
} 

Obwohl diese Divergenz verursacht zwischen erhalten und eingestellt, wie Funktionalität ist nicht das Gleiche. Vielleicht eine separate geschützte Methode würde in diesem Fall besser sein:

public class Dimension : Text 
{ 
    private string _textPrefix; 

    /// <summary> 
    /// Gets the real measured distance. 
    /// </summary> 
    public double Distance { get; private set; } 

    protected void SetAbsoluteDistance(double distance) 
    { 
     Distance = Math.Abs(distance); 
    } 
} 
+0

Wofür wurden die Felder für geschützte Member designed? – abenci

+2

Die Tatsache, dass etwas möglich ist, bedeutet nicht, dass es verwendet werden sollte. –

2

Nun, zusammenfassend, was bereits gesagt du so etwas tun kann:

public class Dimension : Text 
{ 
    private string _textPrefix; 

    private double _rawDistance; 

    /// <summary> 
    /// Gets the real measured distance. 
    /// </summary> 
    public double AbsoluteDistance 
    { 
     get; private set; 
    } 

    /// <summary> 
    /// Gets the raw distance 
    /// </summary> 
    public double RawDistance 
    { 
     get { return _rawDistance; } 
     protected set { _rawDistance = value; AbsoluteDistance = Math.Abs(value); } 
    } 
} 

Wenn RawDistance ‚s-Wert wird auch festgelegt setzt den Wert für AbsoluteDistance und deswegen muss Math.Abs() in getter von "AbsoluteDistance" nicht aufgerufen werden.

+0

Ich würde arbeiten, aber es ist zu kompliziert und schwierig zu warten. Danke für Ihre Bemühungen... – abenci