C#深入淺出之更多數據類型

来源:https://www.cnblogs.com/lehanbal/archive/2019/11/13/11846313.html
-Advertisement-
Play Games

類型的劃分 一個類型,要麼是值類型,要麼是引用類型 。區別在於拷貝方式:值類型拷貝值,引用類型拷貝引用 值類型 值類型直接包含值。相當於每一個值類型都有自己單獨的值: int a = 10; int b = a; a和b都有著自己的值,修改a並不會影響b,反過來一樣,互不影響。 即使是將實例傳給Co ...


類型的劃分

       一個類型,要麼是值類型,要麼是引用類型。區別在於拷貝方式:值類型拷貝值,引用類型拷貝引用

值類型

       值類型直接包含值。相當於每一個值類型都有自己單獨的值:

int a = 10;
int b = a;

a和b都有著自己的值,修改a並不會影響b,反過來一樣,互不影響。

       即使是將實例傳給Console.WriteLine()這樣的方法也會產生記憶體拷貝。由於值記憶體需要創建記憶體拷貝,因此定義的時候不要讓它們占用太多記憶體。

引用類型

       引用類型的變數存儲對數據存儲位置的引用,而不是直接存儲數據。也就是說,要到對應的位置才能找到真正的數據。因此為了訪問數據,“運行時”要先從變數中讀取記憶體位置,再“跳轉”到包含數據的記憶體位置。引用類型指向的記憶體區為成為堆。

       正如前面所說,引用類型拷貝引用,它不包含值,每次引用變數的賦值都是引用的拷貝,並不需要拷貝數據。

       值得註意的一點,引用類型只複製對數據的引用,所以兩個不同的變數可引用相同的數據。在這種情況下,只要數據發生了改變,就會影響到所引用到他的變數的值,畢竟都是引用同一個數據。

可空修飾符

       我之前提到過null值,它是給引用變數表示為空的值,一般不能將它賦值給值類型。根據定義,值類型不能包含引用。但是有的時候我們的確又有這一方面的需求,所以為了聲明能存儲null變數,要使用可空修飾符"?"。示例:

int? cnt = null;

隱式類型的局部變數

    關鍵字:var,用於聲明隱式類型的局部變數。示例:

var text = Console.WriteLine();

這麼做最終的CIL代碼並沒有區別,但var告訴編譯器根據聲明時所賦的值來推斷數據類型。

    雖然允許用var取代像是數據類型,但是在已知數據類型的情況下還是不要這麼做,明確的聲明數據類型不僅能夠增加可讀性,還相當於親自確認了等號右邊返回的是你所需要的數據類型。

    匿名類型能夠在方法內部動態聲明數據類型,並不需要通過顯式的類定義來聲明,示例:

var people1 = new { Name = "Van", Say = "啊?" };
var people2 = new { Name = "Bili", Say = "乖乖站好" };
System.Console.WriteLine( $"{people1.Name} {people1.Say}");
System.Console.WriteLine( $"{people2.Name} {people2.Say}");

元組

    有時候需要合併數據元素。元組正好可以解決這個問題,它允許在一個語句內完成所有變數的賦值。

    以下是它的語法形式:

    將元組賦給單獨聲明的變數:

(string power, string name, int weight) = ("超高校的幸運", "脖子直抖", 65);

    將元組賦給預聲明的變數:

string power, name;
int weight;
(power, name, weight) = ("超高校的幸運", "脖子直抖", 65);

    將元組賦給隱式類型的變數:

var (power,name,weight) = ("超高校的幸運", "脖子直抖", 65);

註意:此處以及下麵包含的 var 絕不能如果替換成顯示類型(如string或int)。因為元組宗旨是允許每一項都有不同的數據類型,所以每一項都指定同一個顯示類型名稱和這個宗旨衝突,即便是真的一樣,編譯器也不允許指定顯示類型。

    聲明具名元組,將元組值賦給它。

(string power, string name, int weight) people = ("超高校的幸運", "脖子直抖", 65);

    聲明包含具名元組項的元組,將其賦給隱式類型的變數。

var people = (power:"超高校的幸運", name:"脖子直抖", weight:65);

    將元組項未具名的元組賦給隱式類型的變數,再通過向編號屬性訪問單獨的元素。

var people = ("超高校的幸運", "脖子直抖", 65);
people.Item1;//people.Item2;

若是具名元組還是可以通過項目編號屬性訪問單獨的元素。

    賦值時用下劃線丟棄元組的一部分數據(棄元)。

(string power, _, int weigth) people = ("超高校的幸運", "脖子直抖", 65);

數組

    數組能夠在單個變數中存儲同一種類型的多個數據項,並且可以通過索引來單獨訪問這些數據項。數組的數據線索引從0開始,最大索引值總是比數組中的數據項少1。但是現在大多數程式都使用泛型集合類型而非數組來存儲數據集合。

數組聲明

    數組聲明,直接上代碼:

string[] arr1;

方括弧在數據類型之後,變數名之前。

    聲明二維數組的方法,代碼:

string[,] arr2;

在用逗號進行多維數組的聲明,總共維數等於逗號加一。

數組的實例化和賦值

    數組可在聲明的同時初始化,例如:

string[] arr3 = {"1","1","4","5","1","4"};

元素的下標對應就是對應元素的位置,依次排列。

    也可以先聲明數組再進行賦值,如下:

string[] arr4;
arr4 = new string[]{"1","1","4","5","1","4"};

