3 回答
TA贡献1859条经验 获得超6个赞
我知道这是一个老话题,但是在c#7中,您可以执行以下操作:
switch(shape)
{
case Circle c:
WriteLine($"circle with radius {c.Radius}");
break;
case Rectangle s when (s.Length == s.Height):
WriteLine($"{s.Length} x {s.Height} square");
break;
case Rectangle r:
WriteLine($"{r.Length} x {r.Height} rectangle");
break;
default:
WriteLine("<unknown shape>");
break;
case null:
throw new ArgumentNullException(nameof(shape));
}
TA贡献1797条经验 获得超6个赞
尝试在C#中完成此类“功能性”事情(甚至尝试编写一本书)之后,我得出的结论是,除了少数例外,此类事情没有太大帮助。
主要原因是诸如F#之类的语言通过真正支持这些功能而获得了强大的功能。不是“您可以做到”,而是“这很简单,很明显,很期待”。
例如,在模式匹配中,编译器会告诉您是否存在不完整的匹配,或者何时永远不会再匹配其他匹配。这对于开放式类型不太有用,但是当与已区分的联合或元组匹配时,它非常漂亮。在F#中,您希望人们进行模式匹配,并且这立即有意义。
“问题”是,一旦您开始使用某些功能概念,就自然会继续。但是,在C#中利用元组,函数,部分方法应用程序和currying,模式匹配,嵌套函数,泛型,monad支持等变得非常丑陋,非常迅速。这很有趣,并且一些非常聪明的人在C#中做了一些很酷的事情,但是实际上使用它感觉很沉重。
我最终在C#中经常使用的内容(跨项目):
序列函数,通过IEnumerable的扩展方法。诸如ForEach或Process之类的东西(“ Apply”?–对序列项进行操作,就像枚举一样)适合,因为C#语法很好地支持了它。
抽象常见的语句模式。复杂的try / catch / finally块或其他涉及的(通常是非常通用的)代码块。扩展LINQ-to-SQL也适用于此。
元组,在某种程度上。
**但请注意:缺乏自动归纳和类型推断确实阻碍了甚至使用这些功能。**
正如其他人所提到的,所有这些都是在一个小型团队中,出于特定目的,是的,如果您坚持使用C#,也许他们可以提供帮助。但是以我的经验,他们通常感到比他们值得的麻烦更多-YMMV。
- 3 回答
- 0 关注
- 314 浏览
添加回答
举报