C++ 模板和 C# 泛型之间的区别【示例语法说明】

本文探讨了C++模板与C#泛型之间的关键差异,包括语法特性和实现细节。通过示例展示了两种语言如何处理泛型/模板,并强调了C#泛型在运行时的行为以及C++模板更为灵活的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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

  • 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#泛型方法示例

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace GenericTemplateDemo
    {
        class CompareUtil
        {
            /// <summary>
            /// 比较两个数的大小
            /// </summary>
            /// <typeparam name="T">一种类型,实现IComparable接口</typeparam>
            /// <param name="first">第一个数</param>
            /// <param name="second">第二个数</param>
            public static void CompareValue<T>(T first, T second) where T : IComparable
            {
                if (first == null && second == null)
                {
                    Console.WriteLine($"【{first}】与【{second}】相等,都为null");
                }
                else if (first == null || second == null)
                {
                    Console.WriteLine($"存在【{first}】,【{second}】某一个为null,比较无意义");
                }
                else if (first.CompareTo(second) > 0)
                {
                    Console.WriteLine($"【{first}】大于【{second}】");
                }
                else if (first.CompareTo(second) == 0)
                {
                    Console.WriteLine($"【{first}】与【{second}】相等");
                }
                else
                {
                    Console.WriteLine($"【{first}】小于【{second}】");
                }
            }
        }
    }
    

    调用示例

  • class Program
        {
            static void Main(string[] args)
            {
                CompareUtil.CompareValue(8.8, 20);
                CompareUtil.CompareValue("ABCD月清疏", "ABCD白沫晴");
                Console.ReadLine();
            }        
        }

    运行截图

     

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

  •         template<typename T>
            void exchange(T& left, T& right)
            {
                T temp = left;
                left = right;
                right = temp;
            }

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯内科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值