官术网_书友最值得收藏!

1.2 C#語言概述

.NET Framework支持多種開發語言,如C#、Visual Basic(VB)和F#等。在眾多支持的開發語言中,C#和VB最流行,VB一般用來快速開發,在小型的Windows應用系統中最為常用。C#語言是Microsoft重點推出的開發語言,它結合了C語言和C++語言的一些優點,然后又去除了指針等難以理解的概念,是一門方便開發的語言。

1.2.1 C#語言的特點

C#是一種簡潔、類型安全的面向對象的語言。與其他語言相比,C#語言具備簡單、方便和快速開發等優點,主要特色優勢如下。

(1)C#支持面向對象開發,并且有.NET底層類庫的支持,可以輕松創建對象。

(2)C#的開發效率高。C#的開發工具Visual Studio 2012支持拖放式添加控件,開發者可以輕松完成桌面布局。

(3)C#通過內置的服務,使組件可以轉化為XML網絡服務。

(4)C#提供了對XML的強大支持,可以輕松地創建XML,也可以將XML數據應用到程序中。

(5)C#具有自動回收功能,它不用像C++一樣,為程序運行中的內存管理傷腦筋。

(6)C#提供類型安全機制,可以避免一些常見的類型問題,如類型轉換和數組越界等。

(7)在.NET Framework中,C#可以自由地和其他語言(如VB)進行切換。

1.2.2 C# 5.0新增功能

在Visual Studio 2012開發工具中,自帶的版本是C# 5.0。換句話說,.NET Framework 4.5、C# 5.0伴隨著Visual Studio 2012一起正式發布。與之前版本的C#(如C# 4.0)相比,C# 5.0新增了一些功能。

1.異步編程

使用異步功能可以更輕松、更直觀地編寫異步代碼,這使異步編程幾乎和同步編程一樣簡單。在.NET Framework 4.5中,通過async和await兩個關鍵字,引入了一種新的基于任務的異步編程模型(TAP)。在這種方式下,可以通過類似同步方式編寫異步代碼,極大地簡化了異步編程模式。

【范例1】

如下代碼演示了一個異步編程的例子。

    static async void DownloadStringAsync2(Uri uri) {
        var webClient = new WebClient();
        var result = await webClient.DownloadStringTaskAsync(uri);
        Console.WriteLine(result);
    }

如果不使用上述代碼,使用之前同步編程的方式編寫的代碼如下。

    static void DownloadStringAsync(Uri uri) {
        var webClient = new WebClient();
        webClient.DownloadStringCompleted += (s, e) => {
                Console.WriteLine(e.Result);
        };
        webClient.DownloadStringAsync(uri);
    }

2.調用方信息

C# 5.0版本方便獲取有關方法的調用方信息。使用調用方信息屬性可以標識源代碼、源代碼和調用方的成員名稱的文件路徑。該信息可用于跟蹤,用于調試以及創建診斷工具。

大多數時候,開發者需要在運行過程中記錄一些調測的日志信息,可使用以下代碼。

    public void DoProcessing() {
        TraceMessage("Something happened.");
    }

為了調測方便,除了事件信息外,往往還需要知道發生該事件的代碼位置以及調用棧信息。在C++中,開發者可以通過定義一個宏,然后在宏中通過_FILE_和_LINE_來獲取當前代碼的位置,但是C#并不支持宏,只能通過StackTrace實現這一功能,但是StackTrace又不是很可靠。針對上述描述,在.NET Framework 4.5中引入了三個屬性:CallerMemberName、CallerFilePath和CallerLineNumber。在編譯器的配合下,上述三個屬性可以分別獲取到調用函數的名稱(即成員名稱)、調用文件和調用行號。例如,前面提到的TraceMessage()函數可以通過以下代碼實現。

    public void TraceMessage(string message,
            [CallerMemberName] string memberName = "",
            [CallerFilePath] string sourceFilePath = "",
            [CallerLineNumber] int sourceLineNumber = 0) {
                Trace.WriteLine("message:" + message);
                Trace.WriteLine("member name:" + memberName);
                Trace.WriteLine("source file path:" + sourceFilePath);
                Trace.WriteLine("source line number:" + sourceLineNumber);
    }

1.2.3 C# 5.0修改功能

除了新增功能,Visual Studio 2012也對C#語言進行了重大修改,如Lambda表達式、LINQ表達式、命名實參和超加載解決方法等。

1.Lambda表達式

在循環體包含的Lambda表達式中使用foreach語句中的迭代變量。使用在嵌套Lambda表達式的一個foreach迭代變量不會再導致意外的結果。

【范例2】

下面示例在Lambda表達式中如何使用變量word,代碼如下。

    static void Main() {
        var methods = new List<Action>();
        foreach (var word in new string[] { "hello", "world" }) {
            methods.Add(() => Console.Write(word + " "));
        }
        methods[0]();
        methods[1]();
    }

2.LINQ表達式

在循環體包含的LINQ表達式中使用foreach語句中的迭代變量。使用在LINQ表達式的一個foreach迭代變量不會再導致意外的結果。

【范例3】

下面示例在LINQ查詢中如何使用可變的number,代碼如下。

    static void Main() {
        var lines = new List<IEnumerable<string>>(); 
        int[] numbers = { 1, 2, 3 };
        char[] letters = { 'a', 'b', 'c' };
        foreach (var number in numbers) {
            var line = from letter in letters
                       select number.ToString() + letter;
            lines.Add(line);
        }
        foreach (var line in lines) {
            foreach (var entry in line)
                Console.Write(entry + " ");
            Console.WriteLine();
        }
    }
主站蜘蛛池模板: 乌兰县| 莱阳市| 天长市| 重庆市| 颍上县| 玉田县| 揭阳市| 西华县| 滦平县| 孟州市| 西藏| 靖远县| 华宁县| 盘山县| 华容县| 磐石市| 景德镇市| 嘉定区| 定南县| 宜州市| 佛坪县| 颍上县| 清河县| 锡林浩特市| 绥中县| 花莲市| 通河县| 灌云县| 桂阳县| 新蔡县| 普陀区| 裕民县| 灵石县| 清原| 南川市| 铜陵市| 麻栗坡县| 都江堰市| 永顺县| 浦城县| 新闻|