Festlegen einer Referenz für ein Mitgliedsfeld in C #

7

Ich möchte einen Verweis auf ein Mitgliedsfeld zuweisen. Aber ich verstehe diesen Teil von C # offensichtlich nicht sehr gut, weil ich gescheitert bin :-) Also, hier ist mein Code:

%Vor%

Ausgabe ist:

%Vor%

Wie bekomme ich "Erfolg" auf der Konsole?

Vielen Dank im Voraus, Dijxtra

    
dijxtra 21.10.2011, 17:48
quelle

5 Antworten

3

Hier gibt es wirklich zwei Probleme.

Eins, wie die anderen Poster gesagt haben, können Sie nicht strikt tun, was Sie tun wollen (wie Sie vielleicht mit C und dergleichen tun können). Wie auch immer - das Verhalten und die Absicht sind in C # noch gut umsetzbar - Sie müssen es nur auf C # -Weise tun.

Das andere Problem ist Ihr unglücklicher Versuch, Strings zu verwenden - die, wie eines der anderen erwähnten Poster - unveränderlich ist - und per Definition herumkopiert werden.

Also, nachdem Sie das gesagt haben, kann Ihr Code leicht in das konvertiert werden, was meiner Meinung nach das macht, was Sie wollen:

%Vor%     
Steve 21.10.2011, 17:58
quelle
14

Wie andere darauf hingewiesen haben, können Sie keinen Verweis auf eine Variable in einem Feld in C # oder in einer anderen CLR-Sprache speichern.

Natürlich können Sie einen Verweis auf eine Klasseninstanz, die eine Variable enthält, leicht genug erfassen:

%Vor%

Einfach peasy.

    
Eric Lippert 21.10.2011 18:35
quelle
2

Es klingt, als ob Sie hier versuchen, ein Feld zu einem anderen Speicherort zu machen. Im Wesentlichen haben Sie ein ref -Feld auf die gleiche Weise, wie Sie einen ref -Parameter haben. Dies ist in C # nicht möglich.

Eines der Hauptprobleme dabei ist, dass die CLR (und C #) in der Lage sein müssen, zu beweisen, dass das Objekt, das das Feld enthält, nicht länger leben wird als der Ort, auf den es zeigt. Dies ist normalerweise unmöglich, da Objekte auf dem Heap leben und ein ref leicht in den Stack zeigen kann. Diese beiden Orte haben eine sehr unterschiedliche Lebensdauer-Semantik (der Heap ist typischerweise länger als der Stack) und daher kann ein ref zwischen nicht als gültig bestätigt werden.

    
JaredPar 21.10.2011 17:49
quelle
1

In dieser Zeile:

%Vor%

... Sie kopieren den Methodenparameter in das Klassenmitglied parameter . Dann weisen Sie in Init() dem class Mitglied parameter erneut den Wert "success" zu. In Ihrer Console.Writeline schreiben Sie dann den Wert des Methodenparameters "failed", weil Sie den Methodenparameter niemals ändern.

Was Sie versuchen zu tun - so wie Sie es versuchen - ist nicht möglich, ich glaube an C #. Ich würde nicht versuchen, eine string mit dem Modifikator ref zu übergeben.

    
IAbstract 21.10.2011 17:57
quelle
1

Wie von JaredPar beantwortet, können Sie nicht.

Aber das Problem ist teilweise, dass String unveränderlich ist. Ändern Sie Ihren Parameter in class Basket { public string status; } und Ihr Code würde grundsätzlich funktionieren. Keine Notwendigkeit für das Schlüsselwort ref , ändern Sie einfach parameter.status .

Und die andere Option ist natürlich Console.WriteLine("After: {0}", e.parameter); . Umschlinge Parameter in einer (schreibgeschützten) Eigenschaft.

    
Henk Holterman 21.10.2011 17:57
quelle

Tags und Links