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


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


 

C#基礎,目錄

上一篇:4、C#基礎 - C# 的 常見概念簡述

下一篇:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM