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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Wenn es unbedingt ein Struct sein muss mach eine Factory-Methode:
 struct InputCard

{

 public string CardNo;

 public int BaseAddress;

 public int LowerAddress;

 public int UpperAddress;

 public int[] WriteBitNo;

 public int[] ReadBitNo;



 static InputCard Create()

 {

  return new InputCard()

  {

   CardNo = string.Empty,

   WriteBitNo = new int[16],

   ReadBitNo = new int[16]

  };

 }

}

von Dirk K. (merciless)


Bewertung
0 lesenswert
nicht 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.
public class Temp_t
  {
    public Int32 Zahl;
    public UInt32 UZahl;
    public string[] Temp_CPU = new string[5];
  }
merciless

von Martin M. (ats3788)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Lass einfach das new weg.
public struct Temp_t
{
   public Int32 Zahl;
   public UInt32 UZahl;
   string[] Temp_CPU;
}
Nunja, Du musst es dann nach jedem Anlegen einer Instanz des Structs 
machen...

von FS (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.

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