码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++ 模板和 C# 泛型之间的区别【示例语法说明】


    C++ 模板和 C# 泛型之间的区别(C# 编程指南)

    C# 泛型和 C++ 模板均是支持参数化类型的语言功能。

    但是,两者之间存在很多不同。 在语法层次,C# 泛型是参数化类型的一个更简单的方法,而不具有 C++ 模板的复杂性。 此外,C# 不试图提供 C++ 模板所具有的所有功能。 在实现层次,主要区别在于 C# 泛型类型的替换在运行时执行,从而为实例化对象保留了泛型类型信息。 有关详细信息,请参阅运行时中的泛型。

    以下是 C# 泛型和 C++ 模板之间的主要差异:

    • C# 泛型的灵活性与 C++ 模板不同。 例如,虽然可以调用 C# 泛型类中的用户定义的运算符,但是无法调用算术运算符。

    • C# 不允许使用非类型模板参数,如 template C {}。

    • C# 不支持显式定制化;即特定类型模板的自定义实现。

    • C# 不支持部分定制化:部分类型参数的自定义实现。

    • C# 不允许将类型参数用作泛型类型的基类。

    • C# 不允许类型参数具有默认类型。

    • 在 C# 中,泛型类型参数本身不能是泛型,但是构造类型可以用作泛型。 C++ 允许使用模板参数。

    • C++ 允许在模板中使用可能并非对所有类型参数有效的代码,随后针对用作类型参数的特定类型检查此代码。 C# 要求类中编写的代码可处理满足约束的任何类型。 例如,在 C++ 中可以编写一个函数,此函数对类型参数的对象使用算术运算符 + 和 -,在实例化具有不支持这些运算符的类型的模板时,此函数将产生错误。 C# 不允许此操作;唯一允许的语言构造是可以从约束中推断出来的构造。 

    • 参考微软官方文档

    • C++ 模板与 C# 泛型的区别 - C# 编程指南 | Microsoft Docs了解 C++ 模板和 C# 泛型之间的区别。 这两者都是支持参数化类型的语言功能。https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/generics/differences-between-cpp-templates-and-csharp-generics下面具体以C++和C#代码为例

    • C#泛型方法示例

      1. using System;
      2. using System.Collections.Generic;
      3. using System.Linq;
      4. using System.Text;
      5. using System.Threading.Tasks;
      6. namespace GenericTemplateDemo
      7. {
      8. class CompareUtil
      9. {
      10. ///
      11. /// 比较两个数的大小
      12. ///
      13. /// 一种类型,实现IComparable接口
      14. /// 第一个数
      15. /// 第二个数
      16. public static void CompareValue<T>(T first, T second) where T : IComparable
      17. {
      18. if (first == null && second == null)
      19. {
      20. Console.WriteLine($"【{first}】与【{second}】相等,都为null");
      21. }
      22. else if (first == null || second == null)
      23. {
      24. Console.WriteLine($"存在【{first}】,【{second}】某一个为null,比较无意义");
      25. }
      26. else if (first.CompareTo(second) > 0)
      27. {
      28. Console.WriteLine($"【{first}】大于【{second}】");
      29. }
      30. else if (first.CompareTo(second) == 0)
      31. {
      32. Console.WriteLine($"【{first}】与【{second}】相等");
      33. }
      34. else
      35. {
      36. Console.WriteLine($"【{first}】小于【{second}】");
      37. }
      38. }
      39. }
      40. }

      调用示例

      1. class Program
      2. {
      3. static void Main(string[] args)
      4. {
      5. CompareUtil.CompareValue(8.8, 20);
      6. CompareUtil.CompareValue("ABCD月清疏", "ABCD白沫晴");
      7. Console.ReadLine();
      8. }
      9. }

      运行截图

       

    • C++模板代码 【交换两个引用类型的值】

      1. template<typename T>
      2. void exchange(T& left, T& right)
      3. {
      4. T temp = left;
      5. left = right;
      6. right = temp;
      7. }

      我们发现 template关键字只出现在C++中,用于标记模板,template在C#中不是关键字。

    • C#中<>可以嵌套,比如List>,两个连续符号">>"中间可以有空格,也可以没有空格。C+模板不能出现 两个连续符号">>",中间至少一个空格符

  • 相关阅读:
    畜牧养殖业安全用电解决方案
    Python学习之九九乘法表
    如何完美解决Sqoop导入导出MySQL数据错位问题
    俄罗斯方块
    什么是扩散模型(Diffusion Models),为什么它们是图像生成的一大进步?
    LeetCode 面试题 10.09. 排序矩阵查找
    debian/ubuntu/windows配置wiregurad内网服务器(包含掉线自启动)
    Java设计模式之亨元模式(Flyweight Pattern)
    Windows下搭建Tomcat HTTP服务,发布外网远程访问
    大型语言模型(LLM, Large Language Models)基模和 Chat 模型之间的区别
  • 原文地址:https://blog.csdn.net/ylq1045/article/details/125227550
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号