C#高效编程话题集1

发表于:2012-6-18 09:57

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Luminji    来源:51Testing软件测试网采编

  近来在小组C#快速成长团队 讨论了若干话题,有些感觉不错,特总结与大家分享。

  当然,所谓话题,重点在于进行讨论,是否是最佳实践也属于大家的个人之见。以下观点若有差错,尽情蹂躏。

  1:String str1 = “str1”+ 9; 和String str2 = “str2”+ 9.ToString(); 哪个效率高

  可以知道“str1”+ 9,在运行时会完成一次装箱行为。9.ToString(),没有发生装箱行为,Int类型的ToString()方法的实际原型为:

public override String ToString() {
return Number.FormatInt32(m_value, null, NumberFormatInfo.CurrentInfo);
}

  可能有人会问,那是不是原型中的Number.FormatInt32方法会发生装箱行为呢?实际Number.FormatInt32方法是一个非托管的方法,原型如下:

[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
public static extern string FormatInt32(int value, string format, NumberFormatInfo info);

  它通过直接操作内存来进行int到string的转换,效率要比装箱高很多。

  所以,答案是:后者

  装箱为什么会带来性能损耗,因为它内部发生了太多事情:

  1)首先,为值类型在托管堆中分配内存。内存总量除了值类型本身所分配的内存外,还要加上类型对象指针和同步块索引;

  2)值类型的值复制到新分配的堆内存;

  3)返回已经成为引用类型的对象的地址;

  2:as,is转型比强制转型的优势

  优势在于as,is 不抛出异常,如果转型失败,则返回null

  强制转型则会抛出异常,导致代码必须处理异常,效率低。

  值得注意的是,as只能转型基本类型,对于基本类别如int等的转型,只能使用强制转型或is。

  3:readonly和const的区别或者说哪个更好

  1)const天然就是static的,所以不能用static修饰;readonly无此限制;

  2)const只能修饰基元类型;readonly无此限制;

  3)const是编译期常量;readonly为运行期常量,其初始值除了在初始化器还可以在类型的构造函数中设定;

  4)const经编译后,以实际值代替了变量(可查看IL验证),效率显然要高一些,可用到关键算法中,除此之外,与readonly比没有任何优势。

  4:初始化器和构造器的异同

  初始化器实际是语法糖,经编译后,它在构造函数的最开始执行。也就是说,初始化器可以理解为构造函数的一部分。

  5:枚举在使用中的注意事项

  1)如果不指定枚举的零值,会带来什么问题;

static Week week;

static void Main(string[] args)
{
Console.WriteLine(week);
}

  即使未给week赋值,也会打印出零值。

  2)如果为枚举中的元素指定了相同的值,又会带来什么问题。

  会导致相等型比较的时候出现与预期不符的结果

  3)建议不给枚举显式指定值,但是如果枚举用于位运算则要为其元素指定2的指数幂值。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号