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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c#入门笔记

發布時間:2023/12/10 C# 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#入门笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

c#入門初探

零. 寫在前面

0.1 解決方案、項目、程序集、命名空間

0.1.1項目

  • 一個項目可以就是你開發的一個軟件。
  • 在.Net下,一個項目可以表現為多種類型,如控制臺應用程序,Windows應用程序,類庫(Class Library),Web應用程序,Web Service,Windows控件等等。
  • 如果經過編譯,從擴展名來看,應用程序都會被編譯為.exe文件,而其余的會被編譯為.dll文件。
  • .exe文件,就表明它是可以被執行的,表現在程序中,這些應用程序都有一個主程序入口點,即方法Main()
  • 類庫,Windows控件等,則沒有這個入口點,所以也不能直接執行,而僅提供一些功能,給其他項目調用。
  • 創建項目
    • 依次執行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方法。
    public static void Main(string[] args){WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().Build().Run(); }
    • WebHost是一個internal類,我相信NETCore團隊不希望大家隨意的去new它,而是通過WebHostBuilder去構建。
    • 在ASP.NET Core1x中,我們必須要自己創建WebHostBuilder。
    var host = new WebHostBuilder().UseKestrel().UseContentRoot(Directory.GetCurrentDirectory()).UseIISIntegration().UseStartup<Startup>().Build();

    0.3.3 ConfigureAppConfiguration

    • 這個方法專門用來為 WebHostBuilder添加配置,包括appsettings.json的、命令行參數以及環境變量。

    0.3.4 UseStartup<>

    • Startup.cs這個類主要做兩件事情的配置Service DI和http管道,這些都是在WebHost啟動之前就需要確定下來的。而UseStartup就是將我們定義的Startup.cs和 IStartup綁定起來,讓WebHost可以找得到。 怎么綁定呢? 當然還是依賴注入:
  • Program.cs文件里面有個main函數,這里是項目開啟入口
  • Startup.cs文件主要是初始化設置的地方
  • program和startup關聯的,首先程序進入program里面的main函數,在WebHostBuilder運行run之前會通過UseStartup進入到startup文件的各個方法中,順序是:Startup(構造器初始化加載一些配置文件)-》ConfigureServices(添加各個服務的依賴關系)-》Configure
  • 一. 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# 程序主要包括以下部分:

  • 命名空間聲明(Namespace declaration):一個 namespace 是一系列的類
  • 一個 class: 類一般包含多個方法
  • Class 方法
  • Class 屬性
  • 一個 Main 方法
  • 語句(Statements)& 表達式(Expressions)
  • 注釋
  • ===
    以下幾點值得注意:

    • 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。

    調試快捷鍵

  • F6: 生成解決方案
  • Ctrl+F6: 生成當前項目
  • F7: 查看代碼
  • Shift+F7: 查看窗體設計器
  • F5: 啟動調試
  • Ctrl+F5: 開始執行(不調試)
  • Shift+F5: 停止調試
  • Ctrl+Shift+F5: 重啟調試
  • F9: 切換斷點
  • Ctrl+F9: 啟用/停止斷點
  • Ctrl+Shift+F9: 刪除全部斷點
  • F10: 逐過程
  • Ctrl+F10: 運行到光標處
  • F11: 逐語句
  • 斷點調試

    設置斷點的方法:

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

    五. 命名空間

    • 一個 namespace 是一系列的類。HelloWorldApplication 命名空間包含了類 HelloWorld。
    • 引入它,主要是為了避免一個項目中,可能會存在的相同對象名的沖突
    • 在項目里我們也可以定義很多不相同的命名空間。但為了用戶便于使用,最好在一個項目中,其命名空間最好是一體的層次結構。
    • 在Visual Studio里,我們可以在項目中新建一個文件夾,默認情況下,該文件夾下對象的命名空間,應該是“項目的命名空間.文件夾名”。當然,我們也可以在namespace中修改它

    5.1 定義命名空間

    • 命名空間的設計目的是提供一種讓一組名稱與其他名稱分隔開的方式。在一個命名空間中聲明的類的名稱與另一個命名空間中聲明的相同的類的名稱不沖突。

    • 命名空間的定義是以關鍵字 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();} }
    • 當上面的代碼被編譯和執行時,它會產生下列結果:
    Inside first_space Inside second_space

    在同一個命名空間里的類實例化不需要寫命名空間名

    • 您也可以使用 using 命名空間指令,這樣在使用的時候就不用在前面加上命名空間名稱。該指令告訴編譯器隨后的代碼使用了指定命名空間中的名稱。下面的代碼演示了命名空間的應用。讓我們使用 using 指定重寫上面的實例:
    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 嵌套命名空間

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

    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 實例執行操作。 這些操作是以跨平臺的方式執行的。
      包含的方法:
  • Combine(String,String,String):將幾個字符組合成一個路徑
  • HasExtension()方法:確定路徑是否包括文件擴展名。
  • IsPathRooted()方法:獲取一個值,該值指示指定的路徑字符串是否包含根。
  • GetFullPat()方法:返回指定路徑字符串的絕對路徑。
  • GetTempPath()方法:返回當前用戶的臨時文件夾的路徑。
  • GetTempFileName():在磁盤上創建磁唯一命名的零字節的臨時文件并返回該文件的完整路徑
  • GetFileNameWithoutExtension(): 返回不具有擴展名的指定路徑字符串的文件名。
  • 5.9 AppContext 類

    • 屬性:
  • BaseDirectory:獲取程序集解析程序用于探測程序集的基目錄的路徑名。
  • TargetFrameworkName:獲取當前應用程序所針對的框架版本的名稱。
    • 參數:
  • sourceArchiveFileName
    Type: System.String
    要解壓縮存檔的路徑。
  • destinationDirectoryName Type: System.String 放置解壓縮文件的目錄的路徑,指定為相對或絕對路徑。 相對路徑是指相對于當前工作目錄的路徑。
  • entryNameEncoding Type: System.Text.Encoding
    在存檔中讀取或寫入項名時使用的編碼。 僅當需要針對具有不支持項名的 UTF-8 編碼的 zip 歸檔工具和庫的互操作性進行編碼時,為此參數指定一個值。
  • 5.10 Directory類

    • 是用于文件夾操作

    包含的方法:

  • CreateDirectory():創建一個文件夾
  • Delete():刪除一個文件夾
  • Move():移動文件夾的位置
  • Exists():判斷文件夾是否存在,返回布爾類型
  • GetFiles():獲取目錄下的所有文件的路徑,返回到字符串數組
  • GetDirectories():獲取目錄下所有文件夾的路徑,返回字符串數組
  • 5.11 ConfigurationBuilder 類

    表示將由自定義配置生成器實現擴展的基類。

    • 命名空間: System.Configuration
    • 程序集: System.Configuration

    六. 類(Class)

    6.1 類的定義

    • 類的定義是以關鍵字 class 開始,后跟類的名稱。類的主體,包含在一對花括號內。
    • 變量是類的屬性或數據成員,用于存儲數據

    6.2 成員函數和封裝

    • 函數是一系列執行指定任務的語句。類的成員函數是在類內聲明的。

    • 類的成員函數是一個在類定義中有它的定義或原型的函數,就像其他變量一樣。作為類的一個成員,它能在類的任何對象上操作,且能訪問該對象的類的所有成員。
    • 成員變量是對象的屬性(從設計角度),且它們保持私有來實現封裝。這些變量只能使用公共成員函數來訪問。

    6.3 構造函數

    • 類的構造函數是類的一個特殊的成員函數,當創建類的新對象時執行。
      構造函數的名稱與類的名稱完全相同,它沒有任何返回類型。
    using System; namespace LineApplication {class Line{private double length; // 線條的長度public Line(){Console.WriteLine("對象已創建");}public void setLength( double len ){length = len;}public double getLength(){return length;}static void Main(string[] args){Line line = new Line(); // 設置線條長度line.setLength(6.0);Console.WriteLine("線條的長度: {0}", line.getLength());Console.ReadKey();}} }

    結果如下:

    對象已創建 線條的長度: 6

    6.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無需實例化即可調用類成員函數

    using System; namespace StaticVarApplication {class StaticVar{public static int num; public void count(){num++;}public static int getNum() //成員函數為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()); // 將類成員函數聲明為public static無需實例化即可調用類成員函數Console.ReadKey();}} }

    結果如下:

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

    七. c#方法

    • 一個方法是把一些相關的語句組織在一起,用來執行一個任務的語句塊。每一個 C# 程序至少有一個帶有 Main 方法的類。要使用一個方法,包含定義方法調用方法

    7.1 定義方法

    • 當定義一個方法時,從根本上說是在聲明它的結構的元素。在 C# 中,定義方法的語法如下:
    <Access Specifier> <Return Type> <Method Name>(Parameter List) {Method Body }

    下面是方法的各個元素:

    • 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 關鍵字聲明引用參數
    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);/* 調用函數來交換值 */n.swap(ref a, ref b);Console.WriteLine("在交換之后,a 的值: {0}", a);Console.WriteLine("在交換之后,b 的值: {0}", b);Console.ReadLine();}} }
  • 輸出參數: 這種方式可以返回多個值。
    • return 語句可用于只從函數中返回一個值。但是,可以使用 輸出參數 來從函數中返回兩個值。輸出參數會把方法輸出的數據賦給自己,其他方面與引用參數相似。
    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("在方法調用之前,a 的值: {0}", a);/* 調用函數來獲取值 */n.getValue(out a);Console.WriteLine("在方法調用之后,a 的值: {0}", a);Console.ReadLine();}} }

    八. 封裝

    • 封裝:被定義為"把一個或多個項目封閉在一個物理的或者邏輯的包中"。在面向對象程序設計方法論中,封裝是為了防止對實現細節的訪問。
    • C# 封裝根據具體的需要,設置使用者的訪問權限,并通過 訪問修飾符 來實現。

    • 一個 訪問修飾符 定義了一個類成員的范圍和可見性。C# 支持的訪問修飾符如下所示:

  • public:所有對象都可以訪問;
    • Public 訪問修飾符允許一個類將其成員變量和成員函數暴露給其他的函數和對象。任何公有成員可以被外部的類訪問。
  • private:對象本身在對象內部可以訪問;
    • Private 訪問修飾符允許一個類將其成員變量和成員函數對其他的函數和對象進行隱藏。只有同一個類中的函數可以訪問它的私有成員。即使是類的實例也不能訪問它的私有成員。
  • protected:只有該類對象及其子類對象可以訪問
    • Protected 訪問修飾符允許子類訪問它的基類的成員變量和成員函數。這樣有助于實現繼承。我們將在繼承的章節詳細討論這個。更詳細地討論這個。
  • internal:同一個程序集的對象可以訪問;
  • protected internal:訪問限于當前程序集或派生自包含類的類型。
  • 九. 可空類型(Nullable)

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

    例如:

  • Nullable< Int32 >,讀作"可空的 Int32",可以被賦值為 -2,147,483,648 到 2,147,483,647 之間的任意值,也可以被賦值為 null 值。
  • 類似的,Nullable< bool > 變量可以被賦值為 true 或 false 或 null。
  • C# 單問號 ? 與 雙問號 ??

    • ? : 單問號用于對 int,double,bool 等無法直接賦值為 null 的數據類型進行 null 的賦值,意思是這個數據類型是 NullAble 類型的。
    • ?? : 雙問號 可用于判斷一個變量在為 null 時返回一個指定的值。
      接下來我們詳細說明。

    語法

    • 聲明一個 nullable 類型(可空類型)的語法如下:
    < data_type> ? <variable_name> = null;

    Null 合并運算符( ?? )

    • Null 合并運算符用于定義可空類型和引用類型的默認值。Null 合并運算符為類型轉換定義了一個預設值,以防可空類型的值為 Null。Null 合并運算符把操作數類型隱式轉換為另一個可空(或不可空)的值類型的操作數的類型。
      如果第一個操作數的值為 null,則運算符返回第二個操作數的值,否則返回第一個操作數的值。
    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();}} }

    輸出結果為:

    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 賦值給數組

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

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

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

    13.2 C# 結構的特點

    • 結構可帶有方法、字段、索引、屬性、運算符方法和事件。
    • 結構可定義構造函數,但不能定義析構函數。但是,您不能為結構定義默認的構造函數。默認的構造函數是自動定義的,且不能被改變。
    • 與類不同,結構不能繼承其他的結構或類。
    • 結構不能作為其他結構或類的基礎結構。
    • 結構可實現一個或多個接口。
    • 結構成員不能指定為 abstract、virtual 或 protected。
    • 當您使用 New 操作符創建一個結構對象時,會調用適當的構造函數來創建結構。與類不同,結構可以不使用 New 操作符即可被實例化。
    • 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被賦值,對象才被使用。

    13.3 類 vs 結構

    • 類是引用類型,結構是值類型。
    • 結構不支持繼承。
    • 結構不能聲明默認的構造函數。
    • 結構體中聲明的字段無法賦予初值,類可以:
    • 結構體的構造函數中,必須為結構體所有字段賦值,類的構造函數無此限制:

    十四. 枚舉

    • 枚舉是一組命名整型常量。枚舉類型是使用 enum 關鍵字聲明的。
      C# 枚舉是值類型。換句話說,枚舉包含自己的值,且不能繼承或傳遞繼承。
    • 聲明枚舉的一般語法:
    enum <enum_name> { enumeration list };

    其中,

    • 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 訪問器,或者同時包含二者。例如
    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(){// 創建一個新的 Student 對象Student s = new Student();// 設置 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)是用于在運行時傳遞程序中各種元素(比如類、方法、結構、枚舉、組件等)的行為信息的聲明性標簽。您可以通過使用特性向程序添加聲明性信息。一個聲明性標簽是通過放置在它所應用的元素前面的方括號([ ])來描述的。
    • 特性(Attribute)的名稱和值是在方括號內規定的,放置在它所應用的元素之前
    • .Net 框架提供了兩種類型的特性:預定義特性和自定義特性。

    17.1 預定義特性(Attribute)

    • .Net 框架提供了三種預定義特性:**
  • AttributeUsage
  • Conditional
  • Obsolete :這個預定義特性標記了不應被使用的程序實體
  • ==

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

    17.2 創建自定義特性(Attribute)

    • 創建并使用自定義特性包含四個步驟:
  • 聲明自定義特性
  • 構建自定義特性
  • 在目標程序元素上應用自定義特性
  • 通過反射訪問特性
  • 轉載于:https://www.cnblogs.com/monkey-moon/p/9092237.html

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。