在c#中保持对int的引用

时间:2014-03-07 21:22:11

标签: c# .net pass-by-reference

我有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

5 个答案:

答案 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包装在引用类型中,以便MyPrinterint保存为您正在修改的同一对象的引用的一部分,否则无法执行此操作。< / 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.