是否可以在 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# 中返回对变量的引用? [复制] 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK

随机推荐

  • 如何确定以下默认 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