但是從C#3.0開始就不必在new之後指定數組類型。編譯器能根據初始化列表中的數據類型推斷數組類型。如下:

arr4 = new []{"1","1","4","5","1","4"};

上面使用了new關鍵字,它指示“運行時”為資料庫類型分配記憶體,也就是實例化數據類型。

    我們也可以給數組分配固定大小但不提供初始化,也可以指定大小並賦值,如下:

string[] arr5 = new string[6]{"1","1","4","5","1","4"};

    數組在沒有被初始化的時候,“運行時”會給每個元素初始化為他們的預設值:

  • 引用類型會被初始化為null。
  • 數字類型會被初始化為0。
  • bool初始化為false。
  • char類型初始化為\0。

    多位數組註意不要超出對應的聲明範圍,這裡不再討論。

數組的使用

    可以用方括弧表示法(數組訪問符)來訪問數組中一個特定的數據項。註意下標是從0開始的,最大下標是數組內容減一。

arr1[1];//表示arr1數組中第二個元素的內容

    二維數組同理。

    交錯數組,也就是數組數組,用數組來存儲數組,聲明方式如下:

int[][] arr6 = {
    new int[]{1,1,1};
    new int[]{2,2,2};
    new int[]{3,3,3};
}

    當然數組也有一些方法,下麵進行舉例:

  • arr.Length:獲取數組的長度,只讀。

我們在訪問數組的邊界元素時,一般會採取Length-1這樣的方式來訪問數組邊界成員。

  • System.Array.Sort():對數組內容進行排序。
  • System.Array.BinarySearch(var[] arr, var searchString):返回搜索值的索引,不存在就返回-1。前提是按升序排序。
  • System.Array.Clear(intArray, 0, intArray.Length):清空第0到第intArray.Length個索引的元素(置零)。
  • System.Array.Reverse(arr):反轉數組順序。

還有眾多方法,這裡不一一列舉,看個樂呵。

字元串作為數組使用

    我們需要註意的是,字元串是不可變的,字元串作為數組使用時,我們訪問到的成員變數都是char類型的變數。為此將字元串作為數組使用時要註意不能去修改成員變數的內容。

小結

    本次博文的內容介紹了更多的數據結構,但是這也只是開始,介紹了值類型,引用類型,隱式類型,元組以及數組,這些內容都會貫徹到我們今後的項目之中,一定要打好堅實的基礎,當然不是說要背下來,理解到位才是我們應該去做的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、冒泡排序 在要排序的一組數中,對當前還未排好的序列,從前往後對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即,每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。 1 // 升序 2 $arr=[1,43,54,62,21,66,32,78,36,76,39]; ...
  • 由於我本地的mysql版本比較低,最近想著要升級一下mysql版本,鑒於docker容器的火熱,就想著在本地裝個docker環境,然後下載最新版的mysql鏡像,完成mysql8.0的安裝。電腦是windows 10版本。 一 啟用Hyper V 打開控制面板 程式 啟用或關閉windows功能,勾 ...
  • Spring 練習 通過學習spring的基礎知識,瞭解了Spring為了降低Java開發的複雜性,採取了以下4種關鍵策略: 基於POJO的輕量級和最小侵入性編程; 通過依賴註入和麵向介面實現松耦合; 基於切麵和慣例進行聲明式編程; 通過切麵和模板減少樣板式代碼。 下麵將做一個spring的練習de ...
  • c++ 模板類,方法返回值類型是typedef出來的,或者是auto,那麼此方法在類外面如何定義? 比如方法max1的返回值是用typedef定義出來的mint,那麼在類外如何定義這個方法呢? 嘗試1: 嘗試1的結果:編譯不過,提示不能識別mint 嘗試2: 嘗試2的結果:依然編譯不過 嘗試3: 在 ...
  • Spring之IOC容器初始化 前言 在前面我們分析了最底層的IOC容器BeanFactory,接著簡單分析了高級形態的容器ApplicationContext,在ApplicationContext 中我們知道一個核心方法 refresh,這裡面就是IOC容器的初始化流程,在前面並沒有直接去分析它 ...
  • 一.編寫shell腳本基本格式 拿最簡單的 舉例 . !/bin/bash:告訴電腦,使用bash解釋器來執行代碼 echo: 列印 二.運行shell腳本 (推薦使用) 三.註釋 四.定義變數 基本語法 shell 1.定義變數:變數名=變數值 2.撤銷變數:unset 變數名 3.聲明靜態變數 ...
  • 1.paramiko 用於幫助開發者通過代碼遠程連接伺服器,並對伺服器進行操作。 遠程執行命令【用戶名和密碼】 遠程執行命令【公鑰和私鑰】(公鑰必須提前上傳到伺服器) 遠程上傳和下載文件【用戶名和密碼】 遠程上傳和下載文件【公鑰和私鑰】 補充:通過私鑰字元串也可以連接遠程伺服器。 2.公司員工基於x ...
  • 多態是類的三大特性之一,抽象類又是多態的實現方法之一。抽象類是什麼呢,如果把虛方法比作一個盛有純凈水的杯子,那麼此時的“純凈水”就是事先定義好的方法,我們可以根據不同的需求來改變杯子中所事先盛放的是“純凈水”還是“咖啡”。但是抽象類呢,他更像是一個空的杯子,放在消毒櫃中,讓有需要的人自己去拿,去決定 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...