c#入门笔记
c#入門初探
零. 寫在前面
0.1 解決方案、項(xiàng)目、程序集、命名空間
0.1.1項(xiàng)目
- 一個(gè)項(xiàng)目可以就是你開發(fā)的一個(gè)軟件。
- 在.Net下,一個(gè)項(xiàng)目可以表現(xiàn)為多種類型,如控制臺(tái)應(yīng)用程序,Windows應(yīng)用程序,類庫(kù)(Class Library),Web應(yīng)用程序,Web Service,Windows控件等等。
- 如果經(jīng)過編譯,從擴(kuò)展名來(lái)看,應(yīng)用程序都會(huì)被編譯為.exe文件,而其余的會(huì)被編譯為.dll文件。
創(chuàng)建項(xiàng)目
- 依次執(zhí)行File-new-Project來(lái)創(chuàng)建一個(gè)新的項(xiàng)目
- 例如創(chuàng)建控制臺(tái)應(yīng)用程序。注意在此時(shí),Visual Studio除了建立了一個(gè)控制臺(tái)項(xiàng)目之外,該項(xiàng)目同時(shí)還屬于一個(gè)解決方案(Solution)
一個(gè)項(xiàng)目可以表現(xiàn)為多種類型:控制臺(tái)應(yīng)用程序、類庫(kù)、web應(yīng)用程序等
0.1.2 解決方案
- 解決方案其實(shí)是一個(gè)容器,其下邊可以包含多個(gè)項(xiàng)目。
- 如果你只需要開發(fā)一個(gè)Hello World的項(xiàng)目,解決方案自然毫無(wú)用處。
- 但是,一個(gè)稍微復(fù)雜一點(diǎn)的軟件,都需要很多模塊來(lái)組成,為了體現(xiàn)彼此之間的層次關(guān)系,利于程序的復(fù)用,往往需要多個(gè)項(xiàng)目,每個(gè)項(xiàng)目實(shí)現(xiàn)不同的功能,最后將這些項(xiàng)目組合起來(lái),就形成了一個(gè)完整的解決方案。
- 形象地說(shuō),解決方案就是一個(gè)容器,在這個(gè)容器里,分成好多層,好多格,用來(lái)存放不同的項(xiàng)目。
- 一個(gè)解決方案與項(xiàng)目是大于等于的關(guān)系。建立解決方案后,會(huì)建立一個(gè)擴(kuò)展名為.sln的文件。
在解決方案里添加項(xiàng)目,不能再用“new”的方法,而是要在“File”菜單中,選擇“Add Project”。添加的項(xiàng)目,可以是新項(xiàng)目,也可以是已經(jīng)存在的項(xiàng)目。
0.1.3 程序集Assembly
- 一個(gè)項(xiàng)目也就是一個(gè)程序集,也可以看成是一個(gè)完整的模塊(Module),或者稱為是包(Package)
- 因此,一個(gè)程序集也可以體現(xiàn)為一個(gè)dll文件,或者exe文件。
- c#的類庫(kù)就是dll形式的程序集。
- 程序集還包括可執(zhí)行的托管應(yīng)用程序(窗體程序和控制臺(tái)程序)
- 類庫(kù)和可執(zhí)行的程序集之間的最大區(qū)別就是類庫(kù)沒有入口而可執(zhí)行程序集必須有入口。
- 程序集可以由單一的文件組成,也可以多文件組成。
組成程序集的四元素
- 程序集清單 元數(shù)據(jù)集合
- 類型元數(shù)據(jù) 買書程序集中類型的數(shù)據(jù)
- msil碼
- 資源集
0.1.4 命名空間(finish)
- 引入它,主要是為了避免一個(gè)項(xiàng)目中,可能會(huì)存在的相同對(duì)象名的沖突
- 在項(xiàng)目里我們也可以定義很多不相同的命名空間。但為了用戶便于使用,最好在一個(gè)項(xiàng)目中,其命名空間最好是一體的層次結(jié)構(gòu)。
- 在Visual Studio里,我們可以在項(xiàng)目中新建一個(gè)文件夾,默認(rèn)情況下,該文件夾下對(duì)象的命名空間,應(yīng)該是“項(xiàng)目的命名空間.文件夾名”。當(dāng)然,我們也可以在namespace中修改它
0.2 c#類庫(kù)
類庫(kù)是相對(duì)于控制臺(tái)應(yīng)用程序來(lái)講的,區(qū)別就是類庫(kù)沒有入口函數(shù),而應(yīng)用程序有入口函數(shù)。
- 除了在項(xiàng)目中把類放在不同的文件中之外,還可以把它們放在完全不同的項(xiàng)目中。如果一個(gè)項(xiàng)目什么都不包含,只包含類(以及其他相關(guān)的類型定義,但沒有入口點(diǎn)),該項(xiàng)目就稱為類庫(kù)。
- 類庫(kù)就是我們所說(shuō)的動(dòng)態(tài)鏈接庫(kù)(DLL)
在C#中,我們可以把我們做的一些類封裝成一個(gè)類庫(kù),然后把類庫(kù)模糊化處理,就可以共享給別人用了。
0.3 WebHost
0.3.1、始于WebHost
WebHost像母親,它承載和孕育了ASP.NET Core下幾乎所有的對(duì)象,從代碼層面入手來(lái)看的話可以說(shuō)是ASP.NET Core的入口,沒有它,后面的一切都沒有辦法開始,WebHost的啟動(dòng)一共分為四階段。
- 準(zhǔn)備階段: var builder = new WebHostBuilder(),然后給WebHostBuilder各種填參數(shù)
- 構(gòu)建階段: var host = builder.Builder() ,主要負(fù)責(zé)依懶注入的初始化,以及host的初始化
- 啟動(dòng)階段: host.start();
- 運(yùn)行階段
0.3.2、program.cs
- ASP.NET Core 程序基于一個(gè)命令行的程序運(yùn)行,程序的入口在program.cs的main方法。
- WebHost是一個(gè)internal類,我相信NETCore團(tuán)隊(duì)不希望大家隨意的去new它,而是通過WebHostBuilder去構(gòu)建。
- 在ASP.NET Core1x中,我們必須要自己創(chuàng)建WebHostBuilder。
0.3.3 ConfigureAppConfiguration
- 這個(gè)方法專門用來(lái)為 WebHostBuilder添加配置,包括appsettings.json的、命令行參數(shù)以及環(huán)境變量。
0.3.4 UseStartup<>
- Startup.cs這個(gè)類主要做兩件事情的配置Service DI和http管道,這些都是在WebHost啟動(dòng)之前就需要確定下來(lái)的。而UseStartup就是將我們定義的Startup.cs和 IStartup綁定起來(lái),讓W(xué)ebHost可以找得到。 怎么綁定呢? 當(dāng)然還是依賴注入:
一. C# 環(huán)境
C# 是 .Net 框架的一部分,且用于編寫 .Net 應(yīng)用程序。下面先了解一下 C# 與 .Net 框架之間的關(guān)系。
- .Net 框架應(yīng)用程序是多平臺(tái)的應(yīng)用程序。框架的設(shè)計(jì)方式使它適用于下列各種語(yǔ)言:C#、C++、Visual Basic、Jscript、COBOL 等等。
C# 的集成開發(fā)環(huán)境
c#的開發(fā)工具有:
- Visual Studio 2010 (VS)
- Visual C# 2010 Express (VCE)
- Visual Web Developer
二. C# 程序結(jié)構(gòu)
一個(gè) C# 程序主要包括以下部分:
===
以下幾點(diǎn)值得注意:
- C# 是大小寫敏感的。
- 所有的語(yǔ)句和表達(dá)式必須以分號(hào)(;)結(jié)尾。
- 程序的執(zhí)行從 Main 方法開始。
- 與 Java 不同的是,文件名可以不同于類的名稱。
2.1 調(diào)試 & 編譯 C# 程序
啟動(dòng) Visual Studio。
- 在菜單欄上,選擇 File -> New -> Project。
- 從模板中選擇 Visual C#,然后選擇 Windows。
- 選擇 Console Application。
- 為您的項(xiàng)目制定一個(gè)名稱,然后點(diǎn)擊 OK 按鈕。
- 新項(xiàng)目會(huì)出現(xiàn)在解決方案資源管理器(Solution Explorer)中
- 在代碼編輯器(Code Editor)中編寫代碼。
- 點(diǎn)擊 Run 按鈕或者按下 F5 鍵來(lái)運(yùn)行程序。會(huì)出現(xiàn)一個(gè)命令提示符窗口(Command Prompt window),顯示 Hello World。
調(diào)試快捷鍵
斷點(diǎn)調(diào)試
設(shè)置斷點(diǎn)的方法:
一種是每次執(zhí)行一行:F10;
一種是每次執(zhí)行一行,但遇到函數(shù)調(diào)用就會(huì)跳到被調(diào)用的函數(shù)里:F11;
一種是直接執(zhí)行當(dāng)前函數(shù)里剩下的指令,返回上一級(jí)函數(shù):Shift+F11。
2.2 注釋代碼的方法(單行//,多行/**/都適用)
方法1:
- step1: 選中要注釋的代碼;
- step2: 按Ctrl+k;
- step3: 再按Ctrl+C
方法2:
- 用編輯器右上角‘選中注釋行’按鈕
2.3 取消注釋
方法1
- step1: 選中要注釋的代碼;
- step2: 按Ctrl+k;
- step3: 再按Ctrl+U;
方法2:
- 用編輯器右上角‘取消選中注釋行’按鈕
2.4 文檔注釋///
三. 數(shù)據(jù)契約
服務(wù)契約定義了遠(yuǎn)程訪問對(duì)象和可供調(diào)用的方法,數(shù)據(jù)契約則是服務(wù)端和客戶端之間要傳送的自定義數(shù)據(jù)類型。
來(lái)標(biāo)記被序列化的字段
四. using 關(guān)鍵字
- using 關(guān)鍵字表明程序使用的是給定命名空間中的名稱。例如,我們?cè)诔绦蛑惺褂?System 命名空間,其中定義了類 Console。我們可以只寫:
- 我們可以寫完全限定名稱,如下:
五. 命名空間
- 一個(gè) namespace 是一系列的類。HelloWorldApplication 命名空間包含了類 HelloWorld。
- 引入它,主要是為了避免一個(gè)項(xiàng)目中,可能會(huì)存在的相同對(duì)象名的沖突
- 在項(xiàng)目里我們也可以定義很多不相同的命名空間。但為了用戶便于使用,最好在一個(gè)項(xiàng)目中,其命名空間最好是一體的層次結(jié)構(gòu)。
- 在Visual Studio里,我們可以在項(xiàng)目中新建一個(gè)文件夾,默認(rèn)情況下,該文件夾下對(duì)象的命名空間,應(yīng)該是“項(xiàng)目的命名空間.文件夾名”。當(dāng)然,我們也可以在namespace中修改它
5.1 定義命名空間
命名空間的設(shè)計(jì)目的是提供一種讓一組名稱與其他名稱分隔開的方式。在一個(gè)命名空間中聲明的類的名稱與另一個(gè)命名空間中聲明的相同的類的名稱不沖突。
命名空間的定義是以關(guān)鍵字 namespace 開始,后跟命名空間的名稱,如下所示:
- 下面的程序演示了命名空間的用法:
- 當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
在同一個(gè)命名空間里的類實(shí)例化不需要寫命名空間名
- 您也可以使用 using 命名空間指令,這樣在使用的時(shí)候就不用在前面加上命名空間名稱。該指令告訴編譯器隨后的代碼使用了指定命名空間中的名稱。下面的代碼演示了命名空間的應(yīng)用。讓我們使用 using 指定重寫上面的實(shí)例:
5.2 嵌套命名空間
- 命名空間可以被嵌套,即您可以在一個(gè)命名空間內(nèi)定義另一個(gè)命名空間,如下所示:
- 您可以使用點(diǎn)(.)運(yùn)算符訪問嵌套的命名空間的成員,如下所示:
- 當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
5.3 命名空間System.IO.Compression里的方法ZipFile.ExtractToDirectory
5.4 Convert類常用的類型轉(zhuǎn)換方法Convert.ToInt32()
5.5 System.Text命名空間包含與字符串處理和編碼相關(guān)的類型
5.6 System.Collections.Generic命名空間包含用于處理集合的泛型類型
5.7 System.Linq命名空間,ToList()擴(kuò)展方法,ToDictionary(),ToArray()
5.8 System.IO里Path類
- 對(duì)包含文件或目錄路徑信息的 String 實(shí)例執(zhí)行操作。 這些操作是以跨平臺(tái)的方式執(zhí)行的。
包含的方法:
5.9 AppContext 類
- 屬性:
- 參數(shù):
Type: System.String
要解壓縮存檔的路徑。
在存檔中讀取或?qū)懭腠?xiàng)名時(shí)使用的編碼。 僅當(dāng)需要針對(duì)具有不支持項(xiàng)名的 UTF-8 編碼的 zip 歸檔工具和庫(kù)的互操作性進(jìn)行編碼時(shí),為此參數(shù)指定一個(gè)值。
5.10 Directory類
- 是用于文件夾操作
包含的方法:
5.11 ConfigurationBuilder 類
表示將由自定義配置生成器實(shí)現(xiàn)擴(kuò)展的基類。
- 命名空間: System.Configuration
- 程序集: System.Configuration
六. 類(Class)
6.1 類的定義
- 類的定義是以關(guān)鍵字 class 開始,后跟類的名稱。類的主體,包含在一對(duì)花括號(hào)內(nèi)。
- 變量是類的屬性或數(shù)據(jù)成員,用于存儲(chǔ)數(shù)據(jù)
6.2 成員函數(shù)和封裝
函數(shù)是一系列執(zhí)行指定任務(wù)的語(yǔ)句。類的成員函數(shù)是在類內(nèi)聲明的。
- 類的成員函數(shù)是一個(gè)在類定義中有它的定義或原型的函數(shù),就像其他變量一樣。作為類的一個(gè)成員,它能在類的任何對(duì)象上操作,且能訪問該對(duì)象的類的所有成員。
成員變量是對(duì)象的屬性(從設(shè)計(jì)角度),且它們保持私有來(lái)實(shí)現(xiàn)封裝。這些變量只能使用公共成員函數(shù)來(lái)訪問。
6.3 構(gòu)造函數(shù)
- 類的構(gòu)造函數(shù)是類的一個(gè)特殊的成員函數(shù),當(dāng)創(chuàng)建類的新對(duì)象時(shí)執(zhí)行。
構(gòu)造函數(shù)的名稱與類的名稱完全相同,它沒有任何返回類型。
結(jié)果如下:
對(duì)象已創(chuàng)建 線條的長(zhǎng)度: 66.4 參數(shù)化構(gòu)造函數(shù)
- 默認(rèn)的構(gòu)造函數(shù)沒有任何參數(shù)。但是如果你需要一個(gè)帶有參數(shù)的構(gòu)造函數(shù)可以有參數(shù),這種構(gòu)造函數(shù)叫做參數(shù)化構(gòu)造函數(shù)。這種技術(shù)可以幫助你在創(chuàng)建對(duì)象的同時(shí)給對(duì)象
6.5 析構(gòu)函數(shù)
類的析構(gòu)函數(shù)是類的一個(gè)特殊的成員函數(shù),當(dāng)類的對(duì)象超出范圍時(shí)執(zhí)行。
- 析構(gòu)函數(shù)的名稱是在類的名稱前加上一個(gè)波浪形(~)作為前綴,它不返回值,也不帶任何參數(shù)。
析構(gòu)函數(shù)用于在結(jié)束程序(比如關(guān)閉文件、釋放內(nèi)存等)之前釋放資源。析構(gòu)函數(shù)不能繼承或重載。
6.6 靜態(tài)成員
- 我們可以使用 static 關(guān)鍵字把類成員定義為靜態(tài)的。當(dāng)我們聲明一個(gè)類成員為靜態(tài)時(shí),意味著無(wú)論有多少個(gè)類的對(duì)象被創(chuàng)建,只會(huì)有一個(gè)該靜態(tài)成員的副本。
- 關(guān)鍵字 static 意味著類中只有一個(gè)該成員的實(shí)例
- 靜態(tài)變量用于定義常量,因?yàn)樗鼈兊闹悼梢酝ㄟ^直接調(diào)用類而不需要?jiǎng)?chuàng)建類的實(shí)例來(lái)獲取
靜態(tài)變量可在成員函數(shù)或類的定義外部進(jìn)行初始化。你也可以在類的定義內(nèi)部初始化靜態(tài)變量。
你也可以把一個(gè)成員函數(shù)聲明為 static。
+** 這樣的函數(shù)只能訪問靜態(tài)變量**。靜態(tài)函數(shù)在對(duì)象被創(chuàng)建之前就已經(jīng)存在.
例如:
using System; namespace StaticVarApplication {class StaticVar{public static int num; //這里把類成員num定義為靜態(tài)的,默認(rèn)初值為0public void count(){num++;}public int getNum(){return num;}}class StaticTester{static void Main(string[] args){StaticVar s1 = new StaticVar(); //s1,s2是兩個(gè)對(duì)象,但只有一個(gè)num的副本StaticVar s2 = new StaticVar();s1.count();s1.count();s1.count();s2.count();s2.count();s2.count(); Console.WriteLine("s1 的變量 num: {0}", s1.getNum());Console.WriteLine("s2 的變量 num: {0}", s2.getNum());Console.ReadKey();}} }執(zhí)行結(jié)果如下:
s1 的變量 num: 6 s2 的變量 num: 6類成員num定義為靜態(tài)的,默認(rèn)初值為0;雖然s1,s2是實(shí)例化兩個(gè)對(duì)象,但只有一個(gè)num的副本,故調(diào)用count()時(shí),無(wú)論哪個(gè)實(shí)例調(diào)用,都只有哪個(gè)靜態(tài)num實(shí)現(xiàn)自增1.
- 你也可以把一個(gè)成員函數(shù)聲明為static。
- 這樣的函數(shù)只能訪問靜態(tài)變量。
- 靜態(tài)函數(shù)在對(duì)象被創(chuàng)建之前就已經(jīng)存在。下面的實(shí)例演示了靜態(tài)函數(shù)的用法:
將類成員函數(shù)聲明為public static無(wú)需實(shí)例化即可調(diào)用類成員函數(shù)
結(jié)果如下:
變量 num: 3- 反之,如果不聲明為static,即使和Main方法從屬于同一個(gè)類,也必須經(jīng)過實(shí)例化
七. c#方法
- 一個(gè)方法是把一些相關(guān)的語(yǔ)句組織在一起,用來(lái)執(zhí)行一個(gè)任務(wù)的語(yǔ)句塊。每一個(gè) C# 程序至少有一個(gè)帶有 Main 方法的類。要使用一個(gè)方法,包含定義方法和調(diào)用方法:
7.1 定義方法
- 當(dāng)定義一個(gè)方法時(shí),從根本上說(shuō)是在聲明它的結(jié)構(gòu)的元素。在 C# 中,定義方法的語(yǔ)法如下:
下面是方法的各個(gè)元素:
- Access Specifier:訪問修飾符,這個(gè)決定了變量或方法對(duì)于另一個(gè)類的可見性。
- Return type:返回類型,一個(gè)方法可以返回一個(gè)值。返回類型是方法返回的值的數(shù)據(jù)類型。如果方法不返回任何值,則返回類型為 void。
- Method name:方法名稱,是一個(gè)唯一的標(biāo)識(shí)符,且是大小寫敏感的。它不能與類中聲明的其他標(biāo)識(shí)符相同。
- Parameter list:參數(shù)列表,使用圓括號(hào)括起來(lái),該參數(shù)是用來(lái)傳遞和接收方法的數(shù)據(jù)。參數(shù)列表是指方法的參數(shù)類型、順序和數(shù)量。參數(shù)是可選的,也就是說(shuō),一個(gè)方法可能不包含參數(shù)。
7.2 調(diào)用方法
- 您可以使用方法名調(diào)用方法。
- 您也可以使用類的實(shí)例從另一個(gè)類中調(diào)用其他類的公有方法。
帶public關(guān)鍵字的方法可以使用類的實(shí)例從類的外部進(jìn)行訪問
如:方法 FindMax 屬于 NumberManipulator 類,您可以從另一個(gè)類 Test 中調(diào)用它。
using System;namespace CalculatorApplication {class NumberManipulator{public int FindMax(int num1, int num2){/* 局部變量聲明 */int result;if (num1 > num2)result = num1;elseresult = num2;return result;}}class Test{static void Main(string[] args){/* 局部變量定義 */int a = 100;int b = 200;int ret;NumberManipulator n = new NumberManipulator();//調(diào)用 FindMax 方法ret = n.FindMax(a, b);Console.WriteLine("最大值是: {0}", ret );Console.ReadLine();}} }- 遞歸方法調(diào)用:一個(gè)方法可以自我調(diào)用。這就是所謂的 遞歸。下面的實(shí)例使用遞歸函數(shù)計(jì)算一個(gè)數(shù)的階乘:
7.3 參數(shù)傳遞
- 當(dāng)調(diào)用帶有參數(shù)的方法時(shí),您需要向方法傳遞參數(shù)。在 C# 中,有三種向方法傳遞參數(shù)的方式:
- 這是參數(shù)傳遞的默認(rèn)方式。在這種方式下,當(dāng)調(diào)用一個(gè)方法時(shí),會(huì)為每個(gè)值參數(shù)創(chuàng)建一個(gè)新的存儲(chǔ)位置。
實(shí)際參數(shù)的值會(huì)復(fù)制給形參,實(shí)參和形參使用的是兩個(gè)不同內(nèi)存中的值。所以,當(dāng)形參的值發(fā)生改變時(shí),不會(huì)影響實(shí)參的值,從而保證了實(shí)參數(shù)據(jù)的安全
- 引用參數(shù)是一個(gè)對(duì)變量的內(nèi)存位置的引用。當(dāng)按引用傳遞參數(shù)時(shí),與值參數(shù)不同的是,它不會(huì)為這些參數(shù)創(chuàng)建一個(gè)新的存儲(chǔ)位置。引用參數(shù)表示與提供給方法的實(shí)際參數(shù)具有相同的內(nèi)存位置。ref 關(guān)鍵字聲明引用參數(shù)
- return 語(yǔ)句可用于只從函數(shù)中返回一個(gè)值。但是,可以使用 輸出參數(shù) 來(lái)從函數(shù)中返回兩個(gè)值。輸出參數(shù)會(huì)把方法輸出的數(shù)據(jù)賦給自己,其他方面與引用參數(shù)相似。
八. 封裝
- 封裝:被定義為"把一個(gè)或多個(gè)項(xiàng)目封閉在一個(gè)物理的或者邏輯的包中"。在面向?qū)ο蟪绦蛟O(shè)計(jì)方法論中,封裝是為了防止對(duì)實(shí)現(xiàn)細(xì)節(jié)的訪問。
C# 封裝根據(jù)具體的需要,設(shè)置使用者的訪問權(quán)限,并通過 訪問修飾符 來(lái)實(shí)現(xiàn)。
一個(gè) 訪問修飾符 定義了一個(gè)類成員的范圍和可見性。C# 支持的訪問修飾符如下所示:
- Public 訪問修飾符允許一個(gè)類將其成員變量和成員函數(shù)暴露給其他的函數(shù)和對(duì)象。任何公有成員可以被外部的類訪問。
- Private 訪問修飾符允許一個(gè)類將其成員變量和成員函數(shù)對(duì)其他的函數(shù)和對(duì)象進(jìn)行隱藏。只有同一個(gè)類中的函數(shù)可以訪問它的私有成員。即使是類的實(shí)例也不能訪問它的私有成員。
- Protected 訪問修飾符允許子類訪問它的基類的成員變量和成員函數(shù)。這樣有助于實(shí)現(xiàn)繼承。我們將在繼承的章節(jié)詳細(xì)討論這個(gè)。更詳細(xì)地討論這個(gè)。
九. 可空類型(Nullable)
- C# 提供了一個(gè)特殊的數(shù)據(jù)類型,nullable 類型(可空類型),可空類型可以表示其基礎(chǔ)值類型正常范圍內(nèi)的值,再加上一個(gè) null 值。
例如:
C# 單問號(hào) ? 與 雙問號(hào) ??
- ? : 單問號(hào)用于對(duì) int,double,bool 等無(wú)法直接賦值為 null 的數(shù)據(jù)類型進(jìn)行 null 的賦值,意思是這個(gè)數(shù)據(jù)類型是 NullAble 類型的。
- ?? : 雙問號(hào) 可用于判斷一個(gè)變量在為 null 時(shí)返回一個(gè)指定的值。
接下來(lái)我們?cè)敿?xì)說(shuō)明。
語(yǔ)法
- 聲明一個(gè) nullable 類型(可空類型)的語(yǔ)法如下:
Null 合并運(yùn)算符( ?? )
- Null 合并運(yùn)算符用于定義可空類型和引用類型的默認(rèn)值。Null 合并運(yùn)算符為類型轉(zhuǎn)換定義了一個(gè)預(yù)設(shè)值,以防可空類型的值為 Null。Null 合并運(yùn)算符把操作數(shù)類型隱式轉(zhuǎn)換為另一個(gè)可空(或不可空)的值類型的操作數(shù)的類型。
如果第一個(gè)操作數(shù)的值為 null,則運(yùn)算符返回第二個(gè)操作數(shù)的值,否則返回第一個(gè)操作數(shù)的值。
輸出結(jié)果為:
num3 的值: 5.34 num3 的值: 3.14157十. 數(shù)組(Array)
- 數(shù)組是一個(gè)存儲(chǔ)相同類型元素的固定大小的順序集合。數(shù)組是用來(lái)存儲(chǔ)數(shù)據(jù)的集合,通常認(rèn)為數(shù)組是一個(gè)同一類型變量的集合。
10.1 數(shù)組聲明
datatype[] arrayName;其中,
- datatype 用于指定被存儲(chǔ)在數(shù)組中的元素的類型。
- [ ] 指定數(shù)組的秩(維度)。秩指定數(shù)組的大小
- arrayName 指定數(shù)組的名稱。
如:
double[] balance;10.2 初始化數(shù)組
- 一個(gè)數(shù)組不會(huì)在內(nèi)存中初始化數(shù)組。當(dāng)初始化數(shù)組變量時(shí),您可以賦值給數(shù)組。
- 數(shù)組是一個(gè)引用類型,所以您需要使用 new 關(guān)鍵字來(lái)創(chuàng)建數(shù)組的實(shí)例。
例如:
double[] balance = new double[10];10.3 賦值給數(shù)組
- 當(dāng)您創(chuàng)建一個(gè)數(shù)組時(shí),C# 編譯器會(huì)根據(jù)數(shù)組類型隱式初始化每個(gè)數(shù)組元素為一個(gè)默認(rèn)值。例如,int 數(shù)組的所有元素都會(huì)被初始化為 0。
10.4 訪問數(shù)組元素
- 元素是通過帶索引的數(shù)組名稱來(lái)訪問的。這是通過把元素的索引放置在數(shù)組名稱后的方括號(hào)中來(lái)實(shí)現(xiàn)的。
使用 foreach 循環(huán)
十一. 泛型
- 泛型(Generic) 允許您延遲編寫類或方法中的編程元素的數(shù)據(jù)類型的規(guī)范,直到實(shí)際在程序中使用它的時(shí)候。換句話說(shuō),泛型允許您編寫一個(gè)可以與任何數(shù)據(jù)類型一起工作的類或方法。
例 :
using System; using System.Collections.Generic;namespace GenericApplication {public class MyGenericArray<T>{private T[] array;public MyGenericArray(int size){array = new T[size + 1];}public T getItem(int index){return array[index];}public void setItem(int index, T value){array[index] = value;}}class Tester{static void Main(string[] args){// 聲明一個(gè)整型數(shù)組MyGenericArray<int> intArray = new MyGenericArray<int>(5);// 設(shè)置值for (int c = 0; c < 5; c++){intArray.setItem(c, c*5);}// 獲取值for (int c = 0; c < 5; c++){Console.Write(intArray.getItem(c) + " ");}Console.WriteLine();// 聲明一個(gè)字符數(shù)組MyGenericArray<char> charArray = new MyGenericArray<char>(5);// 設(shè)置值for (int c = 0; c < 5; c++){charArray.setItem(c, (char)(c+97));}// 獲取值for (int c = 0; c < 5; c++){Console.Write(charArray.getItem(c) + " ");}Console.WriteLine();Console.ReadKey();}} }輸出結(jié)果為:
0 5 10 15 20 a b c d e11.1 泛型(Generic)的特性
===
使用泛型是一種增強(qiáng)程序功能的技術(shù),具體表現(xiàn)在以下幾個(gè)方面:
- 它有助于您最大限度地重用代碼、保護(hù)類型的安全以及提高性能。
- 您可以創(chuàng)建泛型集合類。.NET 框架類庫(kù)在 System.Collections.Generic 命名空間中包含了一些新的泛型集合類。您可以使用這些泛型集合類來(lái)替代 System.Collections 中的集合類。
- 您可以創(chuàng)建自己的泛型接口、泛型類、泛型方法、泛型事件和泛型委托。
- 您可以對(duì)泛型類進(jìn)行約束以訪問特定數(shù)據(jù)類型的方法。
- 關(guān)于泛型數(shù)據(jù)類型中使用的類型的信息可在運(yùn)行時(shí)通過使用反射獲取。
11.2 泛型(Generic)方法
- 通過類型參數(shù)聲明泛型方法
十二. List
- List類是ArrayList類的泛型等效類。它的大部分用法都與ArrayList相似,因?yàn)長(zhǎng)ist類也繼承了IList接口。最關(guān)鍵的區(qū)別在于,在聲明List集合時(shí),我們同時(shí)需要為其聲明List集合內(nèi)數(shù)據(jù)的對(duì)象類型。
12.1 List的基礎(chǔ)、常用方法:
- List mList = new List();
例:
List<string> mList = new List<string>();- List testList =new List (IEnumerable collection);
以一個(gè)集合作為參數(shù)創(chuàng)建List:
string[] temArr = { "Ha", "Hunter", "Tom", "Lily", "Jay", "Jim", "Kuku", "Locu"}; List<string> testList = new List<string>(temArr);12.2 List的進(jìn)階、強(qiáng)大方法:
- List. Add(T item)添加一個(gè)元素
- List. AddRange(IEnumerable collection)添加一組元素
- Insert(intindex, T item);在index位置添加一個(gè)元素
十三.結(jié)構(gòu)體
- 在 C# 中,結(jié)構(gòu)體是值類型數(shù)據(jù)結(jié)構(gòu)。它使得一個(gè)單一變量可以存儲(chǔ)各種數(shù)據(jù)類型的相關(guān)數(shù)據(jù)。
struct 關(guān)鍵字用于創(chuàng)建結(jié)構(gòu)體。
13.1 定義結(jié)構(gòu)體(struct)
13.2 C# 結(jié)構(gòu)的特點(diǎn)
- 結(jié)構(gòu)可帶有方法、字段、索引、屬性、運(yùn)算符方法和事件。
- 結(jié)構(gòu)可定義構(gòu)造函數(shù),但不能定義析構(gòu)函數(shù)。但是,您不能為結(jié)構(gòu)定義默認(rèn)的構(gòu)造函數(shù)。默認(rèn)的構(gòu)造函數(shù)是自動(dòng)定義的,且不能被改變。
- 與類不同,結(jié)構(gòu)不能繼承其他的結(jié)構(gòu)或類。
- 結(jié)構(gòu)不能作為其他結(jié)構(gòu)或類的基礎(chǔ)結(jié)構(gòu)。
- 結(jié)構(gòu)可實(shí)現(xiàn)一個(gè)或多個(gè)接口。
- 結(jié)構(gòu)成員不能指定為 abstract、virtual 或 protected。
- 當(dāng)您使用 New 操作符創(chuàng)建一個(gè)結(jié)構(gòu)對(duì)象時(shí),會(huì)調(diào)用適當(dāng)?shù)臉?gòu)造函數(shù)來(lái)創(chuàng)建結(jié)構(gòu)。與類不同,結(jié)構(gòu)可以不使用 New 操作符即可被實(shí)例化。
- 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被賦值,對(duì)象才被使用。
13.3 類 vs 結(jié)構(gòu)
- 類是引用類型,結(jié)構(gòu)是值類型。
- 結(jié)構(gòu)不支持繼承。
- 結(jié)構(gòu)不能聲明默認(rèn)的構(gòu)造函數(shù)。
- 結(jié)構(gòu)體中聲明的字段無(wú)法賦予初值,類可以:
- 結(jié)構(gòu)體的構(gòu)造函數(shù)中,必須為結(jié)構(gòu)體所有字段賦值,類的構(gòu)造函數(shù)無(wú)此限制:
十四. 枚舉
- 枚舉是一組命名整型常量。枚舉類型是使用 enum 關(guān)鍵字聲明的。
C# 枚舉是值類型。換句話說(shuō),枚舉包含自己的值,且不能繼承或傳遞繼承。 - 聲明枚舉的一般語(yǔ)法:
其中,
- enum_name 指定枚舉的類型名稱。
- enumeration list 是一個(gè)用逗號(hào)分隔的標(biāo)識(shí)符列表。
- 枚舉列表中的每個(gè)符號(hào)代表一個(gè)整數(shù)值,一個(gè)比它前面的符號(hào)大的整數(shù)值。默認(rèn)情況下,第一個(gè)枚舉符號(hào)的值是 0.
例:
using System; namespace EnumApplication {class EnumProgram{enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };static void Main(string[] args){int WeekdayStart = (int)Days.Mon;int WeekdayEnd = (int)Days.Fri;Console.WriteLine("Monday: {0}", WeekdayStart);Console.WriteLine("Friday: {0}", WeekdayEnd);Console.ReadKey();}} }輸出結(jié)果為:
Monday: 1 Friday: 5===
- 若把Sun=2,則輸出3,7
- 當(dāng)然枚舉列表中的符號(hào)無(wú)關(guān)緊要,可以隨便取名咯
十五. 屬性(Property)
- 屬性(Property) 是類(class)、結(jié)構(gòu)(structure)和接口(interface)的命名(named)成員。類或結(jié)構(gòu)中的成員變量或方法稱為 域(Field)。屬性(Property)是域(Field)的擴(kuò)展,且可使用相同的語(yǔ)法來(lái)訪問。它們使用 訪問器(accessors) 讓私有域的值可被讀寫或操作。
- 屬性(Property)不會(huì)確定存儲(chǔ)位置。相反,它們具有可讀寫或計(jì)算它們值的 訪問器(accessors)
- 抽象類可擁有抽象屬性,這些屬性應(yīng)在派生類中被實(shí)現(xiàn):
例如,
有一個(gè)名為 Student 的類,帶有 age、name 和 code 的私有域。我們不能在類的范圍以外直接訪問這些域,但是我們可以擁有訪問這些私有域的屬性。
十六.訪問器(Accessors)
- 屬性(Property)的訪問器(accessor)包含有助于獲取(讀取或計(jì)算)或設(shè)置(寫入)屬性的可執(zhí)行語(yǔ)句。訪問器(accessor)聲明可包含一個(gè) get 訪問器、一個(gè) set 訪問器,或者同時(shí)包含二者。例如
十七.特性
- 特性(Attribute)是用于在運(yùn)行時(shí)傳遞程序中各種元素(比如類、方法、結(jié)構(gòu)、枚舉、組件等)的行為信息的聲明性標(biāo)簽。您可以通過使用特性向程序添加聲明性信息。一個(gè)聲明性標(biāo)簽是通過放置在它所應(yīng)用的元素前面的方括號(hào)([ ])來(lái)描述的。
- 特性(Attribute)的名稱和值是在方括號(hào)內(nèi)規(guī)定的,放置在它所應(yīng)用的元素之前
- .Net 框架提供了兩種類型的特性:預(yù)定義特性和自定義特性。
17.1 預(yù)定義特性(Attribute)
- .Net 框架提供了三種預(yù)定義特性:**
==
- c#特性可以用于各種類型和成員:
- 特性的最主要目的就是自描述,限定,特性只需要在類或方法需要的時(shí)候加上去就行了**
17.2 創(chuàng)建自定義特性(Attribute)
- 創(chuàng)建并使用自定義特性包含四個(gè)步驟:
轉(zhuǎn)載于:https://www.cnblogs.com/monkey-moon/p/9092237.html
總結(jié)
- 上一篇: Jackson的JSON转对象,忽略不需
- 下一篇: c语言调用串口扫码枪,C#利用控件msc