程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++與C#對比學習:內聯函數,匿名函數

C++與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. 下一頁:
Copyright © 程式師世界 All Rights Reserved