C# nyelvben, hogyan lehet megvalósítani egyetéen osztályban az operator++ prefix és postfix verzióját?
Nem tudom elérni,hogy egy osztályban mindkét verzió szerepeljen.
Itt a kód:
class MyInt {
public MyInt(int value): base()
{
this.Value = value;
}
private MyInt(MyInt rhs): this(rhs.Value)
{}
public int Value
{ get; private set; }
static public MyInt operator++(MyInt rhs)
{
++rhs.Value;
//Így prefix
return new MyInt(rhs);
/*Így pedig postfix
return new MyInt(rhs.Value-1);*/
}
}
internal class MainClass {
public static void Main()
{
MyInt x = new MyInt(10);
Console.WriteLine(x.Value); // 10
++x;
Console.WriteLine(x.Value); // 11
MyInt y = x++;
Console.WriteLine(x.Value); // 12
Console.WriteLine(y.Value); // 12 (!)
Console.ReadKey();
}
}
Hogyan csináljam meg?
A könyv ezt írja de bárhogy próbálom nem jó:
Nézzük az utolsó sort! Mivel y–nak a postfixes formában adtunk értéket, ezért 11–et kellene tartalmaznia, ehelyett x++ esetében pontosan ugyanaz történik, mint ha ++x-et írtunk volna.
A probléma, hogy kifejezetten postfixes operátort nem tudunk definiálni, az általunk készített kód minden esetben a prefix operátort jelenti. Viszont meghívhatjuk az általunk definiált operátorokat postfixes alakban, ekkor az adott objektumot eltárolja a rendszer, meghívja az értéket növelő kódrészletet, és visszadja az első lépésben félrerakott értéket. Ugye ez értéktípusok esetében tökéletesen működik, de referenciatípusoknál az első lépésben nem az értéket hanem a referenciát tároljuk, vagyis a késöbbi változás itt is érvényben lesz.
Ugyanakkor létezik módszer arra, hogy mégis megoldjuk a fenti problémát: az operátornak egy teljesen új objektumot kell visszaadnia, ekkor erre már nem mutat korábbi referencia, vagyis biztonságosan használható (viszont az új művelet (az objektum létreho
egyetéen- Ez egyetlen akar lenni.
Bocsi a hibák miatt.
Nem értem.
Örülnék neki ha valaki venné a fáradtságot és leírná,hogyan kell mert nekem nem sikerül bárhogyan is csinálom.:-(
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!