C# 4.0“dynamic”关键字是否会使泛型变得多余?

2023-11-21

我对 C# 中的动态功能感到非常兴奋(C#4 动态关键字 - 为什么不呢?),特别是因为在我的代码的某些库部分中,我使用了大量反射。

我的问题有两个:

1.“动态”是否取代了泛型,如下例所示?

泛型方法:

public static void Do_Something_If_Object_Not_Null<SomeType>(SomeType ObjToTest) {
        
        //test object is not null, regardless of its Type
        if (!EqualityComparer<SomeType>.Default.Equals(ObjToTest, default(SomeType))) {
            //do something
        }
    }

动态方法(??):

public static void Do_Something_If_Object_Not_Null(dynamic ObjToTest) {

        //test object is not null, regardless of its Type?? but how?
        if (ObjToTest != null) {
            //do something
        }
    }

2.“动态”现在是否允许方法返回匿名类型,如下例所示?:

 public static List<dynamic> ReturnAnonymousType() {
        return MyDataContext.SomeEntities.Entity.Select(e => e.Property1, e.Property2).ToList();
    }

酷,干杯

EDIT:

进一步思考我的问题,并根据答案,我发现我完全搞乱了主要的通用/动态问题。他们确实是完全不同的。所以是的,感谢您提供的所有信息。

那么第 2 点呢?


dynamic可能会简化有限数量的反射场景(您预先知道成员名称,但没有接口) - 特别是,它可能有助于通用运算符(尽管存在其他答案) - 但除了泛型运算符技巧之外,与泛型几乎没有交叉。

泛型允许您(在编译时)了解您正在使用的类型 - 相反,dynamiccare关于类型。 特别是 - 泛型允许您指定和证明许多条件about类型 - 即它可能实现某些接口,或者具有公共无参数构造函数。dynamic两者都没有帮助:它不支持接口,比简单地不关心接口更糟糕的是,这意味着我们甚至不能see显式接口实现dynamic.

此外,dynamic确实是一个特例object,所以拳击开始发挥作用,但具有复仇性。

事实上,你应该限制你的使用dynamic分几种情况:

  • COM互操作
  • DLR 互操作
  • maybe一些轻量级的鸭子打字
  • maybe一些通用运算符

对于所有其他情况,泛型和常规 C# 是最佳选择。

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

C# 4.0“dynamic”关键字是否会使泛型变得多余? 的相关文章

