给 c# 程序员的十个重要提示
本文讲述我认为对c#程序员最重要的10个提示,每个提示都会有一段对应的代码,对新手来说也很容易掌握。
1:为非公开的方法编写测试
你尝试过为组件的非公开方法写测试么?很多开发者都没有写过,因为这些方法对测试项目来说是不可见的。c#可以通过在AssemblyInfo.cs中添加下面的标记(InternalsVisibleToAttribute),让内部成员对其它组件可见。
//Maketheinternalsvisibletothetestassembly [assembly:InternalsVisibleTo("MyTestAssembly")]
2:使用Tuples类型
曾经见到过有人仅仅因为函数要返回多个值而创建了一个POCO类,其实.Net4.0中的Tuples类型会更加适用,例如:
publicTupleGetEmployee(){ intemployeeId=1001; stringfirstName="Rudy"; stringlastName="Koertson"; //Createatupleandreturn returnTuple.Create(employeeId,firstName,lastName); }
3:用yield替代临时集合
从集合中选出部分成员时,通常会创建一个临时集合/列表来保存成员并返回,例如下面的代码:
publicListGetValuesGreaterThan100(List masterCollection){ List tempResult=newList (); foreach(varvalueinmasterCollection){ if(value>100){ tempResult.Add(value); } } returntempResult; }
要避免这样的临时集合,可以使用yield关键字,示例如下:
publicIEnumerableGetValuesGreaterThan100(List masterCollection){ foreach(varvalueinmasterCollection){ if(value>100){ yieldreturnvalue; } } }
当然,也可是使用LINQ来解决上面的问题。
4:告诉别人你将替换一个方法
当你有一个组件时,并且你打算替换其中的一个方法时,可以先为方法添加过时标记以通知客户端,示例代码如下:
[Obsolete("Thismethodwillbedeprecatedsoon.YoucoulduseXYZalternatively.")] publicvoidMyComponentLegacyMethod(){ //Hereistheimplementation }
使用这个方法客户端在编译时会发出一个警告,如果你不再允许客户端使用过时的方法时,可以为过时标记添加一个额外的布尔参数,在下面的例子中,客户但程序将编译失败:
[Obsolete("Thismethodisdeprecated.YoucoulduseXYZalternatively.",true)] publicvoidMyComponentLegacyMethod(){ //Hereistheimplementation }
5:牢记LINQ查询是延迟执行的
在.NET中编写LINQ查询时,只有当你访问LINQ查询的结果时,LINQ查询才会被执行,LINQ的这种特征被称为延迟执行,不过值得注意的是每访问一次结果,LINQ查询都会被执行一次。
为了避免重复LINQ查询的重复执行,可以先将查询转换成列表,如下所示:
publicvoidMyComponentLegacyMethod(ListmasterCollection){ //在下面示例中,如果没有调用ToList,LINQ查询将会被执行两次 varresult=masterCollection.Where(i=>i>100).ToList(); Console.WriteLine(result.Count()); Console.WriteLine(result.Average()); }
6:使用explicit关键字转换业务实体类型
使用explicit关键字来定义业务实体类型之间的转换,当代码中出现类型转换请求时,转换方法会自动执行,下面是示例代码:
classProgram{ staticvoidMain(string[]args){ varentity=newExternalEntity{ Id=1001, FirstName="Dave", LastName="Johnson" }; varconvertedEntity=(MyEntity)entity; } } classMyEntity{ publicintId{get;set;} publicstringFullName{get;set;} publicstaticexplicitoperatorMyEntity(ExternalEntityexternalEntity){ returnnewMyEntity{ Id=externalEntity.Id, FullName=externalEntity.FirstName+""+externalEntity.LastName }; } } classExternalEntity{ publicintId{get;set;} publicstringFirstName{get;set;} publicstringLastName{get;set;} }
7:保持异常的原始堆栈跟踪
在c#代码中,如果你像下面的代码一样在catch代码块中抛出ConnectDatabase方法中出现的异常,异常的堆栈就会只显示到RunDataOperation方法,这样就会丢失异常原始的堆栈跟踪信息导致不能找到确切的错误源头。
publicvoidRunDataOperation(){ try{ Intialize(); ConnectDatabase(); Execute(); } catch(Exceptionexception){ throwexception; } }
保持原始堆栈跟踪的代码如下:
publicvoidRunDataOperation(){ try{ Intialize(); ConnectDatabase(); Execute(); } catch(Exception){ throw; } }
8:使用Flags标记将枚举作为位域处理
在c#中为枚举类型添加Flags标记可以将枚举作为位域(即一组标志)处理,这样可以对枚举值进行自由组合,示例代码如下:
classProgram{ staticvoidMain(string[]args){ intsnakes=14; Console.WriteLine((Reptile)snakes); } } [Flags] enumReptile{ BlackMamba=2, CottonMouth=4, Wiper=8, Crocodile=16, Aligator=32 }
上面代码的输出为“BlackMamba,CottonMouth,Wiper”,如果没有Flags标记,则上面的输出为14。
9:为泛型添加类型约束
创建泛型类型时,需要指定提供的泛型类型必须实现指定的参数或者继承自特定的基类时,可以这样做:
classMyGenricClasswhereT:IMyInterface{ //Bodyoftheclasscomeinhere }
当然,也可以在方法级别这样做:
classMyGenricClass{ publicvoidMyGenericMethod(Tt)whereT:IMyInterface{ //Genericimplementationgoesinhere } }
10:IEnumerable类型不能确保只读
在你创建的类型中,暴露了一个类型为IEnumerable的只读属性,但是调用者依然可以通过类型转换来修改属性的内容,比如这样:
classProgram{ staticvoidMain(string[]args){ MyClassmyClass=newMyClass(); ((List)myClass.ReadOnlyNameCollection).Add("######FromClient#####"); myClass.Print(); } } classMyClass{ List _nameCollection=newList (); publicMyClass(){ _nameCollection.Add("Rob"); _nameCollection.Add("John"); _nameCollection.Add("Jummy"); _nameCollection.Add("Derek"); } publicIEnumerable ReadOnlyNameCollection{ get{return_nameCollection.AsEnumerable();} } publicvoidPrint(){ foreach(variteminReadOnlyNameCollection){ Console.WriteLine(item); } } }
上面的代码修改了列表,添加了一个新项目,要避免这种情况,应使用AsReadOnly而不是AsEnumerable:
publicIEnumerableReadOnlyNameCollection{ get{return_nameCollection.AsReadOnly();} }
以上就是给c#程序员的十个重要提示的详细内容,更多关于c#程序员的十个重要提示的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。