C# - Parameterübergabe per Referenz an den Konstruktor dann mit Ihnen von der Methode
Im folgenden code versuche ich eine Methode(Arbeit) aus der Klasse TestClass ändern Sie die Werte von einigen Variablen, die im Hauptprogramm die zimmerreserviereung, ohne das Sie zurückkehren. Die Variablen werden per Referenz übergeben im Konstruktor Testklasse.
class Program
{
static void Main(string[] args)
{
int a, b, c, d;
a = 5; b = 10; c = 20; d = 25;
Console.WriteLine("Main before TestClass: a=" + a + " b=" + b + " c=" + c + " d=" + d);
TestClass testObj = new TestClass(ref a,ref b,ref c,ref d);
testObj.Work();
Console.WriteLine("Main after TestClass: a=" + a + " b=" + b + " c=" + c + " d=" + d);
Console.ReadLine();
}
}
public class TestClass
{
int _a, _b, _c, _d;
public TestClass(ref int a, ref int b, ref int c, ref int d)
{
_a = a; _b = b; _c = c; _d = d;
}
public void Work()
{
Console.WriteLine("Work before changing: a=" + _a + " b=" + _b + " c=" + _c + " d=" + _d);
_a = 0; _b = 1; _c = 2; _d = 3;
Console.WriteLine("Work after changing: a=" + _a + " b=" + _b + " c=" + _c + " d=" + _d);
}
}
Aber dieser code gibt :
Main before TestClass: a=5 b=10 c=20 d=25
Work before changing: a=5 b=10 c=20 d=25
Work after changing: a=0 b=1 c=2 d=3
Main after TestClass: a=5 b=10 c=20 d=25
Gibt es eine Möglichkeit zu haben, die Methode zu ändern die Werte der Variablen im Hauptprogramm?
Danke!
- Sie müssten, um Verweise in
_a
usw, aber Sie haben gerade erklärt, Sie alsint
s. Wie es sich herausstellt, wird die CLR nicht unterstützt dieses Konzept, können Sie lokale Variablen, die Referenzen sind, aber keine Felder. Aber C# nicht sogar lassen Sie Sie erklären, wie lokale Variablen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Würden Sie besser dran, die Erstellung Ihrer eigenen Wrapper über Int32, damit die änderungen übernommen werden, denn sobald die Werte zugeordnet sind Felder der Klasse sind Sie nicht länger auf, sondern verschiedene Instanzen von Int32. Betrachten Sie den folgenden code:
So, jetzt haben Sie eine ganze Zahl -- eine wrapper-Klasse über Int32. Die Nutzung bringen Ihnen die Ergebnisse:
Ausgabe:
Sie können auch finden es hilfreich, mehr zu Lesen über Klassen und Strukturen in C#, wie z.B. http://msdn.microsoft.com/en-us/library/ms173109.aspx . (Int32 ist eine Struktur, in der Erwägung, dass in Ihrem Fall müssen Sie wahrscheinlich eine Klasse)
Nicht möglich. Sie können nicht speichern Sie eine Referenz auf ein
int
als Mitglied, und nurint a
ist eine Kopie - änderungen auf die Kopie, nicht das original ändern, wie Sie gesehen haben.Könnten Sie wickeln, dass
int
innerhalb einer Klasse. Können Sie speichern eine Referenz auf die Klasse und arbeiten es dann.Was Sie versuchen zu tun, kann nicht getan werden, wie es war nicht entworfen zu sein verwendet auf diese Weise. Sie haben die Parameter gehen in die
Work
Methode, sondern direkt z.B.Dieses Verhalten wird verursacht durch:
int
ist eine Struktur (einen Wert geben). Dies bedeutet, dass Sie übergeben NICHT die Referenz (oder Zeiger) auf die Felder, wie Sie vielleicht erwarten, auch wenn Sie das ref-Schlüsselwort verwenden. Was Sie tun, stattdessen ist die Zuordnung zu den Bereichen der ganzzahligen Werte, die als Eingabe, nichts mehr.Das zu erreichen, was Sie erwarten, verwenden Sie ein Referenz-Typ (wickeln Sie Ihre ganze Zahl in eine Klasse) oder verweisen Sie Ihre ganze zahlen (durch das ref-Schlüsselwort) in der Methode, wo Sie tatsächlich ändern Sie Ihre Werte:
Zu verstehen, mehr über das ref-Schlüsselwort geben Sie einen Blick zu: ref (C# - Referenz).