Forum: PC-Programmierung struct in C#


von Martin M. (ats3788)


Lesenswert?

Hallo
Ich habe eine Frage zu C#. Ich habe noch nie in C# programmiert aber für 
das was ich machen möchte langt es, dank C++ und Pascal.

ein struct wie

public struct Temp_t
{
   public Int32 Zahl;
   public UInt32 UZahl;
   public string Temp_CPU;
}

ist OK
aber ich möchte ein String Array im struct haben
also so was.

public struct Temp_t
{
   public Int32 Zahl;
   public UInt32 UZahl;
   string[] Temp_CPU  = new string[5];
}

nur da meckert der Compiler
Wie geht so was in C#

von Carlos (Gast)


Lesenswert?

Wenn es unbedingt ein Struct sein muss mach eine Factory-Methode:
1
 struct InputCard
2
3
{
4
5
 public string CardNo;
6
7
 public int BaseAddress;
8
9
 public int LowerAddress;
10
11
 public int UpperAddress;
12
13
 public int[] WriteBitNo;
14
15
 public int[] ReadBitNo;
16
17
18
19
 static InputCard Create()
20
21
 {
22
23
  return new InputCard()
24
25
  {
26
27
   CardNo = string.Empty,
28
29
   WriteBitNo = new int[16],
30
31
   ReadBitNo = new int[16]
32
33
  };
34
35
 }
36
37
}

von Dirk K. (merciless)


Lesenswert?

Martin M. schrieb:
> aber ich möchte ein String Array im struct haben
Muss es unbedingt ein struct sein?
In einer Klasse geht das einfacher.
1
public class Temp_t
2
  {
3
    public Int32 Zahl;
4
    public UInt32 UZahl;
5
    public string[] Temp_CPU = new string[5];
6
  }
merciless

von Martin M. (ats3788)


Lesenswert?

Ich habe es mit einer Klasse gelöst

     public class Mainboard_t
        {
            public string[] Temp_CPU = new string[5];
            public string[] Temp_GPU = new string[5];
            public string[] Speed_CPU = new string[5];
            public string[] Speed_GPU = new string[5];

        }

So funktioniert es

von fop (Gast)


Lesenswert?

Lass einfach das new weg.
1
public struct Temp_t
2
{
3
   public Int32 Zahl;
4
   public UInt32 UZahl;
5
   string[] Temp_CPU;
6
}
Nunja, Du musst es dann nach jedem Anlegen einer Instanz des Structs 
machen...

von FS (Gast)


Lesenswert?

Bedenke, dass zwischen "struct" und "class" in C# ein wesentlicher 
Unterschied besteht, im Gegensatz zu C++. Klassen (class) werden in .NET 
als Objekte auf dem Heap alloziert, unterliegen der Garbage Collection 
und sind "Copy-By-Reference" während Strukturen (struct) rein 
stackbasiert und "Copy-By-Value" sind. Das kann u.U. zu unterwartetem 
Verhalten bei Funktionsaufrufen führen.

von c-hater (Gast)


Lesenswert?

FS schrieb:

> Bedenke, dass zwischen "struct" und "class" in C# ein wesentlicher
> Unterschied besteht, im Gegensatz zu C++. Klassen (class) werden in .NET
> als Objekte auf dem Heap alloziert, unterliegen der Garbage Collection
> und sind "Copy-By-Reference" während Strukturen (struct) rein
> stackbasiert und "Copy-By-Value" sind. Das kann u.U. zu unterwartetem
> Verhalten bei Funktionsaufrufen führen.

Erstens das und zweitens sind Arrays (und damit auch Strings) 
grundsätzlich Referenzen, während bei C/C++ Arrays fester Maximallänge 
durchaus auch als Werte direkt innerhalb von Strukturen liegen können 
oder sogar ohne deklarativ feste Maximallänge, wenn sie das letzte 
Element der Struktur darstellen.

C ist halt schmutzig und C++ hat all den Dreck von C geerbt. Millionen 
Sicherheitslücken können nicht lügen...

von Martin M. (ats3788)


Lesenswert?

Danke für eure Hilfe,
Ich komme aus der Pascal C++ Welt und wenn ich jünger wäre würde ich 
tiefer in C# eintauchen, scheint eine elegante Sprache zu sein

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.