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