2 Stimmen

Const vs protected statisch readonly

Ich habe eine Wrapper-Klasse, die ein Stück Information kapselt, die als Byte-Array übertragen werden muss.

Auf diese Weise kapselt die Klasse den notwendigen Header (mit Feldern wie DATA_LENGTH oder MESSAGE_TYPE) in die entsprechenden Bytepositionen. Dazu möchte ich Positionen und Länge z.B. in Konstanten definieren:

HEADER_DATA_LENGTH_IX = 0;
HEADER_DATA_LENGTH_LENGTH = 2;

was bedeutet, dass DATA_LENGTH bei 0 beginnt und zwei Bytes umfasst.

aber bisher habe ich Probleme damit, sie zu Konstanten oder statischen schreibgeschützten Feldern zu machen. Const kann nicht geschützt werden, daher werde ich nicht in der Lage sein, eine neue Klasse abzuleiten und die Konstanten zu ändern, wenn ein sie verwenden, auf der anderen Seite könnte ich neue Konstanten in der abgeleiteten Klasse zu deklarieren und die Verwendung von ihnen.

Wie werden Sie vorgehen?

5voto

Oz Radiano Punkte 779

Wenn Sie den Wert dieser Parameter in einer abgeleiteten Klasse ändern möchten, können Sie sie zu readonly und ändern Sie sie im Konstruktor der abgeleiteten Klasse

Ich würde sie nicht zwingen const Jedenfalls, weil sie nicht...

4voto

Jason Punkte 15739

Der grundlegende Unterschied besteht darin, wann die Variable initialisiert wird. readonly" wird bei der Initialisierung oder im Konstruktor gesetzt, während "const" zur Kompilierzeit gesetzt wird.

Ich denke, die wichtigste Entscheidung ist, ob Sie die Klasse erben und den Wert überschreiben wollen. Wenn ja, wählen Sie readonly. Ansonsten glaube ich nicht, dass es wirklich wichtig ist.

readonly C#ref: http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx

const C# ref: http://msdn.microsoft.com/en-us/library/e6w8fe1b.aspx

1voto

Robert C. Barth Punkte 21461

Erstellen Sie eine innere Klasse mit den Konstanten. Die abgeleiteten Klassen können dann später die innere Klasse außer Kraft setzen und die Konstanten nach Bedarf ändern.

z.B. die Basisklasse:

public class Stuff
{
  public class HeaderInformation
  {
    public const int HEADER_DATA_LENGTH_IX = 0;
    public const int  HEADER_DATA_LENGTH_LENGTH = 2;
  }
}

Dann kann die abgeleitete Klasse dies tun:

public class DerivedStuff : Stuff
{
  public new class HeaderInformation : Stuff.HeaderInformation
  {
    public new const int HEADER_DATA_LENGTH_IX = 10;
  }
}

Auf diese Weise sind Sie flexibel. Unter DerivedStuff hat die Klasse HeaderInformation alle Konstanten der Basisklasse Stuff.HeaderInformation Klasse, kann aber jede von ihnen ändern oder die vorhandenen beibehalten.

1voto

Brann Punkte 30431

Genau diese Frage wird beantwortet durch die offizielle c#-FAQ auf msdn

0voto

Gerrie Schenck Punkte 21800

Ich würde sie nicht zu Konstanten machen, weil sie einfach keine Konstanten sind. Wenn Sie etwas als konstant deklarieren, sollten Sie sich fragen: Kann sich das ändern? Ihre Nachrichtenlängen könnten sich eines Tages ändern, daher sollten sie besser schreibgeschützt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X