Laden...

Methode soll Referenz zurückgeben

Erstellt von Kabaal vor 19 Jahren Letzter Beitrag vor 19 Jahren 1.903 Views
K
Kabaal Themenstarter:in
64 Beiträge seit 2004
vor 19 Jahren
Methode soll Referenz zurückgeben

Hallo.

Ich habe hier eine Klasse mit mehreren Variablen und einer Methode. Diese Methode übernimmt einen Parameter, sucht die passende Variable heraus und soll diese dann als Referenz zurückgeben.
Ziel soll sein, dass ich dann mittels dieser Referenz auf die richtige Variable zugreigen kann (lesen und schreiben).
Ich habs schon mit dem "out- Parameter" versucht, klappt aber damit nicht.
Hat irgend wer ne Idee, wie ich das machen kann?

Danke schon mal...

L
667 Beiträge seit 2004
vor 19 Jahren

Schlüsselwort ref.

Bsp :


switch (inputVariable)
{
  case 1 : 
     return ref a;
     break;

  case 2 :
     return ref b;
     break;

... u.s.w. ...
}

"It is not wise to be wise" - Sun Tzu

C
980 Beiträge seit 2003
vor 19 Jahren

Das funktioniert? Kann ich mir nicht vorstellen...

K
Kabaal Themenstarter:in
64 Beiträge seit 2004
vor 19 Jahren

Ne, das hatte ich auch schon probiert.
Das geht ja schon mit dem Methodenkopf los:


ref string MeineFunktion(string welcheVariable) {
...
}

haut nich hin, da beschwert sich der Compiler.

L
667 Beiträge seit 2004
vor 19 Jahren

Klar, aber Referenzvariablen gibst Du auch nicht über den Returnwert zurück. Das funktioniert wie bei anderen Programmiersprachen auch :



void MeineFunktion(ref string welcheVariable, int inputVariable) {
switch(inputVariable)
{
   case 1 :
      welcheVariable = a;
      break;
   case 2 :
      welcheVariable = b;
      break;

...
}



D.h. Du legst die Referenzvariable ausserhalb an, nämlich dort wo Du die Funktion aufrufst. Dann übergibst Du sie als Parameter an die Funktion, und nachdem die Funktion ausgeführt wurde hast Du den Wert in deiner Variablen drin.

Sorry, wenn mein erstes Posting missverständlich war wegen dem return...

"It is not wise to be wise" - Sun Tzu

S
281 Beiträge seit 2004
vor 19 Jahren

obwohl bei return müsste er doch eine 32bit lange adresse zurückgeben, oder verwechsel ich da irgendwas?

F
124 Beiträge seit 2004
vor 19 Jahren

ich glaube er will mehr sowas haben wie einen pointer auf eine variable und diesen pointer will er je nach situation auf eine andere variable zeigen lassen.

du könntest sowas mit einer property machen. du hast eine variable, die mit einer nummer oder ähnlichem die variable bezeichnet, die du lesen/schreiben willst und inner halb der property hast du jeweils im get- und set-teil ein switch, was value an die richtige variable weitergibt, bzw den wert der richtigen variablen returned.

K
Kabaal Themenstarter:in
64 Beiträge seit 2004
vor 19 Jahren

@Lynix: Tja das is ja grade mein Problem. Ich kann die Variable nicht außerhalb deklarieren, wei ich ja noch garnicht weiß welche das sein wird (bzw die Variable ja schon irgedwo in der classe besteht)

@Fabse: Genau. unter C++ hätte ich warscheinlich einfach nur den Zeiger auf die Variable zurückgegeben. Das geht bei C# aber nur im "unsave"- Modus. Das wollte ich eigendlich vermeiden.
Die sache mit dem Get-/Set könnte funzen ich habe hier allerdings an die 100 Variablen das is ne menge tipparbeit.

Die Referenz selber kann man wohl nicht in eine Variable speichern?

ungefähr so:


irgendeintyp referenz = ref meineVariable;

F
124 Beiträge seit 2004
vor 19 Jahren

ich hab die sache etwas durchdacht, und ich glaube, es wird im normalfall immer nur eine referenz auf das gleiche objekt zurück gegeben.

http://www.codeproject.com/csharp/SharpEd.asp
^^da hat der konstruktor von document eine textbox als übergabe parameter. wenn er da jetzt eine kopie von erstellen würde, dann würde es ja sinnfrei sein, dann die text-eigenschaft davon zu bearbeiten, weil der benutzer ja nur auf die orginale textbox einfluss nehmen kann und nicht auf die kopie.

außerdem hab ich irgendwo mal was von der memberwiseclone()-methode gehört, und sowas braucht man ja nicht, wenn er sowieso kopien erstellen würde!

also gibt er immer referenzen auf ein objekt, oder etwa doch nicht? probier mal etwas rum und poste dann, was du rausgefunden hast

K
Kabaal Themenstarter:in
64 Beiträge seit 2004
vor 19 Jahren

Also, ich hab hier ma n bisschen inner .NET Docu rumgelesen.

Es wird immer bei der verwendung von "new", also bei der erstellung eines Objektes eine Referenz zurückgegeben. (In der Docu nennen die das "Verweis"). Nun kann ich aber leider kein Objekt von einem Typen erstellen (wie denn auch). Ich habs mal mit Arrays probiert, klappt aber auch nicht. Eine andere Möglichkeit eine Referenz zu erstellen habe ich nicht gefunden. .Clone() und .MemberwiseClone() erstellen zwar Referenzen, aber erst nadem sie eine Kopie des Objektes erstellt haben.

Die einzige Möglichkeit, die ich gefunden habe besteht in der verwendung von unsicheren Code (schlimme Sache 8o). Der betreffende Codeblock wird mit "unsafe" gekennzeichnet und beim Compilieren das "/unsafe" Parameter angegeben.
So. Jetzt kann man wieder nach herzenslust mit Zeigern aller *string und &string rumsauen.

Sorry, ne bessere möglichkeit habe ich nicht gefunden. In der Docu wird übrigens vor der Verwendung von unsicheren Code abgeraten. Aus diesem Grund werde ich hier wohl alles umstricken und die ganze Sache irgendwie umgehen.

Bis denne...