总的来说,C#或.NET Framework中最大的设计缺陷是什么?

示例:没有不可为null的字符串类型,从IDataReader获取值时必须判断DBNull.

推荐答案

我非常同意this post(对于那些对ToString的缺乏感到不满的人,有一个调试器属性为你的类提供自定义格式).

在上面的 list 上,我还要补充以下合理要求:

  1. 作为可空值类型的补充,不可空引用类型,
  2. 允许重写 struct 的空构造函数,
  3. 允许泛型类型约束指定密封类,
  4. 我同意这里的另一个帖子,当用作约束时,要求任意构造函数签名,即.在哪里是T : new(string),还是在哪里T : new(string, int)
  5. 我也同意这里的另一个帖子,关于修复事件,无论是空事件列表还是并发设置(尽管后者很棘手),
  6. 运算符应该定义为扩展方法,而不是类的静态方法(或者至少不只是静态方法),
  7. 允许接口使用静态属性和方法(Java有,但C#没有),
  8. 允许在对象初始值设定项中进行事件初始化(当前仅允许字段和属性),
  9. 为什么"对象初始值设定项"语法仅在创建对象时可用?为什么不随时提供呢
  10. fix quadratic enumerable behaviour
  11. 所有集合都应该具有用于迭代的不可变快照(即,改变集合不应使迭代器无效),
  12. 元组很容易添加,但是像"Either<T>"这样有效的闭合代数类型就不容易添加,所以我想用某种方式声明一个闭合代数类型并在其上强制进行穷举模式匹配(基本上对访问者模式的支持是一流的,但效率要高得多);所以只需获取枚举,用穷举模式匹配支持来扩展它们,并且不允许无效的 case ,
  13. 我希望总体上支持模式匹配,但至少支持对象类型测试;我还有点喜欢这里另一篇文章中提出的切换语法,
  14. 我同意另一个帖子的观点,即System.IO个类,比如Stream,设计得有些糟糕;任何需要一些实现抛出NotSupportedException的接口都是糟糕的设计,
  15. IList应该比现在简单得多;事实上,这可能适用于许多具体的集合接口,比如ICollection
  16. 太多方法抛出异常,比如IDictionary,
  17. 我更喜欢判断异常的形式,而不是Java中可用的形式(有关如何实现这一点,请参阅类型和效果系统的研究),
  18. 修复泛型方法重载解析中各种令人讨厌的死角情况;例如,try 提供两个重载扩展方法,一个在引用类型上操作,另一个在可空的 struct 类型上操作,看看您的类型推理会如何,
  19. 提供一种安全地反映接口(如INotifyPropertyChanged)的字段名和成员名的方法,这些接口将字段名作为字符串;您可以通过使用接受带有MemberExpression的lambda的扩展方法来实现这一点,即.() => Foo,但是效率不是很高,
    • 更新:C#6.0为单个成员名称添加了nameof()运算符,但它在泛型中不起作用(nameof(T) == "T"而不是实际类型参数的名称:您仍然需要做typeof(T).Name)-它也不允许您获取"path"字符串,例如nameof(this.ComplexProperty.Value) == "Value"限制其可能的应用程序.
  20. 允许接口中的运算符,并使所有核心号码类型实现IArithmetic;其他有用的共享运算符接口也是可能的.
  21. 使更改对象字段/属性变得更加困难,或者至少允许注释不可变字段并使类型判断器强制执行它(看在god 的份上,只是将其视为仅限getter的属性,这并不难!);事实上,以一种更合理的方式统一字段和属性,因为同时拥有两者没有意义;C#3.0的自动属性是朝这个方向迈出的第一步,但它们还不够深入.
    • 更新:虽然C#有readonly关键字,而C#6.0添加了只读自动属性,但它没有对不可变类型和值的真正语言支持那么严格.
  22. 简化构造函数的声明;我喜欢F#的方法,但这里的另一个帖子至少需要"new"而不是类名更好,

我想现在就够了.这些都是我过go 一周遇到的烦心事.如果我真的用心go 做,我可能会讲上几个小时.C#4.0已经添加了命名参数、可选参数和默认参数,我对此非常赞同.

现在针对一个不合理的要求:

  1. 如果C#/CLR能支持类型构造函数多态性,那就太好了.仿制药胜过仿制药,

漂亮吗?:-)

.net相关问答推荐

安装特定主要版本的DotNet SDK最新版本

C#/.NET + VisualStudio,命名空间问题

查找 2 个已知值之间的字符串

单线程单元 - 无法实例化 ActiveX 控件

在 .NET 中获取执行 exe 路径的最佳方法是什么?

string.Format 如何处理空值?

如何在 WPF 应用程序中使用 App.config 文件?

.Net 中的 Decimal.One、Decimal.Zero、Decimal.MinusOne 的用途是什么

.net:System.Web.Mail 与 System.Net.Mail

使用只读属性或方法?

HashSet 是否保留插入顺序?

无法在 Windows 10 上安装 Windows SDK 7.1

在 .NET Core RC2 中构建 .exe 文件

如何保护我的 .NET 程序集免受反编译?

ToLowerInvariant() 有什么问题?

从 C# 中的字符串中删除最后一个字符.优雅的方式?

如何将整个字符串与正则表达式匹配?

为什么甚至可以更改私有成员,或使用反射在 C# 中运行私有方法?

IEnumerable vs IReadonlyCollection vs ReadonlyCollection 用于公开列表成员

.NET 桌面应用程序中的 Settings.settings 与 app.config