c# - 通过引用分配给变量?
问题描述
感谢几天前回答我上一个问题的好心人,我现在知道如何通过引用传递参数:
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# 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
推荐阅读
- flutter - 在 Flutter 的 ButtonBar 中添加 TextField
- c++ - 如何在 Windows 10 的自定义凭据提供程序中更改 LOCK 场景 CPUS_UNLOCK_WORKSTATION 条件下用户的域密码
- xml - 将 XML 转换为 AVRO - 带有封闭属性和元素值的 xml 元素
- ubuntu - 当我使用 client_body_temp_path 时,Linux(Ubuntu)和 Nginx 权限在另一个磁盘上
- vue.js - Vuejs:在 [__ob__: Observer] 中获取价值
- javascript - 反应本机 RNFetchBlob 创建文件未创建正确的文件
- c++ - 在这种情况下可以避免模板专业化吗?
- reactjs - React-Bootstrap 和 Bootstrap 未使用 NPM 安装
- c++ - 使用 Clang++ 编译器从 Visual Studio Code 运行 C++ 文件时,如何关闭 dSYM 文件?
- python - AttributeError:模块“PIL.Image”没有属性“load_img”