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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

c 结构体 不允许使用不完整的类型_.NET Core 基础类型介绍

發布時間:2024/1/23 asp.net 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c 结构体 不允许使用不完整的类型_.NET Core 基础类型介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節內容是對于C#基礎類型的存儲方式以及C#基礎類型的理論介紹

基礎數據類型介紹

例如以下這句話:“張三是一名程序員,今年15歲重50.3kg,他的代號是‘A’,他家的經緯度是(N30,E134)。”,這句話就是一個字符串,使用雙引號括起來。而15則表示是一個 整數類型,50.3就是小數類型,不過我們在C# 中通常稱為 浮點類型,最后一個經緯度,我們通常定位地點的時候都是成對出現,所以我們認為這二者是一個密不可分的結構,這種類型我們稱為 結構體類型(struct)

以上我所說的數據類型都是一個所含有信息量一定的數值,我們稱為值類型;而張三這個人,他所含有的數據大小是不固定的,比如我又了解到了張三是一個富二代,那么他就會增加一個屬性是富二代,我們需要更多的空間去存儲他,張三這個變量我們通常就稱為引用類型,而張三這個名字,我們就稱為引用,如果你對C或者C++熟悉的話,張三這個名字就是指向張三這個人(對象)的一個指針

CSharp 中兩種數據存儲方式

在C# 中,數據在內存中的存儲方式主要分為在堆中存儲和棧中存儲。我們之前提到的值類型就是存儲在棧中,引用類型的數據是存儲在堆中,而數據是在棧中。

值類型:存儲在棧(Stack,一段連續的內存塊)中,存儲遵循先進后出,有嚴格的順序讀取訪問速度快,可通過地址推算訪問同一個棧的其余變量。

引用類型:引用(本質上和C++中的指針一致)存儲在棧中,內含的數據存儲在堆中(一大塊內存地址,內部變量存儲不一定連續存儲)。

(此處需要補充堆棧圖片)

事實上,值類型和引用類型有一個很明顯的區別就是值類型應當都是有值的,而引用類型是可以為空值的。

常見的幾種數據類型

  • 字符類型:char字符類型,代表無符號的16位整數,對應的可能值是ASCⅡ碼,你可以上網搜索ASCⅡ碼的內容

  • 整數類型:常用的一般有:byte,short,int,long。各代表8位、16位、32位、64位整型。占用內存分別為(位數/8)字節。范圍則是 +-(位數)個1組成的二進制的十進制數/2。例如byte的范圍則是11111111轉十進制后除以2取反,即-127~128。范圍絕對值之和為256。

  • 浮點類型:float, double, decimal:浮點類型,分別代表32位、64位、128位浮點類型。通常默認類型是double,如果需要指定float類型,需要1.3f,decimal類型則指定1.3m。浮點型存在的問題是精度的損失,并不一定安全。

  • 布爾類型:bool類型是一個二進制中的0和1,各代表了false和true。只存在兩個值。

  • 字符串類型:string本質是一種語法糖,作為字符類型的數組引用(指針)存在,也是String類的簡寫

  • 委托類型:delegate用于綁定函數,為引用類型的一種,將函數參數化為變量。本質上就是C++中的函數指針。

  • 數組:繼承自Array類,屬于任意類型的一種集合,但不同于集合,大小必須被初始化。在內存中是一段連續的內存空間,但是不是值類型。

C#中定義變量的方式及數據轉換的方法

在C#中定義變量的方式和其他的主流語言沒有太大的區別,以下是幾種定義方式:

int number = 5;//定義一個32位整數類型bool b = true;//定義//注意看以下兩條,string定義的字符串必須為雙引號,而char使用單引號并且只允許輸入一個字符string str = "test";char a = 'a';//記得后綴float f = 1.3f;decimal d = 1.5m;數據類型的轉換分為隱式轉換和顯式轉換,看下面幾個例子:string a = "15";int b = int.Parse(a);//顯式轉換b = (int)a;//強制轉換b = Convert.ToInt32(a);//顯式轉換,較常用double d = 1.5;b = d;//隱式轉換

數組

數組指一個類型(任意)的集合,例如你定義一個變量為a=5,很輕松,假設你需要100個呢?因此我們使用數組來存儲。
數組的定義以及使用如下:

///偽代碼,T為類型,n為大小T [] t = new T[n];//定義一個整型數組int [] a = new int [5];//你也可以選擇初始化的方式定義int [] b = new int [] {1,2,3,4,5};//或int [] c = new int [5]{1,2,3,4,5};//數組的訪問,從0開始索引Console.WriteLine(b[0]);

常見的運算符

  • +-*/:對應數學中的加減乘除。

  • %:求余運算,a%b指a除以b的余數。

  • & | ~ ^ :分別為按位與、按位或、按位取反、按位異或

  • <>:左右移位運算符,例如0010 ?--> ?0100

  • ?:三元判斷運算符

*結構體(選看)

結構體是一種比較特殊的數據類型,它很像我們后面講述到的類,但是他并不是一個類,他本質還是值類型,結構體的使用是很重要的,如果結構體使用得當,可以有效的提升程序的效率。

結構體你可以理解為將將若干個類型拼接在一起,但是存在一個很重要的內容——內存對齊。例如下面兩個結構體:

struct S{ int a; long b; int c;}struct SS{ int a; int b; long c;}

乍一看你會覺得這兩個結構體完全一致,絲毫沒有任何的差別。但事實上,在大多數編程語言里面,對于結構體這種大小并不是定值的值類型,都存在一個最小分配單元用于結構體內單個變量的大小分配。在內存中,他們兩個的存儲方式有很大的不同。
對于上面兩個結構體,他們在內存中的單元分配是:

  • S:a(4 byte + 4 free) --> b(8 byte) --> c(4 byte + 4 free),共計24字節

  • SS:a(4 byte)b(4 byte) --> c(8 byte),共計16字節

在C#中,如果你不指定最小分配單元,那么編譯器將會把結構體中占用內存最大的作為最小分配單元。不過尤其需要注意一件事,就是引用類型在結構體中。鑒于我們現在尚未講解面向對象的類,我們用string作為成員寫一個結構體。如下面這個例子:

struct S{ char a; long b; string c;}//函數中創建S s = new S();s.a = 'a';s.b = 15;s.c = "I Love .NET Core And Microsoft"

很顯然s.c的大小超過了結構體中其余兩個,但是內存分配的時候就是以最大的c作為標準嗎?

顯然不是,我們要知道struct是在棧中分配內存,string的內容是在堆中的,所以在結構體中存儲的string只是一個引用,并不會包含其他的東西,只占用4個字節。并且特別的,引用類型在內存中的位置位于大于四字節的字段前,小于四字節字段后。

上面內存分配應當是這樣:
a(8) --> c(8) --> b(8)。

如果需要深入了解這一方面內容,建議去閱讀《CLR Via C#》這本書,以及學習SOS調試相關內容。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的c 结构体 不允许使用不完整的类型_.NET Core 基础类型介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

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