2019独角兽企业重金招聘Python工程师标准>>>

本文讲述我认为对 c# 程序员最重要的 10 个提示, 每个提示都会有一段对应的代码, 对 新手来说也很容易掌握。

1: 为非公开的方法编写测试

你尝试过为组件的非公开方法写测试么? 很多开发者都没有写过, 因为这些方法对测试项 目来说是不可见的。 c# 可以通过在AssemblyInfo.cs中添加下面的标记 (InternalsVisibleToAttribute) , 让内部成员对其它组件可见。

//Make the internals visible to the test assembly [assembly: InternalsVisibleTo("MyTestAssembly")]

2: 使用 Tuples 类型

曾经见到过有人仅仅因为函数要返回多个值而创建了一个 POCO 类, 其实 .Net 4.0 中的Tuples类型会更加适用, 例如:

public Tuple<int, string, string> GetEmployee() { int employeeId = 1001; string firstName = "Rudy"; string lastName = "Koertson"; //Create a tuple and return return Tuple.Create(employeeId, firstName, lastName);
}

3: 用 yield 替代临时集合

从集合中选出部分成员时, 通常会创建一个临时集合/列表来保存成员并返回, 例如下面 的代码:

public List<int> GetValuesGreaterThan100(List<int> masterCollection) {List<int> tempResult = new List<int>(); foreach (var value in masterCollection) { if (value > 100) {tempResult.Add(value);}} return tempResult;
}

要避免这样的临时集合, 可以使用yield关键字, 示例如下:

public IEnumerable<int> GetValuesGreaterThan100(List<int> masterCollection) { foreach (var value in masterCollection) { if (value > 100) { yield return value;}}
}

当然, 也可是使用 LINQ 来解决上面的问题。

4: 告诉别人你将替换一个方法

当你有一个组件时, 并且你打算替换其中的一个方法时, 可以先为方法添加过时标记以通 知客户端, 示例代码如下:

