有什么理由将 out 参数与 C# 7 元组返回值一起使用? [关闭]

2024-02-28

我刚刚观看了一个介绍C#7的新特性 https://www.youtube.com/watch?v=5ju2MuqKf_8。除此之外,它引入了返回元组类型的可能性(例如:(int, int),我相信,这只是一个语法糖Tuple<int, int>)。因此,如果我们有一个返回多个值的方法,那么 C# 中有 3 种可能的实现方式:

(int first, int second) ReturnTuple()
{
    return (1, 2);
}

int ReturnOutParam(out int second)
{
    second = 2;
    return 1;
}

CustomObject ReturnObject()
{
    return new CustomObject
    {
        First = 1,
        Second = 2
    };
}

我相信,没有更多的方法可以做到这一点 - 如果是,请纠正我。

这三种方法中哪一种是正确的?剩下的两个在什么情况下可以使用呢?随着每一个新的 C# 版本的发布,我都感觉有一两个设计模式在 .NET 世界中已经过时了。有些功能非常有用(例如泛型、部分、LINQ、lambda、async/await 或 null 传播器)。其他的则是非常情境化的(动态的,nameof)。还有一些对我来说没有意义的东西(属性自动初始化器、元组返回值或本地函数)。


首先也是最重要的,像这样的元组(int, int)是语法糖ValueTuple<int, int>。之间的差异Tuple and ValueTuple are:

  • ValueTuple是值类型,因此不需要在堆上分配对象
  • ValueTuple是可变的
  • ValueTuple具有(显然)内置语言支持,并且它允许您通过自定义属性命名元组项目(TupleElementNamesAttribute). With Tuple,你只会得到Item1, Item2 etc.

每个新的语言版本都会有一些功能变得过时。例如,delegate { }语法被 lambda 取代。你可能会争辩说out参数属于这一类,但这是主观的。然而,所有功能都需要保留以实现向后兼容性。

例如,bool int.TryParse(string input, out int value)应该成为int? int.TryParse(string input)语言中包含了可空值类型,但旧函数已经存在于框架中,因此它必须保留。

我的经验法则是:对私有方法或实用函数使用值元组,但更喜欢对任何公共 API 使用成熟的结构,这样感觉更干净。我一般会避免outparams 除了偶尔用于私有方法之外。

