Autor Beitrag
BCT1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Di 28.12.10 02:48 
Hey, ich habe folgende Klasse
ausblenden 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 :wink:
Ü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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 28.12.10 05:18 
user profile iconBCT1 hat folgendes geschrieben Zum zitierten Posting springen:
Da gibt er mir aber einen Fehler.
Da muss ich wohl raten was der Fehler ist... :roll:

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 28.12.10 16:41 
Und um es anders auszudrücken: Ein Struct ist hier zu 100.0% an der falschen Stelle.

_________________
>λ=
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Di 28.12.10 16:46 
Warum machst du aus Kontakt keine Klasse? Spricht da etwas dagegen?
BCT1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
objekt.Eigenschaft = new Struct(objekt.Eigenschaft.A, objekt.Eigenschaft.B, neuerWert);					
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 28.12.10 17:36 
user profile iconBCT1 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
body.Location = new Vector(body.Location.X, body.Location.Y, 20);					

Ist kurz und funktioniert sogar bei immutable Structs.
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Di 28.12.10 18:30 
Nicht gerade schön, aber naja:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 28.12.10 18:47 
user profile iconBCT1 hat folgendes geschrieben Zum zitierten Posting springen:
Gut, dann geb ich mal preis, worums wirklich geht.
Gut, wurde langsam Zeit ;) .

user profile iconBCT1 hat folgendes geschrieben Zum zitierten Posting springen:
Ich mache ein Spiel mit XNA und da gibt es Vector-structs.
Auch Microsoft macht leider manchmal Fehler, dieses einen aber anscheinend besonders oft :D .
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:
ausblenden 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 :) .

_________________
>λ=