W poniższym kodzie próbuję mieć metodę (Praca) z klasy TestClass, zmieniając wartości niektórych zmiennych w programie głównym bez konieczności ich zwracania. Zmienne są przekazywane przez odniesienie w konstruktorze TestClass.C# - przekazywanie parametrów przez odwołanie do konstruktora, a następnie użycie ich z metody
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);
}
}
Jednak kod ten zwraca:
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
Czy istnieje jakiś sposób, aby mieć metoda zmiany wartości zmiennych w programie głównym? Dziękujemy!
Będziesz musiał przechowywać * referencje * w '_a', etc, ale właśnie zadeklarowałeś je jako' int's. Jak się okazuje, środowisko CLR nie obsługuje tej koncepcji - możesz * mieć * zmienne lokalne, które są referencjami, ale nie pola. [Ale C# nie pozwala nawet zadeklarować takich zmiennych lokalnych] (http://blogs.msdn.com/b/ericlippert/archive/2011/06/23/ref-returns-and-ref-locals.aspx). –