首页 > 解决方案 > 通过引用分配给变量?

问题描述

感谢几天前回答我上一个问题的好心人,我现在知道如何通过引用传递参数:

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

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

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

我隐约知道我可以使用指针来确定unsafe上下文中的位置,但我想知道我是否可以在没有任何这些的情况下做到这一点,或者是否只是建议使用 unsafe 方法。

标签: c#

解决方案


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

在此示例中,我将私有字段_privateField从外部更改为 0 到 100 Foo,它是在其中定义的类,方法是将其作为 a 返回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);
    }
}

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

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

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

推荐阅读