[Obsolete("This method will be deprecated soon. You could use XYZ alternatively.")] public void MyComponentLegacyMethod() { //Here is the implementation }

使用这个方法客户端在编译时会发出一个警告, 如果你不再允许客户端使用过时的方法时, 可以为过时标记添加一个额外的布尔参数, 在下面的例子中, 客户但程序将编译失败:

[Obsolete("This method is deprecated. You could use XYZ alternatively.", true)] public void MyComponentLegacyMethod() { //Here is the implementation }

5: 牢记 LINQ 查询是延迟执行的

在 .NET 中编写 LINQ 查询时, 只有当你访问 LINQ 查询的结果时, LINQ 查询才会被执 行, LINQ 的这种特征被称为延迟执行, 不过值得注意的是每访问一次结果, LINQ 查询 都会被执行一次。

为了避免重复 LINQ 查询的重复执行, 可以先将查询转换成列表, 如下所示:

public void MyComponentLegacyMethod(List<int> masterCollection) { // 在下面示例中, 如果没有调用 ToList , LINQ 查询将会被执行两次 var result = masterCollection.Where(i => i > 100).ToList();Console.WriteLine(result.Count());Console.WriteLine(result.Average());
}

6: 使用 explicit 关键字转换业务实体类型

使用explicit关键字来定义业务实体类型之间的转换, 当代码中出现类型转换请求时, 转换方法会自动执行, 下面是示例代码:

class Program { static void Main(string[] args) { var entity = new ExternalEntity {Id = 1001,FirstName = "Dave",LastName = "Johnson" }; var convertedEntity = (MyEntity)entity;}
} class MyEntity { public int Id { get; set; } public string FullName { get; set; } public static explicit operator MyEntity(ExternalEntity externalEntity) { return new MyEntity {Id = externalEntity.Id,FullName = externalEntity.FirstName + " " + externalEntity.LastName};}
} class ExternalEntity { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; }
}

7: 保持异常的原始堆栈跟踪

在 c# 代码中, 如果你像下面的代码一样在catch代码块中抛出ConnectDatabase方法中出现的异常, 异常的堆栈就会只显示到RunDataOperation方法, 这样就会丢失 异常原始的堆栈跟踪信息导致不能找到确切的错误源头。

public void RunDataOperation() { try {Intialize();ConnectDatabase();Execute();} catch (Exception exception) { throw exception;}
}

保持原始堆栈跟踪的代码如下:

public void RunDataOperation() { try {Intialize();ConnectDatabase();Execute();} catch (Exception) { throw;}
}

8: 使用 Flags 标记将枚举作为位域处理

在 c# 中为枚举类型添加Flags标记可以将枚举作为位域(即一组标志)处理, 这样可 以对枚举值进行自由组合, 示例代码如下:

class Program { static void Main(string[] args) { int snakes = 14;Console.WriteLine((Reptile)snakes);}
}[Flags] enum Reptile {BlackMamba = 2,CottonMouth = 4,Wiper = 8,Crocodile = 16,Aligator = 32 }

上面代码的输出为 “BlackMamba, CottonMouth, Wiper” , 如果没有 Flags 标记, 则上 面的输出为 14 。

9: 为泛型添加类型约束

创建泛型类型时, 需要指定提供的泛型类型必须实现指定的参数或者继承自特定的基类时, 可以这样做:

class MyGenricClass<T> where T : IMyInterface { //Body of the class come in here }

当然, 也可以在方法级别这样做:

class MyGenricClass { public void MyGenericMethod<T>(T t) where T : IMyInterface { //Generic implementation goes in here }}

10: IEnumerable 类型不能确保只读

在你创建的类型中, 暴露了一个类型为IEnumerable的只读属性, 但是调用者依然可 以通过类型转换来修改属性的内容, 比如这样:

class Program { static void Main(string[] args) {MyClass myClass = new MyClass();((List<string>)myClass.ReadOnlyNameCollection).Add("######From Client#####");myClass.Print();}
} class MyClass {List<string> _nameCollection = new List<string>(); public MyClass() {_nameCollection.Add("Rob");_nameCollection.Add("John");_nameCollection.Add("Jummy");_nameCollection.Add("Derek");} public IEnumerable<string> ReadOnlyNameCollection { get { return _nameCollection.AsEnumerable(); }} public void Print() { foreach (var item in ReadOnlyNameCollection) {Console.WriteLine(item);}}
}

上面的代码修改了列表, 添加了一个新项目, 要避免这种情况, 应使用AsReadOnly而不是AsEnumerable:

public IEnumerable<string> ReadOnlyNameCollection { get { return _nameCollection.AsReadOnly(); }
}

希望这些提示对你有用!

原文地址: Top 10 Tips for C# Programmers

转载于:https://my.oschina.net/lichaoqiang/blog/605942

给 c# 程序员的十个重要提示相关推荐

  1. 成为明星程序员的10个提示

    原文地址是:点击打开链接 Andrew C. Oliver是Open Software Integrators公司的总裁与创始人,公司主要与一些开源公司合作,特别是那些初创公司,致力于为客户提供课程开 ...

  2. 凡人修真传-程序员的十个等级

    今天星期五, 研发室内百无聊赖, 坐我对面的一位密码学算法工程师(绝对的大神)给我丢过来一份文档,  看了开头还觉得挺好玩, 越往后看越纠结, 看完后顿时内牛满面汗如雨下,  这酸爽犹如大学期间历时8 ...

  3. 未来,有关程序员的十个预言

    未来,有关程序员的十个预言 -- 由 吧主 分享 推荐文章: 如果你喜欢上了一个程序员小伙,献给所有的程序员女友 作为程序员,我们总是身处于如万花筒般变化无常的技术世界里.我们可能也是那群能够最早感知 ...

  4. 程序员的十个层次你属于哪一层?(知己知彼)

    菜鸟,大牛这些头衔似乎适用于每个程序员,今天我们列举程序员的十个层次,看您究竟属于哪一级? 自西方文艺复兴以来,中国在自然科学方面落后西方很多,软件领域也不例外.当然现在中国的许多程序员们对此可能有许 ...

  5. IT行业培训必读:优秀程序员的十个习惯

    在这个世界上,有数百万的人热衷于软件开发,他们有很多名字,如:软件工程师(Software Engineer),程序员(Programmer),编码人(Coder),开发人员(Developer). ...

  6. 优秀程序员的十个习惯

    在这个世界上,有数百万的人热衷于软件开发,他们有很多名字,如:软件工程师(Software Engineer),程序员(Programmer),编码人(Coder),开发人员(Developer).经 ...

  7. Java程序员花十个月做私活,收入50w+,网友:老哥建个群搭个伙呗

    私活,是很多程序员增加收入的有效途径,通过承接项目,通过自己的程序能力转化为收入.在互联网匿名社区,一些同行开始交流起私活收入. 如果有想学习java的同学,可来我们的java技术学习QQ群的哦:74 ...

  8. 转:优秀程序员的十个习惯

    在这个世界上,有数百万的人热衷于软件开发,他们有很多名字,如:软件工程师(Software Engineer),程序员(Programmer),编码人(Coder),开发人员(Developer).经 ...

  9. 程序员的十个糟糕的行为

    1) 情绪化的思维 如果你开始使用不同颜色的眼光来看待这个世界的话,那么你可能会成为一个很糟糕的程序员.情绪化的思维或态度很有可能会把自己变成一个怪物.相信你经常可以看到很多很糟糕的程序会使用下面的这 ...

最新文章

  1. inter® management engine interface黄色感叹号解决方法
  2. LeNet试验(一) 搭建pytorch版模型及运行
  3. 使用jspsmartupload完成简单的文件上传系统
  4. 前端学习(2998):vue+element今日头条管理--element引入
  5. java学习(114):Calendar类方法before
  6. python字符串对比两项_Python之字符串比较is、==、__cmp__
  7. JUC组件扩展(二)-JAVA并行框架Fork/Join(四):监控Fork/Join池
  8. redis 缓存预热_Redis异常问题解决方案:缓存雪崩、预热、穿透、击穿、降解方案分析...
  9. Python数据分析扩展库pandas的DataFrame排序方法小结
  10. 在线蚂蚁文,菊花文生成工具
  11. SpringBoot与缓存使用及原理(下)
  12. SVO 论文与代码分析总结
  13. 聊聊我在腾讯和字节工作感受
  14. Linux用户和群组管理的主要配置文件
  15. kernelbase故障模块_错误模块名称: KERNELBASE.dll
  16. ASP.NET实现将word文档转换成pdf的方法
  17. python给成绩表加上姓名列_Python Pandas 基本操作教学之成绩表
  18. 《人机交互技术》结课作业:界面调研报告交互界面设计快速原型设计(华科软院)
  19. 腾讯域名申请、腾讯备案以及公安备案过程记录
  20. java中secretkey,java生成秘钥key,并保存秘钥到文件中

热门文章

  1. 线性表之顺序存储结构相关算法学习
  2. 在阿里云服务器centOs7系统中部署.NET Core项目
  3. Java关于周跨年的周数计算
  4. Windows下UEFI环境的搭建
  5. DevOps - 配置管理 - Ansible
  6. React入门教程第三课--gulp编译优化
  7. USACO(含training section)水题合集[5/未完待续]
  8. iOS基础 - 多媒体
  9. 中国游戏大数据:市场规模全球第一,直播已进入黄金期
  10. 5.4万Star全部归零,项目作者:十分后悔