der henry: C# ref übergabe

Hallo,

ich habe meine erste Funktion an die ich eine Referenz übergeben muss. Auf diese Referenz schreibt die Funktion dann Ihren Rückgabewert.

Laut Doku: "ref T[] Buffer"

Diese Funktion wird in einer Schleife aufgerufen.

Da ich nicht einfach ein Array übergeben kann, ich muss die Zuordnung behalten, habe ich mir gedacht ich nehme eine List, erzeuge einen key und beschreibe diesen key.value mit "0"


	Dictionary<string, string> memList = new Dictionary<string, string>();


// In der Schleife jeweils 

	memList[record.Plcvarname] = "0";

... und dann würde ich ... wie auch immer den "memList[record.Plcvarname]" als Referenz übergeben.

... so die Theorie ...

jetzt wird aber ein "assignable variable" benötigt ... ??????

Wie kann ich dieses Problem lösen ..., oder bin ich komplett falsch ???

Vielen Dank !!!

  1. Hallo Henry,

    memList ist ein Dictionary, kein Array. [] im Dictionary führt auf eine Setter-Methode.

    Entweder übergib Dictionary und Key getrennt, oder, wenn möglich, gib dem neuen Wert einfach aus der Funktion zurück und weise ihn dann zu.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf,

      je länger ich meinen Beitrag lese, desto verwirrter werde ich selbst.

      Ich hoffe hier besser erklärt.

      Ich habe eine Funktion Reader.Read() die vor dem eigentlichen lesen, über eine Schleife mit Daten Reader.Add versorgt wird.

      Beim Aufruf von Reader.Add muss ich jeweils eine Referenz (Doku: ref T[] Buffer) übergeben in die, nach dem Aufrufer Reader.Read, meine "gelesenden Daten" stehen.

      Um eine Zuordnung zu bekommen, habe ich ein Dictionary, mit Array erstellt. Bei jedem Schleifendurchgang füge ich einen "record" zum Dictionary hinzu, das einen Namen (Plcvarname) und einen value="" enthält.

      Diesen "record" des Dictionary bzw. die Referenz zum jeweiligen Wert des "records" möchte ich an die Funktion Reader.Add übergeben. Damit habe ich Namen und Wert und die Zuordnung passt.

      		
      Dictionary<string, string[]> plcreturns = new Dictionary<string, string[]>();
      
      for-Schleife
      {
      
      	// Speicherbereich für Rückgabe vorbereiten
      		plcreturns.Add(record.Plcvarname, new string[] {""});
      				
      		Reader.Add(
      				readmemtype(record.Datatyp, record.Plcvarname),	
      				readformat(record.Format, record.Plcvarname),
      				record.Db,	
      				record.dataoffset,	
      				(int) 1,
      				ref plcreturns[record.Plcvarname][0]
        		);
      			
      };			
      
      int result = Reader.Read(); 			
      

      Die Referenzübergabe ref plcreturns[record.Plcvarname][0] funktioniert nicht

      Vllt liege ich komplett falsch und es gibt eine bessere Lösung ....

      Vielen Dank !!

      1. Hallo Henry,

        Was für ein Objekt ist Reader? Irgendwas von MySQL? Jedenfalls kein MySqlDataReader. Der kennt kein Add. Was du da tust, ist mir reichlich unverständlich.

        Aber wenn dieser ominöse Reader unbedingt einen ref Parameter bei Add sehen will, musst du wohl eine temporäre Variable spendieren und deren Wert nachher im Dictionary speichern.

        Das [] des Dictionary ist kein Arrayzugriff, sondern ein Indexer-Property und Propertys lassen sich nicht als Referenz übergeben, weil ein Property ein Trio aus Datenspeicher, Getter und Setter ist. Kein Field. Für ein Field und ein Arrayelement kannst du Referenzen erstellen. Nicht für ein Property.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo Rolf,

          Aber wenn dieser ominöse Reader unbedingt einen ref Parameter bei Add sehen will, musst du wohl eine temporäre Variable spendieren und deren Wert nachher im Dictionary speichern.

          Das [] des Dictionary ist kein Arrayzugriff, sondern ein Indexer-Property und Propertys lassen sich nicht als Referenz übergeben, weil ein Property ein Trio aus Datenspeicher, Getter und Setter ist. Kein Field. Für ein Field und ein Arrayelement kannst du Referenzen erstellen. Nicht für ein Property.

          OK, soweit verstanden. Ja der Reader benötigt unbedingt eine Referenz

          Prinzip des "Readers"

          Gefüttert wird der Reader über eine Schleife z.B.

          Reader.Add(Name1, Adresse_x, ref x)
          Reader.Add(Name2, Adresse_y, ref y)
          

          Nach der Schleife gibt es einen einzigen Lesezugriff "reader.read" und alle gelesenen Daten stehen in dem Speicherbereich, den ich als Referenz jeweils pro Reader.Add übergeben habe.

          Es darf natürlich nicht die gleiche Referenz sein, sonst werden die Daten überschrieben.

          Wie kann ich nun einen Speicher in der Schleife erzeugen, dem dynamisch einen Namen z.B. "Namen1, Temp5, Hansdampf, ...x" geben kann, ich muss den Speicher später wieder zuordnen können und als Referenz an den Reader.Add übergeben, ... pro Reader.Add ein referenzierbarer Speicher (Array)

          Wichtig, ich kann mich nicht auf die Reihenfolge verlassen. Die Referenz muss eindeutig zu identifizieren sein. (Ich dachte an ein großes Array und springe mit der ref (ref array[0] beim nächsten ref array[4] usw.)

          Ich habe hier überhaupt keine Vorstellung, wie ich das lösen könnte ... so in der Art ..

          dynamischer_Name = new byte[100];
          

          oder ein mehrdimensionales Array, [dynamischer_Name][100]

          Bin für jede Idee/jeden Tipp dankbar.

          Vielen Dank !!!

          1. Hallo Henry,

            ich glaube, so langsam bin ich raus. Ich kapiere überhaupt nicht mehr, was Du da treibst. Und meine Fragen beantwortest Du nicht oder nur halbgar.

            WAS FÜR EIN TEUFELSDING IST DIESER READER? Ist das was vom System, ist der von Dir?

            Und wenn er von Dir ist: Dann bau ihn so, dass er 1x das Dictionary kennt und lass ihn dann auf Key und Index 0 zugreifen.

            Rolf

            --
            sumpsi - posui - obstruxi