C# (.NET) 设计缺陷

标签 c# .net

<分区>

C# 或 .NET Framework 中最大的设计缺陷有哪些?

示例:没有不可为 null 的字符串类型,您必须在从 IDataReader 获取值时检查 DBNull。

最佳答案

  • Reset() IEnumerator<T> 上的方法是一个错误(对于迭代器 block ,语言规范甚至要求这会引发异常)
  • 在 Eric 看来,返回数组的反射方法是 a mistake
  • 数组协方差过去是,现在仍然是一个奇怪的东西
    • 更新:带有 .NET 4.0 的 C# 4.0 添加了对通用接口(interface)(如 IEnumerable<out T>Func<in T, out TResult>,但不包括具体类型(如 List<T>))的协变/逆变支持。
  • ApplicationException而不是失宠 - 这是一个错误吗?
  • 同步集合 - 一个不错的想法,但在现实中不一定有用:您通常需要同步多个操作( Contains ,然后是 Add ),因此同步不同操作的集合是都那么有用
    • 更新:The System.Collections.Concurrent types , 与 TryAdd , GetOrAdd , TryRemove等已添加到 .NET Framework 4.0 中 - 虽然接受工厂委托(delegate)的方法不保证每个键只调用一次工厂。
  • 可以更多地利用 using/lock模式——也许允许他们共享一个可重用(可扩展?)的语法;你可以通过返回 IDisposable 来模拟这个并使用 using , 但它本来可以更清楚
  • 迭代器 block :没有简单的方法提前(而不是懒惰地)检查参数。当然,您可以编写两个链式方法,但这很难看
  • 更简单的不变性会更好; C# 4.0 帮助 a bit , 但还不够
  • 不支持“此引用类型参数不能为空”——尽管契约(在 4.0 中)对此有所帮助。但是像 Foo(SqlConnection! connection) 这样的语法(注入(inject)空检查/throw )会很好(对比 int? 等)
  • 缺乏对泛型运算符和非默认构造函数的支持; C# 4.0 使用 dynamic 稍微解决了这个问题,或者您可以启用它 like this
  • foreach 的 while 中声明的迭代器变量扩展,意味着匿名方法/lambdas 捕获单个变量,而不是每次迭代一个变量(线程/异步/等痛苦)

关于C# (.NET) 设计缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/411906/

相关文章:

c# - 调用异步订单

c# 在 for 循环中创建对象的新实例

c# - 如何返回松散类型的对象?

c# - 如何在 MVC 应用程序中处理长请求

.net - Windows 服务中定时器的使用

c# XML Treeview (Plumbing) 收藏

c# - 为什么通用结构不能不受管理?

c# - 如何将 IEnumerable<object> 转换为 IEnumerable<runtime type>

c# - 更新两个常用函数以使用共享函数的最佳方法

c# - 将此 .NET 字符串更改为 const 是否会提高性能? IL 会自动执行此操作吗?