感谢几天前回答我以前的问题的好心人,我现在知道如何通过引用传递论点:
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>
答案 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;
}
}