.NET Core CSharp初級篇 1-1

来源:https://www.cnblogs.com/WarrenRyan/archive/2019/07/17/11199803.html
-Advertisement-
Play Games

.NET Core CSharp 初級篇 1 1 本節內容是對於C 基礎類型的存儲方式以及C 基礎類型的理論介紹 基礎數據類型介紹 例如以下這句話:“張三是一名程式員,今年15歲重50.3kg,他的代號是‘A’,他家的經緯度是(N30,E134)。”,這句話就是一個字元串,使用雙引號括起來。而15則 ...


.NET Core CSharp初級篇 1-1

本節內容是對於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
  • ?:三元判斷運算符

具體的操作我會在我在BiliBili上發佈的.Net Core教程上進行詳細的講述。

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

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

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調試相關內容。

更多內容請關註我的BiliBili地址以及我的博客。

Github上有練習題、實例代碼以及ppt。

如果我幫到了你,請在我的Github點上一顆星,一個fork。謝謝,地址Github


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

-Advertisement-
Play Games
更多相關文章
  • C#代碼如下: 代碼保存在尾碼名為cs的文件里。 通過cmd命令行編譯.cs尾碼的文件,生成exe文件: 運行exe文件,可以看到已經列出Path環境變數了: ...
  • demo地址 GitHub相關demo地址: 對demo說明一下,非abp官網模板,使用Visual Studio 2019創建的 項目,引入Abp.AspNetCore包,簡單改造一下。 適配Abp 簡單列舉改造步驟: 1. "初始化項目" 2. "通過nuget引入Abp.AspNetCore" ...
  • 今天發現的問題 在谷歌瀏覽器一直運行良好的功能,在edge瀏覽器不能使用。 代碼參考我的另一篇博客:WebAPI Angularjs 上傳文件 不能運行的原因 下圖紅框中的代碼在edge瀏覽器中無法執行,也就不能執行下麵的上傳文件代碼。 解決方案 既然原因找到了,就可以尋找解決方案了,找了一下午,有 ...
  • 相信很多人在開發過程中經常會遇到需要對一些重要的信息進行加密處理,今天給大家分享我個人總結的一些加密演算法: 常見的加密方式分為可逆和不可逆兩種方式 可逆:RSA,AES,DES等 不可逆:常見的MD5,SHAD等 一、MD5消息摘要演算法 我想這是大家都常聽過的演算法,可能也用的比較多。那麼什麼是MD5 ...
  • public static class LogHelper { private static string strLogFolder; private static string strLogFile; private static object _obj = new object(); publi ...
  • class IniHelp { private string iniPath; [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, strin ...
  • TextBox雙向綁定int屬性,清空輸入框時Setter方法未觸發。 我的解決方案: 1、屬性置為int?; 2、xmlns:sys="clr-namespace:System;assembly=mscorlib" 3、Text="{Binding Number,Mode=TwoWay,Targe ...
  • private delegate void de_OutputMessage(string str); public void OutputMessage(string str) { if (textBoxMessage.InvokeRequired) { this.BeginInvoke(new ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...