我不明白为什么其中一些新功能对您来说没有意义:

  • 属性自动初始化器是finally在那里,它们首先应该与自动属性一起实现,但由于时间限制可能被跳过。这对于代码可读性来说是一个明显的胜利,并且它添加了字段始终存在的功能。
  • 元组返回值是您问题的主题,它也明显优于旧元组的可读性。能够为元组项目命名是不言而喻的。
  • 局部函数对于实现迭代器模式来说大多是有用的,但我偶尔希望拥有这样的功能,并通过使用 lambda 来解决它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有什么理由将 out 参数与 C# 7 元组返回值一起使用? [关闭] 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • oracle sql listagg [重复]

    这个问题在这里已经有答案了 SELECT deptno LISTAGG ename WITHIN GROUP ORDER BY ename AS employees FROM emp GROUP BY deptno 错误 ORA 00923
  • Java如何访问try-catch块之外的变量

    我是java初学者 正在玩try catch块 但是 我无法获取try catch块之外的变量 以下代码有效 class factorial public static void main String args try int num I
  • Buildroot:仅构建一个包作为共享和静态库,所有其他包仅共享

    buildroot 提供了构建的可能性 仅静态 只分享 或共享库和静态库 所选软件包的数量 分配的配置元素是BR2 STATIC LIBS BR2 STATIC LIBS and BR2 SHARED STATIC LIBS 问题 是否可以
  • ECS 任务/容器的 Terraform AWS CloudWatch 日志组

    我正在尝试使用 Terraform 创建一个 AWS ECS 任务 它将日志放入 CloudWatch 上的特定日志组中 问题是容器定义位于 JSON 文件中 我无法将 CloudWatch 组名称从 tf 文件映射到该 json 文件 容
  • 打破 tcl 中的父循环

    我在 while 循环中有一个 for 循环 我有一个条件要打破 for 循环中的 while 这是代码 while gets thefile line gt 0 for set i 1 i lt count table incr i if
  • 计算两个 GPS 坐标之间的罗盘方位时出现问题

    在我的 web 应用程序中 有一个来自数据库查询的 JSON 数据响应 其中包括 1 到 n 个位置的纬度 经度坐标 我想计算轴承data i 位置到当前位置 我一直在调整代码here http www movable type co uk
  • 如何在spray-json中表示可选字段?

    我的请求有一个可选字段 case class SearchRequest url String nextAt Option Date 我的协议是 object SearchRequestJsonProtocol extends Defaul
  • 获取this.title属性的前2个字符,并调用对应的id

    我试图检索链接标题属性的前两个字符 将其存储到变量中 然后将该变量作为函数调用 在代码中 它说 s 是我想要放置该值的位置 有任何想法吗 flow click function if labelstatus 1 rmflow a weflo
  • 错误:“使用移动值”

    我目前正在学习 Rust 并且正在使用一个简单的计算器 重构时 我最终得到了如下代码 enum OptionalToken Foo Bar fn next token gt OptionalToken Read input classify
  • JavaScript:如何动态“过滤”我的对象

    我如何使用 JavaScript filter 属性作为过滤器我的 JavaScript 对象 我一直在阅读以下内容StackOverflow 帖子 https stackoverflow com questions 1694717 jav
  • 如何使用 Firefox Addon Builder 记录选定的文本?

    我遵循了几个教程但没有成功 我认为这是一个经典的例子 但我无法让它发挥作用 我可以保存我的项目 安装插件 当我选择一些文本时 我可以看到上下文菜单项 日志选择 但是当我单击它时 什么也没有发生 exports main function v
  • jquery 上下文选择器与 .find()

    什么更有效 var container container 1 var links1 container find a 2 var links2 a container 我个人比较喜欢 a container 因为看起来更好 但是它们的性能
  • Makefile `echo -n' 不起作用

    我试图让我的 Makefile 回显文本而不带尾随换行符 但我做不到 我在 OS X 上遇到了这种行为 在 Linux 上一切都按预期工作 Makefile a echo n hello b echo n hello c bin echo
  • 根据控制器响应动态更改视图部分

    我正在寻找以下场景的最佳方法建议 用户可以选择一个或多个 csv 文件进行验证 附件 1 单击 验证 按钮会执行验证代码 显示进度条 直到返回输出 返回响应可以是成功消息 也可以是选择验证的每个文件的错误详细信息 附件 2 现在可以使用 上
  • Makefile:目标依赖项 - 如何始终制作它?

    This will most probably be obvious and or a banality But since I am trying different approaches for hours without succes
  • Entity Framework 4 生成的查询正在连接完整表

    我有两个实体 Master 和Details 当我查询它们时 对数据库的查询结果是 SELECT Extent2 needed columns listed here Extent1 needed columns listed here F
  • 将自定义视图添加到工具栏

    我现在正在与 Cocoa 斗争两个小时 但没有成功 我想向工具栏添加自定义视图 因此 我向窗口添加了一个 NSToolbar 使用 IB 并添加了我的视图 效果完美 IB自动创建了一个NSToolbarItem 我按照苹果的说明进行操作 h
  • 将 Sencha Touch 与 jQuery 相结合

    我已经在 Sencha Touch 工作了几个星期 虽然这个框架非常强大 但我仍然发现它有一些难以使用的地方 特别是用于复杂嵌套 JSON 结果的 JSONP 数据存储 因此 我决定结合 jQuery 有用的 AJAX 和 JSON 函数
  • 拉直 B 样条线

    我插入了一条样条曲线 以将图像中的像素数据与我想要拉直的曲线相匹配 我不确定什么工具适合解决这个问题 有人可以推荐一种方法吗 这是我获取样条线的方法 import numpy as np from skimage import io fro
  • 有什么理由将 out 参数与 C# 7 元组返回值一起使用? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我刚刚观看了一个介绍C 7的新特性 https www youtube com watch v 5ju2MuqKf 8 除此之外 它引入了返回元