是否可以在 C# 中返回对变量的引用? [复制]

2023-12-11

例如,我可以返回对双精度值的引用吗?

这就是我想做的:

ref double GetElement()
{
   ......
   // Calculate x,y,z
   return ref doubleArray[x,y,z];
}

像这样使用它

void func()
{
   GetElement()=5.0;
}

这就像在 C++ 中返回双指针...... 我知道我写的方式是错误的..但是有正确的方法吗?


更新:C# 7 现在支持所需的功能。


CLR 类型系统确实支持引用返回方法,并且我已经编写了 C# 编译器的实验原型,它支持您想要的功能。 (原型还实现了引用类型局部变量,但引用类型字段在 CLR 类型系统中是非法的。)

您已经准确地想到了我为原型选择的语法,这意味着要么伟人所想都是一样的,要么傻瓜永远不会不同。

尽管原型工作得很好,但这不太可能使栏成为下一版本 C# 语言的功能。很少有客户想要这个功能,实现起来相当昂贵,我们有一个与您的手臂一样长的更重要功能的列表,并且还有其他方法可以使此类事情发挥作用,而不会给类型系统增加这种复杂性。这些都是对该功能的巨大“反对点”。

例如,您可以创建一对代表:

struct Ref<T>
{
    private readonly Func<T> getter;
    private readonly Action<T> setter;
    public Ref(Func<T> getter, Action<T> setter)
    {
        this.getter = getter;
        this.setter = setter;
    }
    public T Value { get { return getter(); } set { setter(value); } }
}

var arr = new int[10];
var myref = new Ref<int>(()=>arr[1], x=>arr[1]=x);
myref.Value = 10;
Console.WriteLine(myref.Value);

这比使用 ref 返回实现的相同功能要慢得多,但好处是您可以制作Ref<T>在 ref 不合法的地方。例如,您可以存储Ref<T>在字段中,您无法使用引用返回方法来做到这一点。

如果你有一个非常令人信服的场景来说明为什么你need引用返回方法,我会love来听听这件事。我们拥有的真实场景越多,这样的功能就越有可能在假设的未来版本的语言中实现。

另请参阅相关问题:

我可以在 C# 函数(如 C++)中使用引用吗?

为什么C#不支持引用的返回?

以及我关于该主题的博客文章:

http://ericlippert.com/2011/06/23/ref-returns-and-ref-locals/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 C# 中返回对变量的引用? [复制] 的相关文章

