通过引用分配给变量?

时间:2019-05-22 05:12:02

标签: c#

感谢几天前回答我以前的问题的好心人,我现在知道如何通过引用传递论点:

static void Main()
{
    int i = 0;
    Add(ref i, 100);
    // now i == 100
}

static void Add(ref int arg, int increment)
{
    arg += 100;
}

但是我是否有办法不只是通过引用传递i,而是将其位置实际存储在另一个变量中?我的意思是像我在示例中一样使用i;影响原始实例,但以一种永久链接而不离开范围的方式。

我隐约知道我可以使用一个指针来确定unsafe上下文中的位置,但是我想知道是否可以在没有任何其他条件的情况下做到这一点,或者是否建议使用不安全的方法。 / p>

2 个答案:

答案 0 :(得分:1)

如果您使用的是C#7,则可以使用ref local and ref return存储对任何字段的可更新引用。

在此示例中,我将私有字段_privateField从其定义所在的类Foo的值从0更改为100,方法是将其返回为ref int并通过以下方式对其进行更新:参考。

class Foo
{
    private int _privateField = 0;

    public ref int GetReference()
    {
        return ref _privateField;
    }

    public override string ToString() 
    {
        return _privateField.ToString();
    }

}

public class Program
{
    public static void Main()
    {
        var foo = new Foo();
        var referenceToPrivateField = foo.GetReference();
        referenceToPrivateField = 100;
        Console.WriteLine(foo);
    }
}

在此之前,您必须将值存储在对象中包含的字段中,并转而引用对该对象的引用。

在此示例中,即使值(间接存储在Foo实例内部私有的字段中,我也将Foo外部的值从0更改为100。

class ValueTypeReference<T> where T : struct
{
    public  T Value { get; set; }
}

class Foo
{
    private ValueTypeReference<int> _privateField = new ValueTypeReference<int>{ Value = 0 };

    public ValueTypeReference<int> GetReference()
    {
        return _privateField;
    }

    public override string ToString() 
    {
        return _privateField.Value.ToString();
    }

}

public class Program
{
    public static void Main()
    {
        var foo = new Foo();
        var referenceToPrivateField = foo.GetReference();
        referenceToPrivateField.Value = 100;
        Console.WriteLine(foo);
    }
}

输出:

100

答案 1 :(得分:0)

好吧,如果我正确地理解了,您希望变量具有全局范围,可以通过将变量作为类field / property来实现:

class Program
{
  private static int _i;

  static void Main()
  {
    _i = 0;
    Add(100);
    // now _i == 100
  } 

  static void Add(int increment)
  {
    _i += 100;
  }
}