我有int变量让我们说:
int x = 0;
然后我把它传递给应该持有它的类,它有Print方法打印该变量的当前值。
然后在另一个类中我改变了i值,因此我希望在调用打印的i变量的print new值之后在MyPrinter类中。有可能吗?
以下示例代码:
int x = 0;
MyPrinter printer = new MyPrinter(x);
printer.Print(); //Expected result is 0
x++;
MyPrinter.Print(); //Expected result is 1
答案 0 :(得分:7)
当int
传递给方法或构造函数时,它按值传递,被调用者获取值的副本。此副本与原始副本无关,因此对一个副本的更新不会反映在另一个副本上。可以通过ref
传递它,但这不适合,因为ref
不能用于类型的字段。
为了完成这项工作,您需要将int
值放入class
,然后将该类传递到MyPrinter
。
class Container {
public int Value;
}
Container x = new Container();
MyPrinter printer = new MyPrinter(x);
printer.Print();
x.Value++;
MyPrint.Print(); // x.Value is 1
答案 1 :(得分:5)
您可以将您的课程更改为Func<int>
并关闭x
,例如。
public class Printer
{
private readonly Func<int> f;
public Printer(Func<int> f)
{
this.f = f;
}
public void Print()
{
Console.WriteLine(f());
}
}
MyPrinter printer = new MyPrinter(() => x);
printer.Print(); //Expected result is 0
x++;
MyPrinter.Print(); //Expected result is 1
答案 2 :(得分:3)
正如其他人所指出的那样,如果不将int包装在引用类型中或者做一些其他时髦的东西,就不能这样做。
然而,我认为这忽略了这一点,即你正在解决所有错误的问题。这是一种更加符合OOP的方式来解决您的问题:
public class Printer
{
public int Value { get; set; }
public Printer(int x)
{
Value = x;
}
public void Print()
{
Console.WriteLine(Value);
}
}
public class Program
{
public static void Main()
{
var printer = new Printer(0);
printer.Print();
printer.Value++;
printer.Print();
}
}
答案 3 :(得分:1)
除非您将int
包装在引用类型中,以便MyPrinter
将int
保存为您正在修改的同一对象的引用的一部分,否则无法执行此操作。< / p>
编辑:@JaredPar有相同的答案,但有一个干净的代码示例! :)强>
答案 4 :(得分:1)
为了使其正常工作,您需要传递一些引用类型而不是值类型。实例原语总是按值传递,但是没有什么可以阻止你传递实例 - 但这需要重新设计你的类:考虑以下(c#类伪代码)...
public class Container
{
public int x;
}
... // some implementation in another class
Container myContainer = new Container();
myContainer.x = 0;
MyPrinter printer = new MyPrinter(myContainer);
printer.Print(); //Result is 0
myContainer.x ++;
MyPrinter.Print(); //Result is 1
这假定MyPrinter
类知道如何处理Container
实例。
这里发生了什么?那么像int
这样的原语是按值传递的 - 这意味着程序在将它传递给方法时会复制它:
int x = 0;
MyPrinter printer = new MyPrinter(x); // Makes a copy of x, and passes the copy to MyPrinter
printer.Print(); //Expected result is 0 - correct
x++; // Increments the local variable, but not the copy
MyPrinter.Print(); //Expected result is 1 - incorrect because only the local variable is updated.
相反:
Container myContainer = new Container();
myContainer.x = 0;
MyPrinter printer = new MyPrinter(myContainer); // Passes the reference to the same instance
printer.Print(); //Result is 0 - because it uses the variable attached to the instance
myContainer.x ++; // Increments the variable attached to the instance
MyPrinter.Print(); //Result is 1 - because the instance is still the same in both places - due to being passed by reference.