“谨慎使用扩展方法”背后的动机是什么?

2024-01-06

我发现它们是扩展现有类的非常自然的方式,特别是当您只需要将某些功能“点焊”到现有类上时。

微软表示,“一般来说,我们建议您谨慎地实现扩展方法,并且仅在必要时才实现。”然而,扩展方法构成了 Linq 的基础;事实上,Linq 是创建扩展方法的原因。

是否存在特定的设计标准,其中使用扩展方法优于继承或组合?他们在什么标准下被劝阻?


我们向 C# MVP 展示了提议的新语言功能(至少是那些有一定机会面世的功能)以获得早期反馈。我们经常收到的关于许多功能的一些反馈是“很好I会根据该功能的设计原则明智地使用该功能,但是我的傻瓜同事我会对这个东西发疯,写出大量无法维护、无法理解的代码,在接下来的十年里我将陷入调试的困境,所以尽管我想要它,但请永远不要实现这个功能!”

虽然为了喜剧效果我有些夸张,但这是我们非常认真对待的事情;我们希望新功能的设计能够鼓励它们的使用,但阻止它们的滥用。

我们担心扩展方法会被用来,例如,不加区别地任意扩展“对象”,从而创建松散类型的大泥球,这将难以理解、调试和维护。

我个人特别关心您在“流畅”编程中看到的“可爱”扩展方法。像这样的东西

6.Times(x=>Print("hello"));

恶心。 “for”循环在 C# 中是普遍可以理解和惯用的;别变得可爱.

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

“谨慎使用扩展方法”背后的动机是什么? 的相关文章

  • 在 Vulkan 中,图形队列系列与当前队列系列分离是否有益?

    据我所知 队列系列可能支持呈现到屏幕但不支持图形 假设我有一个同时支持图形和呈现的队列系列 以及另一个仅支持呈现的队列系列 我应该为两个进程使用第一个队列系列 还是应该将第一个队列系列委托给图形 将后者委托给呈现 或者这两种方法之间没有明显
  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其

随机推荐

  • django-compressor 离线生成错误

    我正在尝试使用 django compressor 压缩我的 CSS 文件 但我不断收到此错误 compressor exceptions OfflineGenerationError You have offline compressio
  • 如何在 React Navigation 中刷新

    一旦我删除用户令牌 用户就会重定向到登录页面 但是如果我用其他用户登录 主页仍然显示以前的用户信息 这是因为我没有刷新主页 如何在反应导航中手动重新初始化 主页 MainPage Logged in as matt gt Logout gt
  • 从后台工作人员更新 GUI

    问题的名称是 从后台工作人员更新 GUI 但正确的名字是 world 从后台工作人员更新 GUI 或从后台工作人员报告多个变量 整数除外 请让我解释一下我的情况 在一个程序中 我有一个后台工作人员来分析信息 分析的结果是 表单 GUI 元素
  • 像 root 用户一样运行 PHP shell_exec()

    我构建了一个 PHP 应用程序 在其中为 Linux debian Jessie 创建命令行功能 一切正常 但我需要能够使用一些命令 例如 root 用户 有没有办法使用 shell exec 或类似的命令通过 PHP 像 root 用户一
  • postgres 中的顺序扫描和位图堆扫描有什么区别?

    在解释命令的输出中 我发现了两个术语 顺序扫描 和 位图堆扫描 有人可以告诉我这两种扫描有什么区别吗 我使用的是PostgreSql http www postgresql org docs 8 2 static using explain
  • Node.js 和express.js 中基于组/规则的授权方法

    Express js 中基于角色的授权有哪些好的策略 特别是对于快递资源 With 快递资源 https github com visionmedia express resource没有处理程序 所以我认为有三种选择 使用中间件 将授权函
  • 服务器管理 - 需要脚本来监控服务器上的可用空间

    需要脚本来监控服务器上的可用空间如果可用内存空间达到某个阈值发送警报邮件 PS 我认为解决方案是 Power Shell Windows Timer Job 不过我对 Power Shell 还很陌生 您可以使用如下命令获取可用磁盘空间 w
  • PHP 中的日历日视图

    我正在努力向现有日历解决方案添加日视图选项 像许多实现自己的日历的人一样 我正在尝试对 Google 日历进行建模 他们有一个出色的日历解决方案 并且他们的日视图提供了很大的灵活性 大多数情况下 实施进展顺利 然而 当涉及到冲突事件时 我遇
  • 如何更改DataGridView中某些单元格的边框颜色?

    我需要编程更改 CellFormatting 事件中某些单元格的边框颜色 单个单元的板颜色可以更改吗 你可以画一个矩形 在此示例中 我在选定的单元格上放置了红色边框 private void dataGridView CellPaintin
  • 客户端服务器udp套接字

    您好 我有一个 udp 客户端服务器代码无法正常工作 我问一个一般性问题 Shane 是个好孩子吗 这两个代码都没有出现错误 但是当我运行它输出的代码时 数据报发送数据包 新的 DatagramPacket sendData sendDat
  • Scala 中的类型级编程

    我想更深入地了解 Scala 中的类型级编程 因此我开始做一些小练习 我从类型级别的皮亚诺数的实现开始 这是下面的代码 sealed trait PeanoNumType Type at the end indicates to the r
  • 我是否需要在返回容器副本的函数上添加锁?

    class Manager public list
  • 在其他 html 元素周围是否放置

    其他 html 元素应该放在哪里 选项1 放置输入元素
  • 如何根据 Y 轴对点向量进行排序?

    例如我有一组坐标 10 40 9 27 5 68 7 55 8 15 如何在不丢失已排序 Y 轴的正确 X 轴的情况下对这些坐标进行排序 从上面的示例中 我想对坐标进行排序 因此正确的输出将是 8 15 9 27 10 40 7 55 5
  • 错误:实例化 `func::<[closure]>` 时达到递归限制

    我正在尝试测试二叉搜索树是否有效 use std cell RefCell rc Rc pub struct TreeNode val i32 left Option
  • 有C++跨平台USB库吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我 将 用 Qt 编写一个应用程序 该应用程序将在 3 个主要操作系统 Windows Linux 和
  • Pycharm - 当 python 控制台使用 IPython 时等待 REPL 响应

    当 PyCharm Python 控制台配置为使用 IPython 时 该控制台的响应时间慢得难以忍受 以前的安装中并非如此 当 Python 控制台未配置为使用 IPython 并使用 IDLE 时 它会正常执行 较差的响应时间似乎与 R
  • 我如何模拟请求和响应?

    我正在尝试使用Python模拟包 http www voidspace org uk python mock模拟Pythonrequests模块 让我在下面的场景中工作的基本调用是什么 在我的views py中 我有一个函数可以每次调用不同
  • 设置 TemplateField HeaderText 动态以进行本地化

    我正在尝试为 ASP NET 代码创建本地化 但在设置 TemplateField 的 HeaderText 时遇到问题 我有这个有效
  • “谨慎使用扩展方法”背后的动机是什么?

    我发现它们是扩展现有类的非常自然的方式 特别是当您只需要将某些功能 点焊 到现有类上时 微软表示 一般来说 我们建议您谨慎地实现扩展方法 并且仅在必要时才实现 然而 扩展方法构成了 Linq 的基础 事实上 Linq 是创建扩展方法的原因