C#(.NET)设计缺陷

C#或.NET Framework中一些最大的设计缺陷是什么?

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

我同意强调this post(对于那些poo-pooing缺乏ToString,有一个调试器属性为您的类提供自定义格式)。

除上述名单外,我亦会增加以下合理要求:

>非可空参考类型作为可空值类型的补充,
>允许重写结构体的空构造函数,
>允许通用类型约束指定密封类,
>我同意另一个海报这里请求任意构造函数签名时用作约束,即。其中T:new(string)或其中T:new(string,int),
>我也同意另一个海报这里关于修复事件,无论是对于空事件列表和并发设置(虽然后者是棘手),
>运算符应该定义为扩展方法,而不是作为类的静态方法(或者不仅仅是静态方法)
>允许接口的静态属性和方法(Java有这个,但C#没有),
>允许对象初始化器中的事件初始化(仅当前允许的字段和属性)
>为什么“对象初始化器”语法只能在创建对象时使用?为什么不让它在任何时候可用,即。 var e = new Foo(); e {Bar = baz};
>修正二次枚举行为,
>所有集合应该有不可变的快照用于迭代(即,变异集合不应该使迭代器无效),
>元组容易添加,但是一个有效的封闭代数类型像“Either”不是,所以我想要一些方法来声明一个封闭的代数类型并强制执行穷尽模式匹配(基本上一流的支持访问者模式,但效率更高);所以只需要枚举,扩展他们与详尽的模式匹配支持,并且不允许无效的情况下,
>我一般不喜欢模式匹配的支持,但至少对于对象类型测试;我也喜欢切换语法在另一篇文章中提出这里,
>我同意另一个帖子,System.IO类,如Stream,有些设计不当;任何需要一些实现来抛出NotSupportException的接口是一个糟糕的设计,
> IList应该比它简单得多;事实上,这对于许多具体的收集接口可能是真的,如ICollection,
>太多的方法抛出异常,例如IDictionary,
>我喜欢一种检查异常的形式比Java中可用的更好(参见关于类型和效果系统的研究如何做到这一点)
>修复通用方法重载分辨率中的各种恼人的角落情况;例如,尝试提供两个重载的扩展方法,一个对引用类型操作,另一个对可空结构类型,并看看你的类型推理喜欢,
>提供一种方法来安全地反映接口的字段和成员名称,例如INotifyPropertyChanged,它将字段名作为字符串;你可以通过使用一个扩展方法,用一个MemberExpression,即。 ()=> Foo,但是这不是很有效率,
>允许接口中的运算符,并使所有核心数字类型实现IArithm;其他有用的共享运算符接口也是可能的,
>使得更难以改变对象字段/属性,或至少允许注释不可变字段,并使类型检查器强制执行它(只是将其视为只有getter的属性fer chrissakes,它不难!事实上,以一种更明智的方式统一字段和属性,因为没有任何意义; C#3.0的自动属性是这个方向的第一步,但它们不够远,
>简化声明构造函数;我喜欢F#的方法,但在这里,需要简单的“新”而不是类名称的另一个帖子至少是更好,

这足够了我现在我想。这些都是我在过去一周遇到的刺激。如果我真的把我的想法,我可以继续几个小时。 C#4.0已经添加了命名,可选和默认参数,我强烈批准。

现在有一个不合理的要求:

>它会真的,真的很好,如果C#/ CLR可以支持类型构造函数多态性,即。泛型泛型,

很漂亮吗? 🙂

http://stackoverflow.com/questions/411906/c-sharp-net-design-flaws

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:C#(.NET)设计缺陷