评估在 C# 中使用扩展方法的成本/收益 => 3.0 [关闭]

2023-11-27

在什么情况下(使用场景)您会选择编写扩展而不是对对象进行子类化?

我发现扩展方法的想法“很酷”,显然你可以用它们做“遥远”的事情,就像 Mitsu Furota (MS) 博客文章中的许多例子一样链接文本.

一位私人朋友编写了开源 Componax 库链接文本,那里有一些非凡的设施;但他完全掌控着他的小公司,完全控制着代码指南,每一行代码都“经过他的双手”。

虽然这是我的猜测:我认为/猜测在中型到大型软件团队重新使用扩展的情况下可能会出现其他问题。

查看 MS 的指南链接文本, 你发现 :

一般来说,你可能会是 更多地调用扩展方法 通常比实现你自己的更重要。 ... 一般来说,我们建议您 谨慎地实现扩展方法 并且仅在必要时才这样做。每当 可能的,必须扩展的客户端代码 现有类型应该这样做 创建一个派生自的新类型 现有类型。了解更多信息, 请参阅继承(C# 编程 指导)。 ...当编译器 遇到方法调用时, 首先在类型中查找匹配项 实例方法。如果没有匹配项 找到后,它将搜索任何 定义的扩展方法 类型,并绑定到第一个 它找到的扩展方法。

还有在女士家链接文本 :

扩展方法没有具体说明 安全漏洞。他们能 切勿用于冒充现有的 类型上的方法,因为所有名称 冲突的解决有利于 定义的实例或静态方法 由类型本身。扩展方法 无法访问任何私有数据 扩展课。

对我来说显而易见的因素包括:

  1. 我假设您不会编写扩展,除非您希望它被非常普遍和频繁地使用。另一方面:你不能对子类说同样的话吗?

  2. 知道我们可以将它们编译成一个单独的 dll,然后添加编译后的 dll,引用它,然后使用扩展:这很“酷”,但这是否“平衡”了编译器首先必须检查的固有成本如果实例方法是如上所述定义的。或者,在发生“名称冲突”的情况下,使用静态调用方法来确保调用您的扩展而不是实例定义的成本?

扩展的频繁使用会影响运行时性能或内存使用:我不知道。

因此,与子类相比,我很感激您的想法,或者了解您如何/何时使用或不使用扩展。

谢谢,比尔


我对它们的最大用途是扩展封闭的第 3 方 API。

大多数时候,当软件开发人员在 Windows 上提供 API 时,他们会越来越倾向于 .NET 的可扩展性。我喜欢这样做,因为我更喜欢依赖我自己的方法,我可以在将来修改这些方法,并作为他们的 API 的全局入口点,以防他们更改它。

以前,当必须这样做时,我无法继承 API 对象,因为它是密封的或其他什么,我会依赖适配器模式制作我自己的类来包装他们的对象。这是一个实用但相当不优雅的解决方案。扩展方法为您提供了一种向您无法控制的事物添加更多功能的绝妙方式。

许多其他人对它们的最大用途是LINQ!

如果没有提供给 IEnumerable 的扩展方法,LINQ 就不可能实现。

人们之所以喜爱他们,是因为它们使代码更具可读性.

我注意到扩展方法的另一个主要用途(包括我自己)是使代码更具可读性,并使代码看起来好像在做某事属于它应该在的地方。它还摆脱了我多次看到的可怕的“Util”静态神级。什么看起来更好...Util.DecimalToFraction(decimal value); or value.ToFraction();?如果你像我一样,那就是后者。

最后,有些人认为“静态方法”是EVIL!

许多“优秀的程序员”会告诉您应该尽量避免静态方法,尤其是那些使用大量单元测试的静态方法。静态方法在某些情况下很难测试,但它们not evil如果使用得当。而扩展方法ARE静态...它们看起来或行为不像它。这允许您将这些静态方法从类中取出,并放到它们真正应该附加到的对象上。

至于性能..

扩展方法与调用静态方法没有什么不同,将要扩展的对象作为参数传递......因为这就是编译器将其转变为的内容。这样做的好处是你的代码看起来很干净,它可以做你想要的事情,并且编译器会为你处理肮脏的工作。

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

评估在 C# 中使用扩展方法的成本/收益 => 3.0 [关闭] 的相关文章

随机推荐

  • 无法从使用本地类型参数化的另一个包中实现来自另一个包的泛型类型的特征

    此测试代码 playpen use std fmt Display Formatter Error struct MyLocalType type MyResult Result
  • 在java中绘制圆的切片?

    我想通过一个实心圆来表示一个计时器 该实心圆是在计时器的过程中逐段完全绘制的 IE 如果在 4 秒计时器内每 1 秒填充一次圆圈 第一个将显示四分之一圆 然后是半圆 然后是四分之三 最后是一个完整的圆 有没有办法在java中绘制这些圆的切片
  • 在 hbase shell 上执行 ValueFilter 或 ColumnFilter

    谁能告诉我如何从 hbase shell 命令行执行限定符过滤器或 ValueFilter 它与使用任何编程语言进行编码的方式非常相似 例如 import org apache hadoop hbase filter CompareFilt
  • Hadoop mapReduce 如何在 HDFS 中仅存储值

    我用它来删除重复的行 public class DLines public static class TokenCounterMapper extends Mapper
  • 字符串池行为

    我读了这个关于Java字符串池的问题并了解字符串池的基本概念 但仍然不了解其行为 第一 如果直接赋值并且 s1 和 s2 都引用池中的同一个对象 它就可以工作 String s1 a bc String s2 ab c System out
  • 阻止元素参与文本选择

    我有一些源代码 pre code 行号在单独的 div 选择文本后 行号会随之出现 并随后被复制 即使我选择源代码块上方和下方的元素 是否有任何方法可以防止行号成为选择的一部分 为了那些关闭 JavaScript 的人的利益 我想避免使用
  • System.arrayCopy 很慢

    我一直在尝试测量 System arrayCopy 与 Arrays copyOf 的性能 以便正确选择其中之一 只是为了基准测试 我还添加了手动复制 结果令我惊讶 显然我错过了一些非常重要的东西 你能告诉我它是什么吗 实现如下 见前4种方
  • 为什么长长联合成员的对齐比包含的联合/结构更大?它是否正确?

    From 这个问题人们可能会开始相信 一个联盟的联盟不小于其单个成员的最大联盟 但我有一个问题long long输入 gcc g 完整的例子可以找到here 但以下是我的问题的相关部分 union ull long long m struc
  • C# 加权随机数

    我需要游戏编程方面的帮助 你打开一个箱子 并以给定的概率找到一个物品 物品 机会 A 10 B 30 C 60 Random random new Random int x random Next 1 101 if x lt 11 Numb
  • Ruby 拒绝正确划分

    我只是想得到一个百分比 irb main 001 0 gt 25 50 100 gt 0 正如我的计算器所证实的那样 这绝对应该等于 50 将相同的方程复制并粘贴到 gcalc 中 为什么 Ruby 拒绝这样做 它正在做整数除法 基本上 2
  • LINQ 列表到句子格式(插入逗号和“and”)

    我有一个 linq 查询 它执行一些简单的操作 例如 var k people Select x gt new x ID x Name 然后我想要一个函数或 linq lambda 或者使用逗号和 and 以句子格式输出名称的东西 1 Jo
  • 程序完成后分支预测器条目失效?

    我试图了解分支预测器条目何时无效 以下是我所做的实验 Code1 start measure branch mispred while X times if something something do useless endif endw
  • 如何将 JavaFX 2 中场景图形的内容输出到图像

    如何输出a的内容SceneJavaFX 2 中的图表到Image 事实上 我正在开发一个应用程序 它基本上是设计卡片的 因此 用户只需单击各种选项即可自定义场景 最后我想将场景内容导出到图像文件 我怎么做 在 FX 2 2 中出现了新的快照
  • 从 Xamarin Android 上的另一个 Activity 启动一个 Activity

    我发现这个 java 代码可以创建一个通用方法来从其他活动启动任何活动 public void gotoActivity Class activityClassReference Intent i new Intent this activ
  • 如何通过点击html元素获取xpath

    我对编程很陌生 必须在单击 html 元素时生成 Xpath 例如 如果我单击了用户名的文本框 那么它应该给我类似的 xpath html head body tr 1 table 2 等等等等 最主要的是我不能使用 firebug 因为我
  • 我可以检查现在是否有 UIAlertView 显示吗? [复制]

    这个问题在这里已经有答案了 我可以在 iOS 应用程序的任何部分检查当前是否显示 UIAlertView 吗 我找到了这段代码 NSClassFromString UIAlertManager performSelector selecto
  • ASP.NET MVC 从数据库加载 Razor 视图

    ScottGu 提到我们应该能够从数据库加载 Razor 视图 查看评论部分 那么有人有关于如何做到这一点的示例吗 Thanks 您可能想检查从数据库而不是文件中提取视图 or 使用 VirtualPathProvider 从 DLL 加载
  • Android - 如何使用包名称启动第三方应用程序?

    我想知道如何使用包名称从我的应用程序启动另一个应用程序 我有字符串格式的包名称 例如 String pkgName com example appName 这就是为什么我无法从中获取类名或任何其他有价值的详细信息 我可以用它们来做出正确的意
  • 休眠实现。我们是否付出了反思代价?

    很久以前 我正在使用反射创建一个迷你 ORM 在阅读有关反射的内容时 我得到了类似的答案 Java 反射性能 这是完全有道理的 我退出了我的迷你 orm 并锐化了我的 CTRL C CTRL V 键 该库的目的是避免在我正在开发的网络应用程
  • 评估在 C# 中使用扩展方法的成本/收益 => 3.0 [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在什么情况下 使用场景 您会选择编写扩展而不是对对象进行子类化 我发现扩展方法的想法 很酷 显然你可以用它们做 遥远 的事情 就像 Mitsu Furota MS 博客文章中的许多例子一样