funktionen-rückgabewerte per referenz
-
hallo
wie kann ich einen rückgabewert per referenz zurückgeben?
also so wie in c++:Foo& getFoo() { return foo; }
Ich will halt den wert der rückgabe ändern können.
getFoo().name = "aaaaaa";
-
Warum probierst du nicht, das es so geht?
Bye, TGGC (NP Intelligenz)
-
class blaa { struct foo { public int a; } foo myfoo; foo bar() { return myfoo; } } bar().x = 5; // Fehler
Fehler:
Cannot modify the return value of 'bar()' because it is not a variableist ja auch logisch, weil es halt nicht per referenz zurückggb. wird sondern als kopie.
nu meine frage wie kann man das als referenz zurückgb. ?
-
DEvent schrieb:
nu meine frage wie kann man das als referenz zurückgb. ?
Garnicht
-
interpreter schrieb:
DEvent schrieb:
nu meine frage wie kann man das als referenz zurückgb. ?
Garnicht
wie gar nicht?
das muss doch gehen..............
-
Das macht nicht wirklich Sinn. structs sind nur billige Typen mit Wertesemantik. So wie ein int. Ein int ist in C# ein struct.
Wenn du jetzt in deiner Klasse irgendne Variable hast, würdest du dann eine Referenz auf das int zurückgeben?
Oder würdest du nicht doch lieber einen getter und setter dafür anbieten?
-
k.A. obs es nun wirklich geht mit C#, aber mit Managed C++ geht das ja wunderbar.
#include <iostream> int bar; int %foo() { return bar; } int main() { foo() = 79; std::wcout << foo() << std::endl; }
Dieser Code entspricht laut Lutz Roeder's Reflector in C# folgendem:
// // :warning: Man beachte diese Funktion hier... :warning: // internal static unsafe ref int foo() { return (int) &bar; } internal static unsafe int modopt(CallConvCdecl) main(int argc, sbyte modopt(IsSignUnspecifiedByte)** argv) { int num1 = 0; foo() = 79; std.basic_ostream<wchar_t,std::char_traits<wchar_t> >.<<(std.basic_ostream<wchar_t,std::char_traits<wchar_t> >.<<((basic_ostream<wchar_t,std::char_traits<wchar_t> >* modopt(IsConst) modopt(IsConst)) &std.wcout, foo()), (basic_ostream<wchar_t,std::char_traits<wchar_t> >* modopt(IsImplicitlyDereferenced) modopt(CallConvCdecl) *(basic_ostream<wchar_t,std::char_traits<wchar_t> >* modopt(IsImplicitlyDereferenced))) __unep@?endl@std@@$$FYAAAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AAV21@@Z); num1 = 0; return (int modopt(CallConvCdecl)) num1; }
-
Wow, gibts Editoren, welche diese Smilie Ersetzung beim Highlighting bei haben? Da kann man ganz anschaulichen Code schreiben...
Bye, TGGC (NP Intelligenz)
-
@User_t: mit unsafe geht letztlich auch in C# so ziemlich alles. Aber das sollte man sich schon echt genau überlegen, ob man wegen sowas den veryfiable Code verlässt.
Vor allem macht es in meinen Augen immer noch keinen Sinn. Ich liefer auch nicht ne Referenz auf ein int zurück, sondern biete nen setter(int) an. Damit bin ich nicht auf ne Implementierung festgelegt und erhalte die Kapselung aufrecht. Das andere tut dies nicht und hat aber keine anderweitigen Vorteile, so wie ich das sehen kann.
-
class blaa { struct foo { public int a; } foo myfoo; foo bar() { return myfoo; } } bar().x = 5; // Fehler
Fehler:
Cannot modify the return value of 'bar()' because it is not a variableSeltsame Fehlermeldung. Ich hätte erwartet, dass er sagen würde, dass es 'x' gar nicht gibt.
-
Schaut doch mal in der MSDN der Unterschied zwischen class und struct nach.
Bye, TGGC (Pipe my World.)