C++与C#对比学习:内联函数,匿名函数

为啥用内联函数(inline functions)

 

   在C++中函数调用需要建立栈环境,进行参数复制,保护调用现场,返回时进行返回值复制,恢复调用现场.这些操作都需要额外开销.那有啥好办法避免频繁的函数调用呢,

  首先想到的可能是把函数中的代码直接拿来用,而不用先在某处弄个函数,然后再去调用,当然也只是函数比较简单时可行.但如果多处用到那函数的话,你全部替换会使得代码冗余,可读性下降,于是你想到了用宏,一些简单的函数基本上是些表达式的组合,你用个宏把它全部替换掉.这样用起来代码量会少点,可读性也强点.不过宏只是简单的替换,不会做多余的检查,比如检查函数函数是否匹配啊.这时内联函数就派上用场了.内联函数是结合了宏和函数的优点.一方面它在会把函数用函数体中的内容替换掉,这就不需要调用函数的额外开销,这像宏.另一方面它是在编译阶段而不是预编译阶段,这样编译器能做一些安全检查,比如参数类型检查啊.

 

内联函数用法

 

内联函数用法很简单,在调用函数之前先声明那函数为内联函数即可.举个简单例子

inline  void Print();  //声明内联函数,当然你也可以把声明和定义放到一起,就不用在其他地方再去定义了

int main()

{

   Print();

  

}

inline void Print()       //inline关键字也可去掉

{

     cout<<"this is inline function.;

}

另外据说如果函数中有while,switch等复杂控件结构,或者有递归调用.内联函数会自动失效.会当成一般函数去调用了.不过这玩艺也不太好验证.不知道啥时确实去内联了,啥时是只当一般函数处理了.

匿名函数

C#中没有内联函数的概念,不过有个比较类似的概念,叫匿名函数.

举个简单例子

delegate void MyDelegate(string name);

    class Program

    {

      static  void Print(string name)

        {

            Console.WriteLine("hello," + name);

        }

        static void Main(string[] args)

        {

            MyDelegate arwen = Print;

            arwen("arwen");

           }

    }

这里用到了代理,类似于一个函数指针.当定义一个代理时要指定一个函数,我们还得另外在某个地方定义一个函数.如果函数比较简单的话我们可以不用在其他地方定义,直接就地展开,用一个匿名函数就OK.例如

MyDelegate weiwen = delegate(string name) { Console.WriteLine("hi," + name); }; //这就是匿名函数

weiwen("weiwen");

在C# 3.0中出现了拉姆达(lambda)表达式,可以把匿名方法进一步简化

MyDelegate weiwenhp = (xxx)  => { Console.WriteLine("hi," + xxx);};

weiwenhp("weiwenhp");

这看着更爽吧.函数的参数可以给你推断出来,所以参数你随便用个啥东东表示下,用xxx或者yyy这些乱七八糟的都可以.

拉姆达表达式是从Lisp, Scheme等函数式编程语言里借鉴过来的东东.在C#里主要应用在Linq中.

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值