Autor Beitrag
Codeexplorer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Do 25.01.07 12:27 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416


Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
BeitragVerfasst: Do 25.01.07 12:48 
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. ;)
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416


Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
MyValueType instance = new MyValueType();					
Codeexplorer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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 !