5、C#基礎 - C#的值類型

来源:http://www.cnblogs.com/mrbug/archive/2017/12/13/8030341.html
-Advertisement-
Play Games

1、C#的值類型 有幾個特點: 存儲在棧里 基於值類型的變數直接包含值(值類型存儲實際值)。 將一個值類型變數賦給另一個值類型變數時,將複製包含的值。 這與引用類型變數的賦值不同,引用類型變數的賦值只複製對對象的引用,而不複製對象本身。 所有的值類型均隱式派生自 System.ValueType。 ...


1、C#的值類型

有幾個特點:

  • 存儲在棧里 
  • 基於值類型的變數直接包含值(值類型存儲實際值)。 將一個值類型變數賦給另一個值類型變數時,將複製包含的值。 這與引用類型變數的賦值不同,引用類型變數的賦值只複製對對象的引用,而不複製對象本身。
  • 所有的值類型均隱式派生自 System.ValueType。
  • 與引用類型不同,不能從值類型派生出新的類型。 但與引用類型相同的是,結構也可以實現介面。
  • 與引用類型不同,值類型無法包含 null 值。 但是,可以為 null 的類型 功能允許值類型分配給 null。
  • 每種值類型均有一個隱式的預設構造函數來初始化該類型的預設值。

 

值類型分為兩類: struct( 結構 )、 enum(枚舉

struct( 結構 )分為以下幾類:

  • Numeric(數值)類型

    • 整型

    • 浮點型

    • decimal

  • bool

  • 用戶定義的結構。

下表列出了 C# 中內置類型中可用的值類型:

類型描述範圍預設值
bool 布爾值 True 或 False False
byte 8 位無符號整數 0 到 255 0
char 16 位 Unicode 字元 U +0000 到 U +ffff '\0'
decimal 128 位精確的十進位值,28-29 有效位數 (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 0.0M
double 64 位雙精度浮點型 (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 0.0D
float 32 位單精度浮點型 -3.4 x 1038 到 + 3.4 x 1038 0.0F
int 32 位有符號整數類型 -2,147,483,648 到 2,147,483,647 0
long 64 位有符號整數類型 -923,372,036,854,775,808 到 9,223,372,036,854,775,807 0L
sbyte 8 位有符號整數類型 -128 到 127 0
short 16 位有符號整數類型 -32,768 到 32,767 0
uint 32 位無符號整數類型 0 到 4,294,967,295 0
ulong 64 位無符號整數類型 0 到 18,446,744,073,709,551,615 0
ushort 16 位無符號整數類型 0 到 65,535 0

實際上是簡單類型,所有的簡單類型(C# 語言的組成部分)均為 .NET Framework 系統類型的別名。 例如,int 是 System.Int32 的別名。可使用文字初始化簡單類型。 例如,“A”是 char 類型的文字,而 2001 是 int 類型的文字。如需得到一個類型或一個變數在特定平臺上的準確尺寸,可以使用 sizeof 方法。表達式 sizeof(type) 產生以位元組為單位存儲對象或類型的存儲尺寸。下麵舉例獲取任何機器上 int 類型的存儲尺寸:

 1 namespace DataTypeApplication
 2 {
 3    class Program
 4    {
 5       static void Main(string[] args)
 6       {
 7          Console.WriteLine("Size of int: {0}", sizeof(int));
 8          Console.ReadLine();
 9       }
10    }
11 }

當上面的代碼被編譯和執行時,它會產生下列結果:

Size of int: 4

 

 

2、 C# 的 struct

struct(結構)通常用作一小組相關變數的容器,在 C# 中它使得一個單一變數可以存儲各種數據類型的相關數據。struct 關鍵字用於創建結構體,可以按照如下的方式聲明 Person結構:

1 struct Person
2 {
3    public string name;
4    public int age;
5    public string sex;
6 };  

下麵的程式演示了結構的用法:

using System;

namespace MyStruct
{
    struct Person
    {
        public string name;
        public int age;
        public string sex;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person person1;
            person1.name = "張三";
            person1.age = 18;
            person1.sex = "男";

            Person person2;
            person2.name = "李四";
            person2.age = 20;
            person2.sex = "男";

            //輸出 person1 的信息
            Console.WriteLine("person1 姓名:{0}", person1.name);
            Console.WriteLine("person1 性別:{0}", person1.sex);
            Console.WriteLine("person1 年齡:{0}", person1.age);

            //輸出 person2 的信息
            Console.WriteLine("person2 姓名:{0}", person2.name);
            Console.WriteLine("person2 性別:{0}", person2.sex);
            Console.WriteLine("person2 年齡:{0}", person2.age);

            Console.Read();
        }
    }
}

 

當上面的代碼被編譯和執行時,它會產生下列結果:

person1 姓名:張三
person1 性別:男
person1 年齡:18
person2 姓名:李四
person3 性別:男
person4 年齡:20

 

結構與類具有許多相同的語法,但結構比類受到的限制更多:

  • 結構可帶有方法、欄位、索引、屬性、運算符方法和事件。
  • 結構不能聲明預設構造函數(沒有參數的構造函數)或終結器。
  • 結構可以聲明具有參數的構造函數。
  • 一個結構無法繼承自另一個結構或類,並且它不能為類的基類。
  • 結構可實現一個或多個介面。
  • 結構成員不能指定為 abstract、virtual 或 protected。
  • 與類不同,無需使用 new 運算符即可對結構進行實例化。
  • 如果不使用 New 操作符,只有在所有的欄位都被初始化之後,欄位才被賦值,對象才被使用。

多提一下:可將結構類型強制轉換為介面類型,這將導致“裝箱”操作,以將結構包裝在托管堆上的引用類型對象內。 當將值類型傳遞到接受 Object 作為輸入參數的方法時,將發生裝箱操作。詳細的會在後面裝箱和取消裝箱說明。

 

C# 的 enum 

枚舉類型(也稱為枚舉)為定義一組可以賦給變數的命名整數常量提供了一種有效的方法。 例如,假設您必須定義一個變數,該變數的值表示一周中的一天。 該變數只能存儲七個有意義的值。 若要定義這些值,可以使用枚舉類型。枚舉類型是使用 enum 關鍵字聲明的:

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 

 

預設情況下,枚舉中每個元素的基礎類型是 int。 可以使用冒號指定另一種整數值類型,如前面的示例所示。准許使用的類型有 byte、sbyte、short、ushort、int、uint、long 或 ulong。

 

通常情況下,最好是在命名空間內直接定義枚舉,以便該命名空間中的所有類都能夠同樣方便地訪問它。 但是,還可以將枚舉嵌套在類或結構中。
預設情況下,第一個枚舉數的值為 0,後面每個枚舉數的值依次遞增 1。 例如,下麵的枚舉,Sat 是 0,Sun 是 1,Mon 是 2 等。

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

 

 

如下麵的示例所示枚舉數可用初始值來重寫預設值。

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

 在此枚舉中,強制元素序列從 1 而不是 0 開始。 但是,一般建議這樣使用。註,枚舉數的名稱中不能包含空白。

 

如果變數 meetingDay 的類型為 Days,則只能將 Days 定義的某個值賦給它(無需顯式強制轉換)。 如果會議日期更改,可以將 Days 中的新值賦給 meetingDay:

Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;

 可以將任意整數值賦給 meetingDay。 例如,代碼行 meetingDay = (Days) 42 不會產生錯誤。 但也不應該這樣做,因為預設約定的是枚舉變數只容納枚舉定義的值之一。 將任意值賦給枚舉類型的變數很有可能會導致錯誤。
 
下麵的實例演示了枚舉變數的用法:

using System;

namespace MyEnum
{
    class Program
    {
        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.Read();
        }
    }
}

 

當上面的代碼被編譯和執行時,它會產生下列結果:

Monday: 1
Friday: 5

項目源碼下載:https://pan.baidu.com/s/1miOPAdU


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

-Advertisement-
Play Games
更多相關文章
  • 字典的概念 字典是存儲數據的一種方式,與列表和元祖來說更靈活。元祖的局限性:值是無序,不可變的列表的局限性:如果裡面想存儲一個人的名字對應的值時dy,年齡對應的是30。使用一個列表是不行的如下: 1 >>> t=[name="dy",age=30] 2 File "<stdin>", line 1 ...
  • 本文使用python的第三方模塊requests爬取王者榮耀所有英雄的圖片,並將圖片按每個英雄為一個目錄存入文件夾中,方便用作桌面壁紙 下麵時具體的代碼,已通過python3.6測試,可以成功運行: 對於所要爬取的網頁連接可以通過王者榮耀官網找到, 下麵是保存抓取到的圖片的文件夾樣例: 以上就是抓取 ...
  • Object proxy:當前對象,即代理對象!在調用誰的方法! Method method:當前被調用的方法(目標方法) Object[] args:實參! 案例2: ...
  • 示例: 生成命令 person Mac$ javadoc -d . -version -author Person.java 註意Person.java路徑名要正確。 效果: 其中index.html為主頁,打開如下圖: ...
  • 增加的菜單欄效果圖如下: eclipse 中調整到 swt的design視圖下 控制項區域選擇Menu Controls 將Menu Bar拖動到視窗標題欄 將Cascaded Menu拖動到Menu Bar 依次將多個Menu Item加入到New SubMenu Separator是分隔符 也可以 ...
  • 1.1 編程與編程語言 1.1.1 編程語言 電腦的發明,是為了用機器解放人力,而編程的目的則是將人類的思想流程按照某種能夠被電腦識別的表達方式傳遞給電腦,從而達到讓電腦能夠像人腦一樣自動執行的效果。 編程即程式員根據需求把自己的思想流程按照某種編程語言的語法風格編寫下來,產出的結果就是包含 ...
  • 大家好,之前我們介紹了《IDEA環境下GIT操作淺析之一Idea下倉庫初始化與文件提交涉及到的基本命令》和《IDEA環境下GIT操作淺析之二-idea下分支操作相關命令》,本文是第3部分,承接這2篇文章,大家可以點擊回顧,下麵請看本篇正文。 一、本地倉庫初始化與遠程倉庫推送操作 Idea 基本環境配 ...
  • OAuth: OAuth(開放授權)是一個開放標準,允許用戶授權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不需要將用戶名和密碼提供給第三方網站或分享他們數據的所有內容。 QQ登錄OAuth2.0:對於用戶相關的OpenAPI(例如獲取用戶信息,動態同步,照片,日誌,分享等),為了保護用戶數 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...