?我正在从事一个小型教育项目,我们必须在其中实施一个n维矩阵。根据上下文,这个矩阵要么使用我们自己内置的ComplexNumber结构,要么使用System.Double,对于非常简单的示例,整数类型(主要是System.Int32)。由于应用程序的性质,我们不需要实现闪电般的快速性能。所以我的第一个想法是实现一个矩阵,其中T会以某种方式被限制为“数字”。一个明显的问题是,语言中没有办法用已定义的运算符来约束泛型类型T。另外,我看不到使T成为合理类型的简单方法。我的问题是:有人能给我指出一种优雅的方法来进行数学运算,使用泛型类型,而不会对性能造成太大影响,并以某种方式使其与内置类型一起使用(如果可能)。如果Eric读过这篇文章,这个特性(通过定义的运算符约束泛型类型)是否会出现在C#设计会议的假设未来版本中,是否接近于将其纳入语言?我知道实现ComplexMatrix类型并为每个矩阵“子类型”(双精度、整数等)创建包装器并支付在我们的复杂类型和矩阵元素之间转换的性能成本更简单更好。这个问题更多的是对某人如何实现类似场景的好奇。如果埃里克读到这篇文章,如果您想引起我的注意,请尝试我博客上的联系链接。或者把我的全名写在问题的正文中,这样我自己搜索就能找到我。此功能(通过定义的运算符约束泛型类型)是否会出现在C#设计会议的假设未来版本中,是否接近于将其用作一种语言?事实上,这是一个经常被请求的功能。自C#1.0以来,我们一直收到对此类事情的请求。该功能需要CLR团队的支持,而不仅仅是语言——这是我们希望集成到所有语言中的功能,这会增加成本。CLR团队已经表达了对这样一个特性的兴趣,但是他们也有很多他们可以做的竞争特性,并且实现它们的时间和精力有限。有许多方法可以实现此类功能。例如,我们可以在接口中添加指定静态方法的函数:interfaceIAddable{staticToperator+(Tx,Ty);}thenstaticTSum(IEnumerableseq)whereT:IAddable{Tsum=default(T);foreach(Titeminseq)sum=sum+item;返回总和;这个想法是接口意味着“实现这个接口的类型必须有给定的静态方法”。然后我们让int自动实现IAddable,等等。如何在运行时生成的通用代码的世界中有效地做到这一点是一个悬而未决的问题。我赶紧补充说,这只是一个想法的草图。有许多方法可以实现此功能。“接口中的静态”思想是比数学更广泛使用的思想,这对我们很有吸引力。如果我们要为这种功能付出巨大的代价,那么拥有一个非常通用、强大的功能而不是专注于数学的功能会很棒。另一方面,完美是善的敌人;与其寻求更昂贵的通用解决方案,不如只专注于数学问题。这是一场持续的辩论。它肯定出现在每个人的雷达屏幕上,但我预计不会很快出现。语言设计者正在努力完成异步CTP反馈。与往常一样,Eric对未宣布的未来产品的假设未来语言功能的想法仅供娱乐。实现这一点的唯一方法有点半优雅,如下所示:让调用者为所需的运算符指定委托并使用这些委托。例如:classMatrix{Func_add;函数_减法;//...publicMatrix(Funcadd,Funcsubtract,...){_add=add;_subtract=减去;//...}}varm=newMatrix((a,b)=>a+b,(a,b)=>ab,...);//假设ComplexNumber有两个静态方法Add和Subtractvarm=newMatrix(ComplexNumber.Add,ComplexNumber.Subtract,..);但是,我不知道这种方法的表现如何......这取决于你对什么是优雅的看法。如果您的优雅想法是能够编写a+b,其中a和b是泛型类型,这将是我的优雅想法,那么这是无法完成的。不幸的是,对于这种代码,C#泛型无法实现C++模板的优雅。具有良好性能(仍然丑陋)的解决方法是使用封装所需算术行为的结构。首先定义一个接口:publicinterfaceIArithmetic{TAdd(Tn1,Tn2);}然后使用struct实现接口:publicstructDoubleArithmetic:IArithmetic{publicdoubleAdd(doublen1,doublen2){returnn1+n2;最后,将结构作为泛型参数传递给您的类型:voidDoStuff(){算术.Add(1,2);我没有对它进行基准测试,但我怀疑它相当快,因为??泛型特定于传递给它的每个值类型。这就是为什么DoubleArithmetic是一个结构。以上是C#学习教程:有什么优雅的泛型使用方法吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
