Forum: PC-Programmierung struct in C#


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.