.NET 4.0 中新的“动态”变量类型是否解决了 CLR 中的单/多方法分派问题?

2023-12-20

单次调度的问题对于使用 Java 和 C# 等静态类型语言进行编码的人来说最为熟悉。基本思想是:

而运行时多态性允许我们根据类型(运行时类型)分派到正确的方法调用receiver, 例如:

IAnimal mything = new Cat();
mything.chop();

方法调用将根据运行时类型进行mything,即Cat。 这是单一调度功能(Java/C# 中存在)。

现在,如果您不仅需要在接收器的运行时类型上进行分派,而且还需要在(多个)参数的类型上进行分派,那么您将面临一个小问题:

public class MyAcceptor {  
    public void accept (IVisitor vst) {...}   
    public void accept (EnhancedConcreteVisitor vst) {...}  
}

第二种方法永远不会被调用,因为在我们的“消费者”代码中,我们只是倾向于通过公共超类型或接口来处理不同类型的对象(我的示例中的访问者)。

这就是我问的原因 - 因为动态类型允许多重分派多态性,并且 C# 4.0 有该动态关键字;)


是的,动态类型允许多次分派 - 不,您不必创建自己的动态对象来执行此操作。

假设我们想要实现Enumerable.Count()我们自己,我们不想要太多“if (source is IList)“在我们的代码中进行测试。我们可以这样写:

public static class Enumerable
{
    public static int Count<T>(this IEnumerable<T> source)
    {
        dynamic d = source;
        return CountImpl(d);
    }

    private static int CountImpl<T>(ICollection<T> collection)
    {
        return collection.Count;
    }

    private static int CountImpl(ICollection collection)
    {
        return collection.Count;
    }

    private static int CountImpl<T>(string text)
    {
        return text.Length;
    }

    private static int CountImpl<T>(IEnumerable<T> source)
    {
        // Fallback
        int count = 0;
        foreach (T t in source)
        {
            count++;
        }
        return count;
    }
}

我并不是说这是一个好主意,但这就是它的工作原理:)

请注意,您需要小心,不要引入可能最终对某些类型进行不明确调用的情况。使用类作为参数这不会成为问题,但请考虑单个类可以实现多个接口。

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

.NET 4.0 中新的“动态”变量类型是否解决了 CLR 中的单/多方法分派问题? 的相关文章

  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 每个元素的 asp.net Web 表单自定义错误消息

    我创建了一个 Web 应用程序 表单 以及后端 SQL 插入和查询 目前我正在显示所有用户错误消息 div style padding 1em div
  • 如何使用Entity Framework Code First CTP 5存储图像?

    我只是想弄清楚是否有一种简单的方法可以使用 EF Code First CTP 5 存储和检索二进制 文件 数据 我真的很希望它使用 FILESTREAM 类型 但我真的只是在寻找某种方法让它工作 我总是创建另一个类 例如ProductIm
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • 重载算术运算符

    赋值运算符可以声明为 T 运算符 const t 在类中 但不能以这种方式定义算术运算符 它必须是友元函数 我不明白为什么 你能解释一下吗 算术运算符不必须是友元 那么你可以这样定义 MyClass MyClass operator con
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 如何在Windows窗体中打开进程

    我想在我的 Windows 窗体应用程序中打开进程 例如 我希望当用户按下 Windows 窗体容器之一中的按钮时 mstsc exe 将打开 如果他按下按钮 它将在另一个容器上打开 IE DllImport user32 dll SetL
  • MPI - 发送和接收列

    我需要从一个进程发送矩阵列并从另一个进程接收它 我尝试运行以下程序 但得到了一个奇怪的结果 至少我这么认为 仅复制矩阵的第一个元素 某些矩阵元素会发生意外变化 include
  • 在 clang 中向量化函数

    我正在尝试根据此用 clang 对以下函数进行矢量化铿锵参考 http llvm org docs Vectorizers html 它采用字节数组向量并根据以下条件应用掩码this RFC https www rfc editor org
  • C++网络序列化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将 C 数据包序列化为网络流的解决方案 我在这里看到很多帖子提到人们 ACE 谷歌协议缓
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • C++ 中的析构函数

    我的 AB h 文件中有一个构造函数 class AB private int i public AB i 0 constructor AB i 0 destructor virtual void methodA unsigned int
  • 稀疏矩阵超定线性方程组c/c++库

    我需要一个库来解决 Ax b 系统 其中 A 是一个非对称稀疏矩阵 每行有 8 个条目 而且可能很大 我认为实现双共轭梯度的库应该没问题 但我找不到一个有效的库 我尝试过 iml 但 iml sparselib 包中缺少一些标头 有小费吗
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • NHibernate:无状态会话错误消息无法获取代理

    我正在使用 nHibernate 无状态会话来获取对象 更新一个属性并将对象保存回数据库 我不断收到错误消息 无状态会话无法获取代理 我在其他地方有类似的代码 所以我不明白为什么这不起作用 有谁知道问题可能是什么 我正在尝试更新Screen

