Laden...

Nur zwei Eigenschaften eines Structs in Methode bearbeiten

Erstellt von Gerri3d vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.005 Views
G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 6 Jahren
Nur zwei Eigenschaften eines Structs in Methode bearbeiten

Hallo, ich würde gerne eine struct mit teilweise schon gültigen werten in einer Methode vervollständigen.
Gibt es etwas eleganteres als:



 struct S_Circle
        {
            public int idx;
            public double height;       // y  // CS on Pipe
            public double angle;        // x   // CS on Pipe
            public int diameterBottom;  // for collision prevention calculation
            public assembly asm;
            public int length;          // assembly length / heigth
            public int diameterTop;     // same like bottom if not flansch => different for flansch -> Cone
        }
...

S_Circle GetAssemblyDimensions(int diaBottom, S_IsoHeight isoHeight, S_Circle incompleteCircleData)


in der Methode will ich nur

        public int length;          // assembly length / heigth  
        public int diameterTop;     // same like bottom if not flansch => different for flansch ->   

bearbeiten.

T
2.224 Beiträge seit 2008
vor 6 Jahren

@Gerri3d
Übergib dein Struct doch als Parameter und setze dort dann die entsprechenden Werte.
Besser wäre es aber wenn du mit Properties arbeitest.
Dies ist sauberer als mit reinen public Membern und kann auch ungültige Werte mit direter Prüfung abfangen.


// Methode bekommt Referenz der ursprünglichen Struktur als Parameter um dort dann die eigentlichen Eigenschaften zu setzen
void GetAssemblyDimensions(S_Circle circle)

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 6 Jahren

nun ja, es wird immer das Struct übergeben und auch benötigt. Bei jedem Aufruf. Also habe ich get/set richitg vertsanden, würde das nicht klappen

4.939 Beiträge seit 2008
vor 6 Jahren

@T-Virus: Bei einer Struktur müßte man aber


void GetAssemblyDimensions(ref S_Circle circle) // bzw. besserer Name: SetAssemblyDimensions

verwenden, damit nicht nur die lokale Kopie verändert wird.

Dies erscheint mir aber kein Fall für eine Struktur zu sein (eben wegen der Kopie bei der Übergabe), sondern eine Klasse (mit Eigenschaften und Methoden).

T
2.224 Beiträge seit 2008
vor 6 Jahren

@Th69
Stimmt, mein Fehler.
Ich verwende selten eigene Structs, deshalb vergesse ich das immer wieder.

@Gerri3d
Hier must du nur dein Struct als ref Parameter übergeben.
Was genau soll den mit get/set nicht stimmen?
Dies wird vom Compiler in entsprechende get_/set_ Methoden umgewandelt, was auch bei struct legietim sein sollte.

Gerade um ungültiger/falsche Werte abzufangen, sollte man immer auf Properties setzen.
Ebenfalls kann man nur mit Properties, die inneren(Member) der Klasse/Struct sauber vom äußeren Code abkapseln.
Gerade wenn man im Code häufige Aufrufe hat von den einzelnen Member und man dann ewig nach falschen Werten suchen muss, spart man sich durch korrektes abfangen von falschen Werten viel Zeit.
Dies dürfte in deinem Fall auch einige Fehlerquellen ausschließen, wenn du es sauber machst.

Aber bitte gib uns mehr Details, was hier ggf. nicht klappen sollte.
Dann kann man auch über eine entsprechende Lösung nachdenken.
Aus dem kurzen Code Snippet heraus erkenne ich aber keinen Grund, der gegen diesen Ansatz spricht.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

F
10.010 Beiträge seit 2004
vor 6 Jahren

Und bedenke, struct ist in 99% der Fälle die falsche Wahl.

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Gerri3d,

Und bedenke, struct ist in 99% der Fälle die falsche Wahl.

bin derselben Meinung und habe auch noch nicht verstanden, warum man hier ein struct braucht.

Gruss

Coffeebean

57 Beiträge seit 2012
vor 6 Jahren

mach dir gleich eine Klasse mit passendem Konstruktor. Struct ist auch nur die "Einschränkung" einer Klasse

OO gibts seit Platon - hatte der auch C#?

T
461 Beiträge seit 2013
vor 6 Jahren

mach dir gleich eine Klasse mit passendem Konstruktor. Struct ist auch nur die "Einschränkung" einer Klasse

Was soll das genau heißen? Komm damit nicht zurecht...

Hiermit schon: https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/classes-and-structs/using-structs

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

5.658 Beiträge seit 2006
vor 6 Jahren

Structs sind keine Klassen mit Einschränkungen, wie die Formulierung nahelegt, sondern ein völlig anderes Konzept, wo die Daten in einem anderen Speicherbereich liegen, sich bei der Zuweisung anders verhalten etc.

Kurz gesagt: Structs sind Werte, die kopiert werden, und Klassen sind Datenstrukturen, die referenziert werden. Das Thema ist aber hier im Forum auch schon des Öfteren diskutiert worden. Daher müssen wir das nicht nochmal alles ausführen.

Im Zweifelsfall würde ich mich daher eher an die Dokumentation halten.

Weeks of programming can save you hours of planning