随机推荐

  • 如何确定以下默认 Web 配置值?

    我一直收到 连接强制关闭 错误 在研究解决方案时 我看到了使用以下 web config 选项进行付款的建议 这些选项目前未在我的网络应用程序中设置 在更改它们之前 我想知道它们当前的设置 有人可以告诉我如何从 NET 代码 最好是 VB
  • Firebase Storage getDownloadUrl() 方法无法解析

    上传images to Firebase 存储我正在附加addOnSuccessListener的实例存储参考 覆盖时onSuccess我正在调用的方法getDownloadUrl 以taskSnapshot但它给了我一个错误说 无法解析方
  • javafxports如何调用android原生媒体播放器

    由于 javafxports Media 尚未实现 我希望改用 Android Native MediaPlayer 有谁知道如何做到这一点 如果您查看 GoNative 示例here docs and code 您将找到一种将 Andro
  • 使用 Crypto++ 在 secp521r1 上进行标量乘法

    我正在用 C 编写以下椭圆曲线标量乘法代码 当我不初始化点的值时 代码会运行 但是当我这样做时 它会给我 nullptr 错误 我尝试过以下代码 ECP r1 ECPPoint basepoint ECPPoint 2 3 ECPPoint
  • 使用队列触发器和消费计划上的 functionAppScaleLimit 进行 Azure Functions 扩展和并发

    我在 Linux 消费计划上有一个 Azure Function 应用程序 它有两个队列触发器 两个队列触发器都有batchSize参数设置为1因为它们每个都可以使用大约 500 MB 的内存 而我不想超过 1 5 GB 内存限制 所以应该
  • 如何禁用 JTextArea Swing 上的文本选择

    我不希望用户选择上的内容JTextArea 我用setEditable false 但它不起作用 如何禁用此功能JTextArea成分 你能给我建议吗 谢谢 如果您只想禁用任何摆动控件上的文本选择 例如JtextArea您可以使用下面的编码
  • “内联”函数定义的目的是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中内联函数的好处 有什么区别 include
  • 如何将SQL Server中没有分隔符的日期时间字符串转换为日期时间?

    我希望转换这样的字符串 20160520191959550 这实际上是日期时间2016 05 20 19 19 59 我尝试使用CAST as datetime在 SQL 语句中 但出现此错误 从字符串转换日期和 或时间时转换失败 这是 S
  • Google Chrome 扩展的 onBrowserClose 事件?

    我正在为 Google Chrome 开发一个扩展 我的后台脚本每次都会在使用 XMPP API 的服务器上进行授权 并订阅 PubSub 节点 我需要在退出时取消订阅 否则虚拟订阅将保留在服务器上 有没有onBrowserCloseGoo
  • 带有 pabot 的机器人框架:是否可以在两个测试中将两个不同的值传递给变量

    例子 我有file1 robot and file2 robot并且每个都有 var 作为变量 我可以将两个不同的值传递给这个值吗 var 在命令行中 就像是pabot v var one two file1 robot file2 rob
  • 经典 ASP 日期之间的工作日数

    经典 ASP VBScript 中有没有办法获取两个日期之间的工作日数 显然 我们有DateDiff 函数 但这会拉回总天数 但我想省略周末 你说得对 DateDiff 不包括这一点 但它可以与WeekDay 计算出是否Day适逢周末 通过
  • 如何对发送到服务器的http请求进行加密?

    是否可以隐藏 或加密 HTTP 请求的内容 以便授权人员之外的其他人无法查看它 例如 如果一个用户只是在登录页面中提交数据 即使使用 http post 那么也可以在 firebug 类工具中看到请求标头中包含的用户名和密码等内容 我知道客
  • 条件 DB2 SQL 查询

    假设我有一个名为 Company 的表 其键为 CompanyID 还有另一个名为 CompanyAddress 的相关表 它具有 CompanyID 外键 因此可以轻松建立连接 此 CompanyAddress 表可以具有给定公司的多个地
  • 从 cs 文件加载脚本并访问主机方法、属性等?

    我只是在和罗斯林玩 但不确定如何执行以下操作 为了保持简单 假设我有一个主机程序 它有一个像这样的方法 public void DisplayMessage string message MessageBox Show message 然后
  • 确定数组是否包含 n...n+m 的算法?

    我在 Reddit 上看到这个问题 但没有给出积极的解决方案 我认为在这里问这个问题是一个完美的问题 这是关于面试问题的帖子 编写一个方法 该方法接受大小为 m 的 int 数组 如果该数组包含数字 n n m 1 该范围内的所有数字以及仅
  • 实现自定义配置节处理程序

    从各种来源 包括 stackOverlflow 收集的信息 但是当我开始使用它时 我收到以下错误消息 配置属性 deviceconfig 可能不是从 ConfigurationSection 派生的 我现在已经在这个问题上挣扎了一整天 而且
  • 在java程序中执行bash命令

    自从我寻找以来已经有一段时间了 但我没有找到解决方案 我正在尝试在 Linux 上的 jar 文件中执行 bash 命令 为此 我尝试了很多方法 包括 Process p new ProcessBuilder java jar M1 MIA
  • 当变量值丢失时,Django 模板中的 Javascript 语法错误

    我有一个带有 AJAX 菜单的 Django 模板 单击不同的菜单项会重新加载页面的一部分 每次菜单单击都会通过 AJAX 调用 Django 视图函数并返回一些要在页面上显示的数据 我只加载主页中所有菜单项所需的所有 JS 据我所知 AJ
  • SerialPort.Read(....) 不尊重 ReadTimeOut

    与支付终端通信的一些旧代码中存在错误 在新的付款开始之前 代码会尝试清除串行端口的内部读取缓冲区 我将代码削减到最低限度 它使用 NET SerialPort 类型 设置读取超时为 50ms 然后它读取 512 字节并继续这样做 直到不再读
  • 是否可以在 C# 中返回对变量的引用? [复制]

    这个问题在这里已经有答案了 例如 我可以返回对双精度值的引用吗 这就是我想做的 ref double GetElement Calculate x y z return ref doubleArray x y z 像这样使用它 void f