日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

c#入门笔记

發(fā)布時(shí)間:2023/12/10 C# 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#入门笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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文件。
  • .exe文件,就表明它是可以被執(zhí)行的,表現(xiàn)在程序中,這些應(yīng)用程序都有一個(gè)主程序入口點(diǎn),即方法Main()
  • 類庫(kù),Windows控件等,則沒有這個(gè)入口點(diǎn),所以也不能直接執(zhí)行,而僅提供一些功能,給其他項(xiàng)目調(diào)用。
  • 創(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方法。
    public static void Main(string[] args){WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().Build().Run(); }
    • WebHost是一個(gè)internal類,我相信NETCore團(tuán)隊(duì)不希望大家隨意的去new它,而是通過WebHostBuilder去構(gòu)建。
    • 在ASP.NET Core1x中,我們必須要自己創(chuàng)建WebHostBuilder。
    var host = new WebHostBuilder().UseKestrel().UseContentRoot(Directory.GetCurrentDirectory()).UseIISIntegration().UseStartup<Startup>().Build();

    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)然還是依賴注入:
  • Program.cs文件里面有個(gè)main函數(shù),這里是項(xiàng)目開啟入口
  • Startup.cs文件主要是初始化設(shè)置的地方
  • program和startup關(guān)聯(lián)的,首先程序進(jìn)入program里面的main函數(shù),在WebHostBuilder運(yùn)行run之前會(huì)通過UseStartup進(jìn)入到startup文件的各個(gè)方法中,順序是:Startup(構(gòu)造器初始化加載一些配置文件)-》ConfigureServices(添加各個(gè)服務(wù)的依賴關(guān)系)-》Configure
  • 一. 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# 程序主要包括以下部分:

  • 命名空間聲明(Namespace declaration):一個(gè) namespace 是一系列的類
  • 一個(gè) class: 類一般包含多個(gè)方法
  • Class 方法
  • Class 屬性
  • 一個(gè) Main 方法
  • 語(yǔ)句(Statements)& 表達(dá)式(Expressions)
  • 注釋
  • ===
    以下幾點(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)試快捷鍵

  • F6: 生成解決方案
  • Ctrl+F6: 生成當(dāng)前項(xiàng)目
  • F7: 查看代碼
  • Shift+F7: 查看窗體設(shè)計(jì)器
  • F5: 啟動(dòng)調(diào)試
  • Ctrl+F5: 開始執(zhí)行(不調(diào)試)
  • Shift+F5: 停止調(diào)試
  • Ctrl+Shift+F5: 重啟調(diào)試
  • F9: 切換斷點(diǎn)
  • Ctrl+F9: 啟用/停止斷點(diǎn)
  • Ctrl+Shift+F9: 刪除全部斷點(diǎn)
  • F10: 逐過程
  • Ctrl+F10: 運(yùn)行到光標(biāo)處
  • F11: 逐語(yǔ)句
  • 斷點(diǎn)調(diào)試

    設(shè)置斷點(diǎn)的方法:

  • 在要設(shè)置斷點(diǎn)的代碼行旁邊的灰色空白中單擊;
  • 在彈出的快捷菜單中選擇“斷點(diǎn)”→“插入斷點(diǎn)”命令
  • 單擊要設(shè)置斷點(diǎn)的代碼行,選擇菜單中的“調(diào)試”→“切換斷點(diǎn)(G)”
  • 一種是每次執(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。我們可以只寫:
    Console.WriteLine ("Hello there");
    • 我們可以寫完全限定名稱,如下:
    System.Console.WriteLine("Hello there");

    五. 命名空間

    • 一個(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 開始,后跟命名空間的名稱,如下所示:

    namespace namespace_name {// 代碼聲明 }
    • 下面的程序演示了命名空間的用法:
    using System; namespace first_space {class namespace_cl{public void func(){Console.WriteLine("Inside first_space");}} } namespace second_space {class namespace_cl{public void func(){Console.WriteLine("Inside second_space");}} } class TestClass {static void Main(string[] args){first_space.namespace_cl fc = new first_space.namespace_cl();second_space.namespace_cl sc = new second_space.namespace_cl();fc.func();sc.func();Console.ReadKey();} }
    • 當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
    Inside first_space Inside second_space

    在同一個(gè)命名空間里的類實(shí)例化不需要寫命名空間名

    • 您也可以使用 using 命名空間指令,這樣在使用的時(shí)候就不用在前面加上命名空間名稱。該指令告訴編譯器隨后的代碼使用了指定命名空間中的名稱。下面的代碼演示了命名空間的應(yīng)用。讓我們使用 using 指定重寫上面的實(shí)例:
    using System; using first_space; using second_space;namespace first_space {class abc{public void func(){Console.WriteLine("Inside first_space");}} } namespace second_space {class efg{public void func(){Console.WriteLine("Inside second_space");}} } class TestClass {static void Main(string[] args){abc fc = new abc();efg sc = new efg();fc.func();sc.func();Console.ReadKey();} }

    5.2 嵌套命名空間

    • 命名空間可以被嵌套,即您可以在一個(gè)命名空間內(nèi)定義另一個(gè)命名空間,如下所示:
    namespace namespace_name1 {// 代碼聲明namespace namespace_name2 {// 代碼聲明} }
    • 您可以使用點(diǎn)(.)運(yùn)算符訪問嵌套的命名空間的成員,如下所示:
    using System; using SomeNameSpace; using SomeNameSpace.Nested;namespace SomeNameSpace {public class MyClass {static void Main() {Console.WriteLine("In SomeNameSpace");Nested.NestedNameSpaceClass.SayHello();}}// 內(nèi)嵌命名空間namespace Nested {public class NestedNameSpaceClass {public static void SayHello() {Console.WriteLine("In Nested");}}} }
    • 當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
    In SomeNameSpace In Nested

    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í)行的。
      包含的方法:
  • Combine(String,String,String):將幾個(gè)字符組合成一個(gè)路徑
  • HasExtension()方法:確定路徑是否包括文件擴(kuò)展名。
  • IsPathRooted()方法:獲取一個(gè)值,該值指示指定的路徑字符串是否包含根。
  • GetFullPat()方法:返回指定路徑字符串的絕對(duì)路徑。
  • GetTempPath()方法:返回當(dāng)前用戶的臨時(shí)文件夾的路徑。
  • GetTempFileName():在磁盤上創(chuàng)建磁唯一命名的零字節(jié)的臨時(shí)文件并返回該文件的完整路徑
  • GetFileNameWithoutExtension(): 返回不具有擴(kuò)展名的指定路徑字符串的文件名。
  • 5.9 AppContext 類

    • 屬性:
  • BaseDirectory:獲取程序集解析程序用于探測(cè)程序集的基目錄的路徑名。
  • TargetFrameworkName:獲取當(dāng)前應(yīng)用程序所針對(duì)的框架版本的名稱。
    • 參數(shù):
  • sourceArchiveFileName
    Type: System.String
    要解壓縮存檔的路徑。
  • destinationDirectoryName Type: System.String 放置解壓縮文件的目錄的路徑,指定為相對(duì)或絕對(duì)路徑。 相對(duì)路徑是指相對(duì)于當(dāng)前工作目錄的路徑。
  • entryNameEncoding Type: System.Text.Encoding
    在存檔中讀取或?qū)懭腠?xiàng)名時(shí)使用的編碼。 僅當(dāng)需要針對(duì)具有不支持項(xiàng)名的 UTF-8 編碼的 zip 歸檔工具和庫(kù)的互操作性進(jìn)行編碼時(shí),為此參數(shù)指定一個(gè)值。
  • 5.10 Directory類

    • 是用于文件夾操作

    包含的方法:

  • CreateDirectory():創(chuàng)建一個(gè)文件夾
  • Delete():刪除一個(gè)文件夾
  • Move():移動(dòng)文件夾的位置
  • Exists():判斷文件夾是否存在,返回布爾類型
  • GetFiles():獲取目錄下的所有文件的路徑,返回到字符串?dāng)?shù)組
  • GetDirectories():獲取目錄下所有文件夾的路徑,返回字符串?dāng)?shù)組
  • 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ù)的名稱與類的名稱完全相同,它沒有任何返回類型。
    using System; namespace LineApplication {class Line{private double length; // 線條的長(zhǎng)度public Line(){Console.WriteLine("對(duì)象已創(chuàng)建");}public void setLength( double len ){length = len;}public double getLength(){return length;}static void Main(string[] args){Line line = new Line(); // 設(shè)置線條長(zhǎng)度line.setLength(6.0);Console.WriteLine("線條的長(zhǎng)度: {0}", line.getLength());Console.ReadKey();}} }

    結(jié)果如下:

    對(duì)象已創(chuàng)建 線條的長(zhǎng)度: 6

    6.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ù)

    using System; namespace StaticVarApplication {class StaticVar{public static int num; public void count(){num++;}public static int getNum() //成員函數(shù)為public static{return num;}}class StaticTester{static void Main(string[] args){StaticVar s = new StaticVar();s.count();s.count();s.count(); Console.WriteLine("變量 num: {0}", StaticVar.getNum()); // 將類成員函數(shù)聲明為public static無(wú)需實(shí)例化即可調(diào)用類成員函數(shù)Console.ReadKey();}} }

    結(jié)果如下:

    變量 num: 3
    • 反之,如果不聲明為static,即使和Main方法從屬于同一個(gè)類,也必須經(jīng)過實(shí)例化
    using System; namespace ConsoleApp {class Program{static void Main(string[] args){Program s = new Program(); //實(shí)例化int num = s.Add(2, 3); //編譯通過Console.WriteLine(num);}public int Add(int x, int y){return x + y;}} }

    七. 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ǔ)法如下:
    <Access Specifier> <Return Type> <Method Name>(Parameter List) {Method Body }

    下面是方法的各個(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ù): 這種方式復(fù)制參數(shù)的實(shí)際值給函數(shù)的形式參數(shù),實(shí)參和形參使用的是兩個(gè)不同內(nèi)存中的值。在這種情況下,當(dāng)形參的值發(fā)生改變時(shí),不會(huì)影響實(shí)參的值,從而保證了實(shí)參數(shù)據(jù)的安全。
    • 這是參數(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ù): 這種方式復(fù)制參數(shù)的內(nèi)存位置的引用給形式參數(shù)。這意味著,當(dāng)形參的值發(fā)生改變時(shí),同時(shí)也改變實(shí)參的值。
    • 引用參數(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ù)
    using System; namespace CalculatorApplication {class NumberManipulator{public void swap(ref int x, ref int y){int temp;temp = x; /* 保存 x 的值 */x = y; /* 把 y 賦值給 x */y = temp; /* 把 temp 賦值給 y */}static void Main(string[] args){NumberManipulator n = new NumberManipulator();/* 局部變量定義 */int a = 100;int b = 200;Console.WriteLine("在交換之前,a 的值: {0}", a);Console.WriteLine("在交換之前,b 的值: {0}", b);/* 調(diào)用函數(shù)來(lái)交換值 */n.swap(ref a, ref b);Console.WriteLine("在交換之后,a 的值: {0}", a);Console.WriteLine("在交換之后,b 的值: {0}", b);Console.ReadLine();}} }
  • 輸出參數(shù): 這種方式可以返回多個(gè)值。
    • return 語(yǔ)句可用于只從函數(shù)中返回一個(gè)值。但是,可以使用 輸出參數(shù) 來(lái)從函數(shù)中返回兩個(gè)值。輸出參數(shù)會(huì)把方法輸出的數(shù)據(jù)賦給自己,其他方面與引用參數(shù)相似。
    using System;namespace CalculatorApplication {class NumberManipulator{public void getValue(out int x ){int temp = 5;x = temp;}static void Main(string[] args){NumberManipulator n = new NumberManipulator();/* 局部變量定義 */int a = 100;Console.WriteLine("在方法調(diào)用之前,a 的值: {0}", a);/* 調(diào)用函數(shù)來(lái)獲取值 */n.getValue(out a);Console.WriteLine("在方法調(diào)用之后,a 的值: {0}", a);Console.ReadLine();}} }

    八. 封裝

    • 封裝:被定義為"把一個(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:所有對(duì)象都可以訪問;
    • Public 訪問修飾符允許一個(gè)類將其成員變量和成員函數(shù)暴露給其他的函數(shù)和對(duì)象。任何公有成員可以被外部的類訪問。
  • private:對(duì)象本身在對(duì)象內(nèi)部可以訪問;
    • Private 訪問修飾符允許一個(gè)類將其成員變量和成員函數(shù)對(duì)其他的函數(shù)和對(duì)象進(jìn)行隱藏。只有同一個(gè)類中的函數(shù)可以訪問它的私有成員。即使是類的實(shí)例也不能訪問它的私有成員。
  • protected:只有該類對(duì)象及其子類對(duì)象可以訪問
    • Protected 訪問修飾符允許子類訪問它的基類的成員變量和成員函數(shù)。這樣有助于實(shí)現(xiàn)繼承。我們將在繼承的章節(jié)詳細(xì)討論這個(gè)。更詳細(xì)地討論這個(gè)。
  • internal:同一個(gè)程序集的對(duì)象可以訪問;
  • protected internal:訪問限于當(dāng)前程序集或派生自包含類的類型。
  • 九. 可空類型(Nullable)

    • C# 提供了一個(gè)特殊的數(shù)據(jù)類型,nullable 類型(可空類型),可空類型可以表示其基礎(chǔ)值類型正常范圍內(nèi)的值,再加上一個(gè) null 值。

    例如:

  • Nullable< Int32 >,讀作"可空的 Int32",可以被賦值為 -2,147,483,648 到 2,147,483,647 之間的任意值,也可以被賦值為 null 值。
  • 類似的,Nullable< bool > 變量可以被賦值為 true 或 false 或 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ǔ)法如下:
    < data_type> ? <variable_name> = null;

    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ù)的值。
    using System; namespace CalculatorApplication {class NullablesAtShow{static void Main(string[] args){double? num1 = null;double? num2 = 3.14157;double num3;num3 = num1 ?? 5.34; // num1 如果為空值則返回 5.34Console.WriteLine("num3 的值: {0}", num3);num3 = num2 ?? 5.34;Console.WriteLine("num3 的值: {0}", num3);Console.ReadLine();}} }

    輸出結(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ù)組

  • 可以通過使用索引號(hào)賦值給一個(gè)單獨(dú)的數(shù)組元素
  • double[] balance = new double[10]; balance[0] = 4500.0;
  • 可以在聲明數(shù)組的同時(shí)給數(shù)組賦值
  • double[] balance = { 2340.0, 4523.69, 3421.0};
  • 您也可以創(chuàng)建并初始化一個(gè)數(shù)組
  • int [] marks = new int[5] { 99, 98, 92, 97, 95};
    • 當(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 e

    11.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)

    struct Books {public string title;public string author;public string subject;public int book_id; };

    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 <enum_name> { enumeration list };

    其中,

    • 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í)包含二者。例如
    using System; namespace tutorialspoint {class Student{private string code = "N.A";private string name = "not known";private int age = 0;// 聲明類型為 string 的 Code 屬性public string Code{get{return code;}set{code = value;}}// 聲明類型為 string 的 Name 屬性public string Name{get{return name;}set{name = value;}}// 聲明類型為 int 的 Age 屬性public int Age{get{return age;}set{age = value;}}public override string ToString(){return "Code = " + Code +", Name = " + Name + ", Age = " + Age;}}class ExampleDemo{public static void Main(){// 創(chuàng)建一個(gè)新的 Student 對(duì)象Student s = new Student();// 設(shè)置 student 的 code、name 和 ages.Code = "001";s.Name = "Zara";s.Age = 9;Console.WriteLine("Student Info: {0}", s);// 增加年齡s.Age += 1;Console.WriteLine("Student Info: {0}", s);Console.ReadKey();}} }

    十七.特性

    • 特性(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ù)定義特性:**
  • AttributeUsage
  • Conditional
  • Obsolete :這個(gè)預(yù)定義特性標(biāo)記了不應(yīng)被使用的程序?qū)嶓w
  • ==

    • c#特性可以用于各種類型和成員:
  • 加在類前邊--類特性
  • 加在方法聲明前面--方法特性
    • 特性的最主要目的就是自描述限定,特性只需要在類或方法需要的時(shí)候加上去就行了**

    17.2 創(chuàng)建自定義特性(Attribute)

    • 創(chuàng)建并使用自定義特性包含四個(gè)步驟:
  • 聲明自定義特性
  • 構(gòu)建自定義特性
  • 在目標(biāo)程序元素上應(yīng)用自定義特性
  • 通過反射訪問特性
  • 轉(zhuǎn)載于:https://www.cnblogs.com/monkey-moon/p/9092237.html

    總結(jié)

    以上是生活随笔為你收集整理的c#入门笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。