随机推荐

  • url重写后如何知道原来的url?

    我有 url 重写规则 将 www domain2 com 重定向到 domain1 com 根目录下的子文件夹 我们将此文件夹称为子项目 在我的控制器中 我需要构造一个指向原始未修改路径的 URL 但 Request Url 属性 如 A
  • 如何回滚特定迁移?

    我有迁移文件 db migrate 20100905201547 create blocks rb 我如何具体回滚该迁移文件 rake db rollback STEP 1 如果您要回滚的迁移是最后应用的迁移 这是一种执行此操作的方法 您可
  • 在不同端口上启动瘦服务器

    我是个新手哦 我有一个 ruby on Rails 应用程序 今天我可以通过命令正常启动应用程序 sudo thin start d 我们创建了一个新的测试数据库 一个是干净的数据库 另一个用于测试 因此可能会弄乱 在database ym
  • 使用seaborn clustermap提取层次聚类中的簇行

    我正在使用seaborn clustermap 中的分层聚类来对我的数据进行聚类 这可以很好地可视化热图中的集群 但是 现在我想提取分配给不同集群的所有行值 这是我的数据的样子 import pandas as pd load DataFr
  • 有没有比 fread() 更快的方法来读取大数据?

    嗨 首先我已经在堆栈和谷歌上搜索并找到了这样的帖子 快速读取非常大的表作为数据框 虽然这些很有帮助并且得到了很好的回答 但我正在寻找更多信息 我正在寻找读取 导入高达 50 60GB 的 大 数据的最佳方法 我目前正在使用fread 函数来
  • Qt如何更改特定QComboBox项目的突出显示颜色

    我正在尝试使 QComboBox 的突出显示透明 此 QComboBox 的颜色也会根据所选索引而变化 这是迄今为止我最好的解决方案 switch comboBox gt currentIndex case 0 comboBox gt se
  • 将两个内联块左右对齐在同一行上

    如何对齐两个内联块 使一个位于左侧 另一个位于同一行的右侧 为什么这么难 有没有像 LaTeX 的 hfill 这样的东西可以消耗它们之间的空间来实现这一点 我不想使用浮动因为使用内联块我可以排列基线 当窗口对于它们两个来说都太小时 使用内
  • 没有这样的文件来加载 Rails 3 的捆绑程序错误

    我有一个 Rails 3 应用程序可供部署 我还没有设置 VPS 主机 因为我计划在前几个月将所有内容都放在共享主机上 Problem cd myapp 捆绑检查 结果 The Gemfile s dependencies are sati
  • 将 HDD Serial # VB6 代码转换为 VB.NET 代码

    我从 VC 项目中获取了一段很酷的代码 它无需使用 WMI 即可获取硬盘驱动器的完整信息 因为 WMI 有其自身的问题 我请求那些熟悉 API 函数的人尝试将这个 VB6 代码转换为 VB NET 或 C 并帮助很多非常需要这个实用程序类的
  • 如何从 CLI 解释器准备语句?

    如何从 SQLite CLI 准备一条语句 我已经找到页面了编译 SQL 语句但它更适合 ODBC 接口 而不是 CLI 解释器 我希望得到类似于以下内容的东西 sqlite gt pq prepare SELECT FROM Users
  • 持久连接不适用于 codeIgniter 中的 mysql 驱动程序

    我的本地开发环境中有这个数据库配置 db default hostname localhost db default username Actual username is put inside these quotes db defaul
  • C++,概念不适用于无符号整数作为结果类型?

    我正在玩concepts我试图定义一个concept这需要任何non type parameter和函数isUnsignedInt检查参数是否为unsigned int 使用required关键字后跟concept 问题是 我可以传递一个负
  • 如何通过角度2中的函数触发输入类型=“文件”的事件点击?

    我在 Html 文件中有这段代码
  • “debug = require('debug')('api:server')”是什么意思

    我正在阅读一个项目的一些代码来学习 Node js 然后我发现了这一行 debug require debug api server 括在括号内 由于我是编程新手 当我不知道某件事时 我只是在网上搜索它 但我找不到这个问题的答案 如果您要告
  • 在Java中将int数组的内容复制到double数组?

    我正在尝试将 int 数组的内容复制到 double 类型的数组中 我必须先投射它们吗 我成功地将一个 int 类型的数组复制到另一个 int 类型的数组 但是现在我想编写从数组复制内容的代码A到数组Y 整数到双倍 这是我的代码 publi
  • HttpClient (C#) 在许多异步请求上失败?

    我正在使用 HttpClient 向外部 api 异步发出许多请求 我等待所有请求完成 然后在其他代码中使用响应 我的问题是 如果我发出太多请求 当我使用 Task WhenAll 等待时 我的代码会引发异常 该代码最终将并行运行 这意味着
  • 解析 SOAP 响应

    从我的控制器调用 Web 服务 client new SoapClient http webservice NAME OF PAGE asmx WSDL result client gt EstadoHabitacionesFechas 我
  • 我们如何根据unix中给定的日期获取工作日

    从给定日期开始 m d Y格式我们应该确定今天是星期几 示例 对于日期09 01 2017输出应该是Friday 很简单 只需使用日期命令本身和正确的选项即可 date j f m d Y 09 01 2017 A Friday
  • `char *array[size]` 和 `extern char **array` 的链接错误?

    首先 看这个例子 我为了举例而编造的 它不是一个真正的程序 不管怎样 h ifndef WHATEVER H define WHATEVER H void fill void endif main c include
  • C# 4.0“dynamic”关键字是否会使泛型变得多余?

    我对 C 中的动态功能感到非常兴奋 C 4 动态关键字 为什么不呢 特别是因为在我的代码的某些库部分中 我使用了大量反射 我的问题有两个 1 动态 是否取代了泛型 如下例所示 泛型方法 public static void Do Somet