随机推荐

  • 如何识别 T-SQL 中每个不同成员的多个开始和结束日期范围中的第一个间隙

    我一直在进行以下工作 但没有取得任何成果 而且截止日期很快就到了 此外 还有超过一百万行 如下所示 感谢您对以下内容的帮助 目标 按成员对结果进行分组 并通过组合彼此重叠或连续运行且在范围的开始日和结束日之间没有间断的各个日期范围 为每个成
  • 应用程序关闭时的 iOS 任务

    我正在构建一个通过 ajax 将文件上传到服务器的应用程序 问题是用户有时很可能没有互联网连接 而客户端希望将 ajax 调用安排在用户恢复连接的时间 用户可能会在离线时安排文件上传并关闭应用程序 当应用程序关闭时 不在后台 是否可以进行a
  • 用简单的英语来说什么是“网络服务”?

    我一直在 SO 维基百科 谷歌等上阅读有关 网络服务 的内容 但我不太明白它们是什么 简单的英语定义 描述是什么 如果我使用 PHP 制作一个简单的网站 比如说 将一个随机整数打印到页面上 这是一个 Web 服务 吗 如果没有 为什么不呢
  • 如何将 FormWizard 包装在视图中?

    如何包装 Django表单向导 http docs djangoproject com en dev ref contrib formtools form wizard 在一个视图中 我需要这样做才能访问request 有人有这方面的示例代
  • 将不同等级的张量相乘

    我想将两个具有不同等级的张量相乘 例如 tensor A gt i x j x k x l tensor B gt l x m 得到另一个具有这个尺寸的张量 tensor C gt i x j x k x m i x j x k x l l
  • java:如何使用 apache poi 创建数据透视表?

    我正在尝试使用 apache poi 创建 Excel Pivot 但我不太明白如何创建我想要的格式 我使用此代码进行创建 但得到空值 XSSFPivotTable pivotTable sheet createPivotTable are
  • 如何使用 ant 删除 .svn 目录?

    我尝试了手册中的示例
  • 如何在 C++11 中正确检查 std::function 是否为空?

    我想知道如何正确检查是否std function是空的 考虑这个例子 class Test std function
  • 如何在 WPF 中使用鼠标在 ViewPort3D 中旋转相机?

    我能够直接在 XAML 中设置放置在 viewport3d 中的透视相机的位置和方向 但我想知道如何使用鼠标输入旋转相机 我更喜欢 C 语言 我实际上被困在如何使用鼠标输入旋转相机的问题上 请帮我 如果有人给我一个示例代码 那将会很有帮助
  • IOS游戏中心GKLocalPlayerListener

    我试图在基于回合的游戏中实现一个事件监听器 以便玩家可以在他的回合处于活动状态或被朋友邀请时接收到事件监听器 GKTurnBasedEventHandler 在 IOS 7 中已弃用 我在文档中读到我应该使用 GKLocalPlayerLi
  • 获取不在 ASP .NET 列表中的选定单选按钮

    我有许多属于一个组的单选按钮 我没有将它们列在列表中 因为它们都分散在页面上 如何轻松获取选定的单选按钮 也许不是最快的方法 但这样的方法应该有效 private RadioButton GetSelectedRadioButton str
  • 使用 Graph API Explorer 发布照片

    我的最终目标是以编程方式执行此操作 但作为健全性检查 我尝试使用 Facebook Graph API Explorer 将上传的照片 从我的计算机 发布到 Facebook 页面 我拥有访问令牌以及 photo upload 和publi
  • 当有 tsql 注释时 cfquery 崩溃

    这不会在 ColdFusion 11 中崩溃 但会在 ColdFusion 2016 中崩溃 SELECT FROM dbo Roles WITH NOLOCK WHERE Code IS NOT NULL AND Active 1 AND
  • 在为 ASP.NET 重写 C# 中的方法时,是否应该调用基类实现?

    我了解重写方法 函数会根据基类中的实现重新定义其在派生类中的实现 现在让我困惑的是 如果我重写 ASP NET 中的一个类 例如CreateChildControls 我没有特殊原因随机选择的 VS2008自动生成 protected ov
  • SPARQL 选择可选语言

    我有一些三元组 如下所示 test thing rdfs label Non Language Label test thing rdfs label English Label en test thing rdfs label Frenc
  • Google Play URL 搞乱了 Facebook 的分享对话框

    我正在尝试在 Facebook 上共享带有标题和描述的图像 但看起来当我将 Google PLay URL 设置为 ContentUrl 时 标题和描述不会显示 这是我的代码 if ShareDialog canShow ShareLink
  • 为什么 ASP.NET 为域和子域生成相同的 cookie 密钥?

    Bug 我有一个 ASP NET Web 应用程序 它偶尔会为 www mydomain com 和 www mydomain com 设置相同的 cookie 键 我试图找出 ASP NET 设置的默认 cookie 域 以及我如何意外地
  • jQuery 选择下一个 div

    所以代码看起来像这样 将鼠标悬停在当前 link1 上时如何更改 div1 ul li a class link1 a a class link2 div class div1 div div class div2 div a li li
  • apache poi 在word文档中添加表格

    我有 Java 代码来使用 Apache POI 创建表格和一些文本到 Word 文档 但它在最后一个文档中添加了表格 我想写一些文本 然后添加表格并再次写一些文本 目前它添加表第一个和最后一个文档添加 2 个文本 嗨和再见 我的代码 pu
  • .NET 4.0 中新的“动态”变量类型是否解决了 CLR 中的单/多方法分派问题?

    单次调度的问题对于使用 Java 和 C 等静态类型语言进行编码的人来说最为熟悉 基本思想是 而运行时多态性允许我们根据类型 运行时类型 分派到正确的方法调用receiver 例如 IAnimal mything new Cat mythi