您不能使用 C# 存储引用。只能ref
在调用方法时使用关键字。
您可以使用指针,但您只能使用fixed
表达式并在unsafe
上下文中执行此操作。
使用代表可以伪造这种东西,但我不确定它是否是你要找的东西。我也相当确定您确实需要重新设计您的方法,但是,这里有一个如何伪造它的示例...
首先,编写一个“值包装器”类,如下所示:
public class ValueWrapper<T>
{
readonly Func<T> get;
readonly Action<T> set;
public ValueWrapper(Func<T> get, Action<T> set)
{
this.get = get;
this.set = set;
}
public T Value
{
get
{
return get();
}
set
{
set(value);
}
}
}
然后你可以用它来改变值:
void run()
{
int x = 0;
var intWrapper = new ValueWrapper<int>(() => x, value => x = value);
test(intWrapper);
Console.WriteLine(x); // Prints 42, which shows that x was changed.
TextBox textBox = new TextBox {Text = ""};
var stringWrapper = new ValueWrapper<string>(() => textBox.Text, value => textBox.Text = value);
test(stringWrapper);
Console.WriteLine(textBox.Text); // Prints "Changed".
}
static void test(ValueWrapper<int> wrapper)
{
wrapper.Value = 42;
}
static void test(ValueWrapper<string> wrapper)
{
wrapper.Value = "Changed";
}
您还可以在一种方法中创建包装器并将其传递给使用包装器更改原始包装对象中的属性的不同方法,如下所示:
void run()
{
TextBox textBox = new TextBox {Text = ""};
var wrapper = test1(textBox);
test2(wrapper);
Console.WriteLine(textBox.Text); // Prints "Changed"
}
void test2(ValueWrapper<string> wrapper)
{
wrapper.Value = "Changed";
}
ValueWrapper<string> test1(TextBox textBox)
{
return new ValueWrapper<string>(() => textBox.Text, value => textBox.Text = value);
}
警告:这确实会导致一些相当令人头疼的代码,例如:
void run()
{
var intWrapper = test();
intWrapper.Value = 42;
Console.WriteLine(intWrapper.Value); // Works, but where is the value? It can't be the x inside test()!
}
ValueWrapper<int> test()
{
int x = 0;
var intWrapper = new ValueWrapper<int>(() => x, value => x = value);
return intWrapper;
}
所以我们返回了一个显然是从 test() 内部包装了一个局部变量的ValueWrapper
。test()
然后我们显然可以更改值并将其打印出来......
当然,这并不是真正发生的事情,但它可能会令人困惑!