Mar*_*ell 72
Reset()
对方法IEnumerator<T>
是错误的(对于迭代器块,语言规范,甚至要求,这将引发异常)IEnumerable<out T>
Func<in T, out TResult>
而是失宠了 - 这是一个错误吗?List<T>
然后ApplicationException
),因此同步不同操作的集合并不是那么有用Contains
/ Add
pattern - 也许允许它们共享可重用(可扩展?)语法; 你可以通过返回System.Collections.Concurrent
和使用来模拟这个TryAdd
,但它本来可以更清楚GetOrAdd
(注入空检查/ TryRemove
)会很好(与using
等对比)lock
,或者你可以像这样启用它IDisposable
,这意味着anon-methods/lambdas捕获单个变量,而不是每次迭代一次(使用线程/ async /等时很痛苦)Qui*_*ome 60
TextWriter是StreamWriter 的基类.跆拳道?
这总是让我感到困惑.
Sco*_*ein 44
一个小的C#pet peev - 构造函数使用C++/Java语法,使构造函数与类同名.
New()
或者ctor()
会更好.
当然,像coderush这样的工具使重命名类不再是一个问题,但从可读性POV来看,New()提供了很好的清晰度.
naa*_*ing 39
我强烈赞同这篇文章(对于那些缺乏ToString的人来说,有一个调试器属性可以为你的类提供自定义格式).
在上面的列表之上,我还会添加以下合理的请求:
现在我觉得这已足够了.这些都是我在过去一周遇到的烦恼.如果我真的想到它,我可能会继续几个小时.C#4.0已经添加了命名,可选和默认参数,我强烈赞同这些参数.
现在提出一个不合理的要求:
好吗?:-)
tui*_*oel 29
我不明白你做不到
其中T:新(U)
因此,您声明泛型类型T具有非默认构造函数.
编辑:
我想做这个:
public class A
{
public A(string text)
{
}
}
public class Gen<T> where T : new(string text)
{
}
Run Code Online (Sandbox Code Playgroud)
Jos*_*rke 20
编辑
5.我的另一个烦恼是System.Reflection.BindingFlags如何根据您使用的方法有不同的用途.在FindFields中,例如CreateInstance或SetField是什么意思?这是一个案例,他们已经超载了这个枚举背后的含义,这是令人困惑的.
Rob*_*ney 20
我真的很惊讶我是第一个提到这个的人:
ADO.NET类型数据集不会将可空列作为可空类型的属性公开.你应该能够这样写:
int? i = myRec.Field;
myRec.Field = null;
Run Code Online (Sandbox Code Playgroud)
相反,你必须写这个,这只是愚蠢的:
int? i = (int?)myRec.IsFieldNull() ? (int?)null : myRec.Field;
myRec.SetFieldNull();
Run Code Online (Sandbox Code Playgroud)
这在.NET 2.0中很烦人,而且你现在必须在漂亮的LINQ查询中使用如上所述的jiggery-pokery,这更令人讨厌.
令人讨厌的是,生成的Add<TableName>Row
方法对于可空类型的概念同样不敏感.由于生成的TableAdapter
方法不是这样,所以更是如此.
在.NET中没有太多让我觉得开发团队说"好吧,男孩们,我们足够接近 - 运送它!" 但确实如此.
Ben*_*ter 15
我不知道我会说这是一个设计缺陷,但如果你能用VB中的方式推断一个lambda表达式会非常好:
VB:
Dim a = Function(x) x * (x - 1)
Run Code Online (Sandbox Code Playgroud)
C#
如果能做到这一点会很好:
var a = x => x * (x - 1);
Run Code Online (Sandbox Code Playgroud)
而不是必须这样做:
Func<int, int> a = x => x * (x - 1);
Run Code Online (Sandbox Code Playgroud)
我意识到它不会长久,但在Code Golf中,每个角色都算死了!他们在设计这些编程语言时不要考虑到这一点吗?:)
dal*_*lle 13
Equals和GetHashCode - 并非所有类都具有可比性或可散列性,应移至界面.想到IEquatable或IComparable(或类似的).
ToString - 并非所有类都可以转换为字符串,应该移动到接口.想到了IFormattable(或类似的).
仿制药应该从一开始就在那里:
Chr*_*isW 11
有些人(ISV)希望您可以在构建时将其编译为机器代码并链接它,以便创建不需要dotNet运行时的本机可执行文件.
tui*_*oel 11
我不喜欢C#switch语句.
我想要这样的东西
switch (a) {
1 : do_something;
2 : do_something_else;
3,4 : do_something_different;
else : do_something_weird;
}
Run Code Online (Sandbox Code Playgroud)
所以没有更多的休息(容易忘记)以及逗号分隔不同值的可能性.
Dan*_*ull 10
我们对正确的 OO技术非常了解.解耦,合同编程,避免不正确的继承,适当使用异常,开放/封闭主体,Liskov可替代性等.还有,.Net框架没有采用最佳实践.
对我来说,.Net设计中最大的一个缺陷并不是站在巨人的肩膀上; 向使用其框架的大量程序员推广不太理想的编程范例.
如果MS关注这一点,那么软件工程世界在这十年中可以在质量,稳定性和可扩展性方面取得巨大飞跃,但唉,它似乎正在倒退.
有些类实现接口,但它们没有实现该接口的许多方法,例如,Array实现IList,但9个方法中有4个抛出NotSupportedException http://msdn.microsoft.com/en-us/library/system.array_members的.aspx
null
到处.
const
无处.
API是不一致的,例如,变量数组返回void
但附加到StringBuffer
返回相同的mutable StringBuffer
.
集合接口与不可变数据结构不兼容,例如Add
,System.Collections.Generic.IList<_>
无法返回结果.
没有结构类型,所以你写System.Windows.Media.Effects.SamplingMode.Bilinear
而不是只是Bilinear
.
IEnumerator
当类应该是不可变的时,由类实现的可变接口struct
.
平等和比较是一个烂摊子:你有System.IComparable
和Equals
,但是随后你也有System.IComparable<_>
,System.IEquatable
,System.Collections.IComparer
,System.Collections.IStructuralComparable
,System.Collections.IStructuralEquatable
,System.Collections.Generic.IComparer
和System.Collections.Generic.IEqualityComparer
.
元组应该是结构,但结构不必要地抑制尾部调用消除,因此最常见和最基本的数据类型之一将不必要地分配并破坏可扩展的并行性.
0兼职作为枚举
枚举的特点:http://blogs.msdn.com/abhinaba/archive/2007/01/09/more-peculiarites-of-enum.aspx
正如这个好例子所示:http: //plus.kaist.ac.kr/~shoh/postgresql/Npgsql/apidocs/Npgsql.NpgsqlParameterCollection.Add_overload_3.html
我的建议,好好利用"@"标志:
代替:
if((myVar&MyEnumName.ColorRed)!= 0)
用这个:
if((myVar&MyEnumName.ColorRed)!= @ 0)
要添加其他人已经提出的长点清单:
DateTime.Now == DateTime.Now
在大多数情况下,但不是所有情况.
String
这是不可变的有一堆构造和操作的选项,但StringBuilder
(这是可变的)没有.
Monitor.Enter
并且Monitor.Exit
应该是实例方法,所以不是新建一个特定的对象来锁定,你可以新建一个Monitor
并锁定它.
析构函数永远不应该被命名为析构函数.ECMA规范称它们为终结器,这对C++人群来说要少得多,但语言规范仍然将它们称为析构函数.
归档时间: |
|
查看次数: |
12094 次 |
最近记录: |