Entwickler-Ecke

C# - Die Sprache - struct Variable initialisieren


Codeexplorer - Do 25.01.07 12:27
Titel: struct Variable initialisieren
Hallo zusammen,

ich möchte eine struct Variable initialisieren.
Dabei möchte ich nicht jedem Element einzeln
einen Wert zuweisen müssen.
Unter Delphi gibt es da den FillChar-Befehl mit
dem man auch records initialisieren kann.
Gibt es da in C# eine ähnlich elegante und
kompakte Lösung ?


Robert_G - Do 25.01.07 12:48
Titel: Re: struct Variable initialisieren
user profile iconCodeexplorer hat folgendes geschrieben:
Gibt es da in C# eine ähnlich elegante und
kompakte Lösung ?
Nein, du kannst in .Net nicht einfach so direkte Operationen im Speicher durchführen. (Außer in unsafe Code natürlich)
Du kannst aber einen Konstruktor in deinem ValueType haben, mit dem du ihn sogar noch eleganter initialisieren kannst. ;)

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
struct MyValueType
{
  int someFiled;
  
  public int SomeField
  { 
    get{ return someField; }
    set{ someField = value; }
  }
  
  public MyValueType(int someField)
  {
    this.someField = someField;
  }
}
Das würde einfach so benutzt werden: MyValueType instance = new MyValueType(2);


Codeexplorer - Do 25.01.07 13:38

Schade, das hat mir bei Delphi sehr gut gefallen,
dass man einen record erweitern konnte ohne den
Initialisierungscode ändern zu müssen ... :(


Kha - Do 25.01.07 16:33

Wie oft änderst du deine Record-Felder, dass dir jeweils eine zusätzliche Zeile so weh tut :) ? Und im Gegensatz zu Delphi kannst du die Initialisierung gar nicht vergessen, sonst gibts Haue vom Compiler ;) .


Robert_G - Do 25.01.07 16:52

user profile iconKhabarakh hat folgendes geschrieben:
Wie oft änderst du deine Record-Felder, dass dir jeweils eine zusätzliche Zeile so weh tut :) ? Und im Gegensatz zu Delphi kannst du die Initialisierung gar nicht vergessen, sonst gibts Haue vom Compiler ;) .
Besonders schön ist es wenn man fleißig über die Grenzen hinausschreibt und plötzlich ^Blaubeermuffin auf Schweinsbraten zeigt. (Wobei es da ja sizeof(T) gibt)

Das Füllen mit Nullen ist in .Net unnötig. Auch wenn dich der C# compiler dämlicherweise zwingt Variablen zu initialisieren, die Runtime wird es nicht zulassen, dass eine lokale Variable nicht initialisiert ist.
Außerdem werden beim Anlegen einen valuetypes auf dem Stack alle Felder mit 0 initialisiert.

Der Default constructor, den du bei einem ValueType immer hast, erledigt genau das für dich.

C#-Quelltext
1:
MyValueType instance = new MyValueType();                    


Codeexplorer - Mo 29.01.07 11:47

Das mit dem Standard-Konstruktor ist natürlich eine Lösung, so habe ich es nun auch
implementiert. Danke !