在C#中应该使用短小的方法

原创 2007年10月03日 21:01:00
 在使用C#之前,我们可能使用了不同的语言,体验着不同的编程环境和背景。这导致我们的方法(或者说函数)的长度有着不同的看法。

极端的面向过程编程人员会见过这样的规范:任何函数都不要超过20行;但是给单片机写程序的人可能有着完全不同的规范:函数调用不能超过5层,极可能把功能写在一个函数里。

这是由不同的需求造成的:前者要求尽可能的分割功能,体现出面向过程编程对功能分割的优势;后者是因为没有足够的空间实现长长的调用堆栈,必须尽可能的为节省内存而考虑。

那么在C#中,我们的方法该写多长呢?

事实上,我们应该使用短小的、思路清晰的方法。

或许你会说,上的方法会尽量节省函数调用的成本,但是,或许在之前的某些地方这样没错,现在我们谈的是C#,情况并不是这样。
我们都知道,在C#中代码先被变成IL,然后在运行前被JIT编译成Native Code。JIT是按照方法进行编译的,也就是说它会在真正需要某一个方法之前编译它。这样,尽可能小的方法会减少我们程序的载入时间。
我们看下面的一段代码:

public static void CheckDirectoryExist(string filePath)
{
    StringBuilder msg 
= new StringBuilder();
    
if (Directory.Exists(filePath))
    
{
        msg.Append(
"The directory ");
        msg.Append(filePath);
        msg.Append(
" has been exists");
    }

    
else
    
{
        Directory.CreateDirectory(filePath);
        msg.Append(
"The directory ");
        msg.Append(filePath);
        msg.Append(
" has been created.");
    }

    
return msg.ToString();
}

不管Directory.Exists(filePath)返回的是true还是false,两个代码块中的代码都会被编译。
如果写成这样:

public static void CheckDirectoryExist(string filePath)
{
    if (Directory.Exists(filePath))
    
{
        
return DirectoryExists();
    }

    
else
    
{
        
return DirectoryNotExists();
    }

}

调用的两个方法中盛放之前的两个代码快。则只会在Directory.Exists(filePath)返回true或false时编译二者中的一个方法。这样,程序的载入时间必然会缩短。

这个例子只是一种简单的特殊的情况,真正的情况是:有人会在程序中写上一个几百行的方法,或是在某个很少会进入的逻辑分支里写了大量的逻辑。这都会加重程序载入的负担。

JIT编译器会正确的进行函数的内联等处理,不需要我们对它进行太多的干预。相反的是,我们手工干预得越多,越是难以让JIT编译器自己选择较优的方法。正确的方法是:写短小,清晰的方法。这样不会让我们的程序变慢,而会使我们的程序更容易理解,载入更快。

参考:《C#高级编程》《.NET大局观》《Effective C#》

C#实现短链接生成服务

项目中有一处需求,需要把长网址缩为短网址,把结果通过短信、微信等渠道推送给客户。刚开始直接使用网上现成的开放服务,然后在某个周末突然手痒想自己动手实现一个别具特色的长网址(文本)缩短服务。 由于...
  • yelin042
  • yelin042
  • 2017年03月28日 08:47
  • 581

[转] 射线法判断点是否在多边形内(C#)

bs开发,学到的东西
  • qiulei_21
  • qiulei_21
  • 2016年10月10日 10:23
  • 640

C# URL短地址压缩算法及短网址原理解析

这篇文章主要介绍了C# URL短地址压缩算法及短网址原理解析,本文重点给出了算法代码,需要的朋友可以参考下 短网址应用已经在全国各大微博上开始流行了起来。例如QQ微博的url.cn,新郎的sin...
  • LanSeTianKong12
  • LanSeTianKong12
  • 2015年10月10日 15:18
  • 1246

C# 判断socket断开

转自:http://blog.csdn.net/zzy7075/article/details/7969641 在做就餐机PCCserver时,发现个问题,当客户端已经将socket正常关掉时,服务...
  • u012252959
  • u012252959
  • 2016年01月04日 16:40
  • 8617

C#中类的方法重写

“重写”父类方法就是修改它的实现方式或者说在子类中对它进行重新编写。      子类继承父类的方法,在调用对象继承方法的时候,调用和执行的是父类的实现。但是,有时候需要对子类中的继承方法有不同的实现...
  • u010858791
  • u010858791
  • 2014年05月11日 11:17
  • 1602

C#找质数(素数)厄拉多塞筛法

C#找质数(素数)厄拉多塞筛法质数(prime number)又称素数,有无限个。指整数在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自...
  • cadenzasolo
  • cadenzasolo
  • 2016年02月28日 23:47
  • 1736

C#异步调用四大方法详解

C#异步调用四大方法是什么呢?C#异步调用四大方法的使用是如何进行的呢?让我们首先了解下什么时候用到C#异步调用: .NET Framework 允许您C#异步调用任何方法。定义与您需要调用的方...
  • bfboys
  • bfboys
  • 2016年10月05日 10:18
  • 1354

unity 开发中 C# 常用的方法总结(一)

本博客主要是总结在开发过程中所遇到的常用的方法,并且在此处总结,该博客会不定时的更新,也算是为了自己后面回顾的时候找到的更加方便。 Math类中方法总结      向上取整的方法: Mathf.C...
  • xushuangshuang1
  • xushuangshuang1
  • 2016年07月11日 17:15
  • 921

C#版 选择法、冒泡法、插入法和快速排序法分析与对比

前言         之前老师就讲过了选择法和冒泡法,之后又提到了插入法和排序法,今天做了一个小DEMO,对比了一下四种方法的效率,当然看了很多大牛也博客,其实算法还设计了时间复杂度和空间复杂度,对于...
  • cd18333612683
  • cd18333612683
  • 2016年05月08日 09:49
  • 1142

使用C#详解常用排序算法(二):插入排序(Insert Sort)

结合代码和运行输出详细讲解插入排序的排序过程
  • qqiang00
  • qqiang00
  • 2015年08月09日 09:48
  • 648
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在C#中应该使用短小的方法
举报原因:
原因补充:

(最多只允许输入30个字)