Autor |
Beitrag |
BCT1
      
Beiträge: 36
|
Verfasst: Di 28.12.10 02:48
Hey, ich habe folgende Klasse
C#-Quelltext 1: 2: 3: 4: 5:
| struct Kontakt { public string name; public int alter; } |
Meine Klasse ist nicht wirklich so simpel, das soll nur ein beispiel sein
Über ein property: public Kontakt meinKontakt{ get { return kontakt; } set { kontakt = value; } } will ich jetzt das Alter des Kontaktes ändern. Also schreibe ich meinKontakt.alter = 20. Da gibt er mir aber einen Fehler. Es ist aber dringend notwendig, dass ich das über properties mache, also nicht mit Methoden.
Könnt ihr mir sagen wie man das realisieren kann?
Danke im Vorraus
Zuletzt bearbeitet von BCT1 am Di 28.12.10 16:19, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 28.12.10 05:18
BCT1 hat folgendes geschrieben : | Da gibt er mir aber einen Fehler. |
Da muss ich wohl raten was der Fehler ist...
Vermutlich etwas mit Sichtbarkeit? Wenn ja, musst du die Klasse Kontakt als public deklarieren oder die Property als private. Denn wenn die Klasse nicht public ist, kann auch keine Property mit diesem (von außen nicht existenten Typ) als public deklariert werden.
|
|
BCT1 
      
Beiträge: 36
|
Verfasst: Di 28.12.10 16:18
Ach, mist, hab mich verschrieben. Die Klasse Kontakt soll eigentlich ein struct sein. Und der Fehler der dann bei mir erscheint ist: Zitat: | Der Rückgabewert "ConsoleApplication1.meinObjekt.meinKontakt" kann nicht geändert werden, da er keine Variable ist. |
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 28.12.10 16:21
Ein struct ist keine Referenz, sondern wird komplett kopiert, wenn du es abrufst. Das heißt du würdest den Wert nur in deiner Kopie ändern. Das wäre Blödsinn, deshalb erkennt und bemängelt der Compiler das.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 28.12.10 16:41
Und um es anders auszudrücken: Ein Struct ist hier zu 100.0% an der falschen Stelle.
_________________ >λ=
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Di 28.12.10 16:46
Warum machst du aus Kontakt keine Klasse? Spricht da etwas dagegen?
|
|
BCT1 
      
Beiträge: 36
|
Verfasst: Di 28.12.10 16:57
Ich hab das mit dem Kontakt nur als Beispiel gesagt. Eigentlich ist mein Programm auch viel komplexer. Fakt ist, dass ich ein struct vorgegeben habe(was ich auch nicht einfach in eine Klasse ändern kann) und mithilfe von Properties auf die einzelnen Eigenschaften zugreifen will.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 28.12.10 17:02
Dann musst du das Struct in einer Variable speichern, den entsprechenden Wert ändern, und die Variable der Eigenschaft wieder zuweisen. Oder, wenn das Struct einen Konstruktor hat, der alle Eigenschaften setzt, ist auch folgendes möglich:
C#-Quelltext 1:
| objekt.Eigenschaft = new Struct(objekt.Eigenschaft.A, objekt.Eigenschaft.B, neuerWert); |
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 28.12.10 17:36
BCT1 hat folgendes geschrieben : | Fakt ist, dass ich ein struct vorgegeben habe(was ich auch nicht einfach in eine Klasse ändern kann) |
Warum nicht?
Wenn die Vorgabe fest ist, lässt sich natürlich wenig daran rütteln, aber in dem Fall hat derjenige wirklich nicht viel Ahnung von C#: Thou shalt not create mutable structs.
_________________ >λ=
|
|
BCT1 
      
Beiträge: 36
|
Verfasst: Di 28.12.10 17:48
Gut, dann geb ich mal preis, worums wirklich geht. Ich mache ein Spiel mit XNA und da gibt es Vector-structs. Diese sollen als Position dienen. Sie haben eine X und eine Y Eigenschaft. Ich hab, wie oben gesagt probiert properties zu machen. An der Vectorvorlage kann ich aber nichts verändern(oder?). Ich muss diese structs aber irgendwie in properties packen und trotzdem noch auf diese X und Y Eigenschaften zugreifen können. Ich weiß nicht inwiefern das möglich ist, ohne einen großen Aufwand an schreibarbeit.
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 28.12.10 17:58
Nicht wirklich sauber, aber einfach: ein public Feld...
Oder eben wie schon geschrieben eine lokale Variable zum Heraus- und wieder Hineinkopieren.
Sauber, aber ggf. mit ein wenig Arbeit verbunden:
Wrapperklasse schreiben, die den struct beinhaltet, aber auch jeweils eine Property für dessen Felder anbietet.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 28.12.10 17:59
Vor dem Problem stand ich auch mal. Es gibt mehrere Möglichkeiten, es zu lösen: Die eine hab ich vorhin geschrieben. Vielleicht ist es (vor allem bei internen Membern) sinnvoller, keine Eigenschaft, sondern ein Feld zu verwenden, denn dann kann auf die Komponenten des Vektors wieder schreibend zugegriffen werden.
Für am Sinnvollsten halte ich das bereits genannte:
C#-Quelltext 1:
| body.Location = new Vector(body.Location.X, body.Location.Y, 20); |
Ist kurz und funktioniert sogar bei immutable Structs.
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Di 28.12.10 18:30
Nicht gerade schön, aber naja:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| Kontakt k = meinKontakt; k.name = "Test"; k.alter = 33; meinKontakt = k;
Console.WriteLine(meinKontakt.alter); Console.WriteLine(meinKontakt.name); | LG
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 28.12.10 18:47
BCT1 hat folgendes geschrieben : | Gut, dann geb ich mal preis, worums wirklich geht. |
Gut, wurde langsam Zeit  .
BCT1 hat folgendes geschrieben : | Ich mache ein Spiel mit XNA und da gibt es Vector-structs. |
Auch Microsoft macht leider manchmal Fehler, dieses einen aber anscheinend besonders oft  .
Ich würde wie Yogu dir raten, Microsofts Fehler zu beheben und den Struct als immutable aufzufassen. Leider besitzt C# noch keinen wirklichen Support für immutable Typen, aber mit Extension Methods könnte man wenigstens ein Minimum aufrüsten:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| public static class Vector2Ex { public static Vector2 SetX(this Vector2 v, float x) { return new Vector2(x, v.Y); } ... }
...
player.Position = player.Position.SetX(0); |
Gut, im Vergleich zur Konstruktor-Syntax wird das wohl erst bei Vector3 so richtig interessant  .
_________________ >λ=
|
|