最新评论

共5页: 1 2 3 4 5 下一页 
不若相忘于江湖 2011-07-09 13:21
in、not in 都可以索引查找, 不知道楼主有没有做过实验。 IN不能索引查找实在是一个很大的误区。
不若相忘于江湖 2011-07-09 13:12
<> 可以索引查找, 楼主在误导人。
TBag 2010-02-02 18:01
很期待的
Prime Li 2010-02-01 19:18
[quote]残香恨: "方法中的局部变量不是从堆而是从栈上分配" 余以为这句不严谨 局部变量的分配还是要看相应的类型吧? 如果是引用类型,对象还是在堆上分配,只是引用在栈上。[/quote] 是啊,楼主应该用词严谨一下,否则很容易误导群众的。建议要有出处。
xuerr 2010-02-01 15:00
不要使用空析构函数 如果用了空析构函数,GC在回收这个对象时,会调用Finalize,从而使对象重新被引用,该对象也会进会GC的下一代,延长了该对象在内存中的存时间, 析构函好像在2.0后改叫终结器了...
xuerr 2010-02-01 14:37
C#在编译时会将程序集中声明的所有字符串常量放到保留池中(intern pool),相同常量不会重复分配 以前不知道竟是这样的,
残香恨 2010-02-01 12:02
"方法中的局部变量不是从堆而是从栈上分配" 余以为这句不严谨 局部变量的分配还是要看相应的类型吧? 如果是引用类型,对象还是在堆上分配,只是引用在栈上。
军军 2010-02-01 11:05
@老达 谢谢!
JinweiLee 2010-02-01 10:54
string.format();
老达 2010-02-01 10:51
SET NOCOUNT ON; 可以减少网络传输数据量,不会影响到ExecuteNonQuery的或者受影响行数的获取,可以放心使用。
Jeffrey Zhao 2010-02-01 09:47
[quote]避免无意义的变量初始化动作[/quote] 我在想,这个虽然看上去多余,但对于性能应该也不会有影响吧。
编写人生 2010-01-24 21:07
补充一下,我的环境是:VS2010 .net 4.0 DEBUG,其他版本我没有测试。
编写人生 2010-01-24 21:05
我按照你的意思写了一个简单的函数: [code=csharp] public string Add(string a, string b,string c) { return a + b + c; } [/code] 最后我反编译程序,使用IL方式查看: [code=csharp] .method public hidebysig instance string Add(string a, string b, string c) cil managed { .maxstack 3 .locals init ( [0] string CS$1$0000) L_0000: nop L_0001: ldarg.1 L_0002: ldarg.2 L_0003: ldarg.3 L_0004: call string [mscorlib]System.String::Concat(string, string, string) L_0009: stloc.0 L_000a: br.s L_000c L_000c: ldloc.0 L_000d: ret } [/code] 注意L_0004位置,的确是调用了string.Concat方法,并没有常量一说
军军 2010-01-23 17:48
@Prime Li 首先非常感谢您的探讨,能一起探讨,我非常高兴。 1、使用String.Length==0的条件是知道string不为null的条件 我做过一个测试: a)、str=="" b)、str==string.Empty c)、string.IsNullOrEmpty(str) d)、str.Length == 0 效率是依次递增的 2、首先,您的建议非常好,但是我不知道String.CompareOrdinal()比Campare()快3-4倍您有没有做过测试。我有时间的话,测试一下,不是怀疑你,只是实践是检验真理的最好方法 3、我同意你的看法
朱才 2010-01-23 17:40
晕。。。楼上跟我说的差不多,我慢了 但对于楼上的第三点,显然跟楼主的意思不同。 事实上,用+的时候,如果+号两边都是常量,如: string str = "a"+"b"; 则编译后会是string str = "ab"; 如果+号其中一边不是常量,则会编译成string.Concat方法的调用,这个是楼主想表达的,如: string str = str1 + str2 + str3; // 假设3个都不是常量 编译后会是: string str = String.Concat(str1,str2,str3) 而若写成: string str = str1 + str2; string str += str3; 则会出现str1+str2产生的中间对象,是不必要的,这种写法不被推荐
朱才 2010-01-23 17:32
1. 可以认为string===System.String,(编译后都是System.String),没什么效率差别 2. 文中使用String.Compare的地方可以使用String.Equals 3. str.Length == 0没考虑null的情况,通常建议使用string.IsNullOrEmpty(str)
Prime Li 2010-01-23 17:22
@军军 规范那回复不是说给你听的,是反驳老吉的。 至于文章内容 1:我不清楚为何不用String.IsNullOrEmpty()方法,而要用String.Length==0? 2:Campare虽然高效,但其函数的意义和Equal还是有区别的。从你的这个方法来看,目的是判断是否相等,而不是判断2个字符串谁大谁小,因此用bool Equals(string value,StringComparison comparisonType)比较合适。如果你非讲究效率,在区分大小写的情况下,String.CompareOrdinal()比Campare()快3-4倍。 3:String str = str1 + str2 + str3 + str4; 分配一次,这个是有前提条件的。条件就是strxxx是静态值,也就是已经写好的字符串,比如 string str = "A"+ "B" + "C",这样编译时候str="ABC"。 而在下面语句中,由于str1,str2在编译时不确定,因此str的“=”操作可不是执行一次,而是三次。 [code=csharp] public string Output(string str1, string str2, string str3, string str4) { string str = str1 + str2 + str3 + str4; return str; } [/code] 所以我说那个算术表达式是有条件的。你的那句只在常量条件下适用。
木鱼 2010-01-23 14:56
[quote]Float: 这些优化的特性是否在vb.net中同样??还是只限C#? 比如你文中的使用StringBuilder做字符串连接、避免不必要的调用ToUpper或ToLower方法、最快的空串比较方法 这些是否在VB.NET中也同样尊循这种规则?[/quote] 针对.Net平台的语言都适用。 另外string和String其实都一样,只是规范中建议用别名而已,并没有不同。
军军 2010-01-23 14:17
StringBuilder 类是属于.NET Framework 类库中的的。所以也同样适用
Float 2010-01-23 13:59
这些优化的特性是否在vb.net中同样??还是只限C#? 比如你文中的使用StringBuilder做字符串连接、避免不必要的调用ToUpper或ToLower方法、最快的空串比较方法 这些是否在VB.NET中也同样尊循这种规则?
共5页: 1 2 3 4 5 下一页