C#教程4:数据类型
在 C# 教程的這一部分,我們將討論數據類型。
包括電子表格、文本編輯器、計算器或聊天客戶端在內的計算機程序處理數據。處理各種數據類型的工具是現代計算機語言的重要組成部分。數據類型是一組值以及對這些值的允許操作。
一、C# 數據類型
數據類型是一組值,以及對這些值的允許操作。
C# 中的兩種基本數據類型是值類型和引用類型。原始類型(字符串除外)、枚舉、元組和結構都是值類型。類、記錄、字符串、接口、數組和委托都是引用類型。每種類型都有一個默認值。
引用類型是在堆上創建的。引用類型的生命周期由 .NET 框架管理。引用類型的默認值為空引用。賦值給引用類型的變量會創建引用的副本,而不是引用值的副本。
值類型是在堆棧上創建的。生命周期由變量的生命周期決定。對值類型的變量賦值會創建一個被賦值的值的副本。值類型有不同的默認值。例如,布爾默認值為false,十進制為0,字符串為空字符串“”。
二、C# 布爾值
我們的世界存在著二元性。有天地,水火,陰陽,男女,愛恨。在 C# 中,布爾數據類型是具有以下兩個值之一的原始數據類型:真或假。這是一種在計算機程序中非常常見的基本數據類型。
快樂的父母正在等待孩子出生。他們為這兩種可能性選擇了一個名稱。如果是男孩,他們選擇了約翰。如果是女孩,他們選擇了維多利亞。
Program.cs
var random = new Random();bool male = Convert.ToBoolean(random.Next(0, 2));if (male) {Console.WriteLine("We will use name John"); } else {Console.WriteLine("We will use name Victoria"); }該程序使用隨機數生成器來模擬我們的案例。
var random = new Random();我們創建一個用于計算隨機數的隨機對象。它是系統命名空間的一部分。
bool male = Convert.ToBoolean(random.Next(0, 2));Next 方法返回指定范圍內的隨機數。包括下限,不包括上限。換句話說,我們收到 0 或 1。稍后,Convert 方法將這些值轉換為布爾值,將 0 轉換為 false,將 1 轉換為 true。
if (male) {Console.WriteLine("We will use name John"); } else {Console.WriteLine("We will use name Victoria"); }如果男性變量設置為 true,我們選擇名稱 John。否則,我們選擇維多利亞這個名字。 if/else 語句等控制結構使用布爾值。
$ dotnet run We will use name John $ dotnet run We will use name John $ dotnet run We will use name Victoria三、C# 整數
????????整數是實數的子集。它們的書寫沒有分數或小數部分。整數落入集合 Z = {..., -2, -1, 0, 1, 2, ...}。整數是無限的。
????????在計算機語言中,整數是原始數據類型。計算機實際上只能處理整數值的子集,因為計算機的容量是有限的。整數用于對離散實體進行計數。我們可以有 3、4、6 個人,但我們不能有 3.33 個人。我們可以有3.33公斤。
| sbyte | System.SByte | 1 byte | -128 to 127 |
| byte | System.Byte | 1 byte | 0 to 255 |
| short | System.Int16 | 2 bytes | -32,768 to 32,767 |
| ushort | System.UInt16 | 2 bytes | 0 to 65,535 |
| int | System.Int32 | 4 bytes | -2,147,483,648 to 2,147,483,647 |
| uint | System.UInt32 | 4 bytes | 0 to 4,294,967,295 |
| long | System.Int64 | 8 bytes | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
| ulong | System.UInt64 | 8 bytes | 0 to 18,446,744,073,709,551,615 |
????????這些整數類型可以根據我們的需要使用。沒有人,(可能除了一些圣經人物之外)可以超過 120、130 歲。然后我們可以在程序中使用字節類型作為年齡變量。這將節省一些內存。
3.1 離散實體
如果我們使用整數,我們將處理離散實體。我們將使用整數來計算蘋果。
Program.cs
int baskets = 16; int applesInBasket = 24;int total = baskets * applesInBasket;Console.WriteLine($"There are total of {total} apples");在我們的程序中,我們計算蘋果的總數。我們使用乘法運算。
int baskets = 16; int applesInBasket = 24;籃子的數量和每個籃子中的蘋果數量都是整數值。
int total = baskets * applesInBasket;將這些值相乘,我們也得到一個整數。
$ dotnet run There are total of 384 apples3.2 C#?整數符號
????????整數可以在 C# 中以三種不同的表示法指定:十進制、十六進制和二進制。八進制值沒有符號。正如我們所知,通常使用十進制數。十六進制數字以 0x 字符開頭,二進制以 0b 開頭。
????????注意:有些語言還支持八進制表示法; C# 沒有。
Program.cs
int num1 = 31; int num2 = 0x31; int num3 = 0b1101;Console.WriteLine(num1); Console.WriteLine(num2); Console.WriteLine(num3);在程序中,我們用三種不同的符號表示三個整數。
$ dotnet run 31 49 13默認表示法是小數。該程序以十進制顯示這三個數字。
3.3 用下標Using underscores
C# 允許對數字文字使用下劃線字符以提高值的可讀性。
Program.cs
var num1 = 234_321_000; Console.WriteLine(num1);var num2 = 0b_0110_000_100; Console.WriteLine(num2);該程序使用帶有下劃線字符的整數文字來提高值的可讀性。
3.4?算術溢出
????????算術溢出是當計算產生的結果在幅度上大于給定寄存器或存儲位置可以存儲或表示的結果時發生的情況。
Program.cs
byte a = 254;Console.WriteLine(a); a++;Console.WriteLine(a); a++;Console.WriteLine(a); a++;Console.WriteLine(a);在此示例中,我們嘗試分配超出數據類型范圍的值。這會導致算術溢出。
$ dotnet run 254 255 0 1當發生溢出時,變量被重置為數據類型的下限。 (如果是字節類型,則為零。)
使用選中的關鍵字,我們可以在發生溢出時強制執行異常。
Program.cs
checked {byte a = 254;Console.WriteLine(a);a++;Console.WriteLine(a);a++;Console.WriteLine(a);a++;Console.WriteLine(a); }在示例中,語句放置在選中塊的主體中??。
$ dotnet run 254 255 Unhandled Exception: System.OverflowException: Arithmetic operation resulted in an overflow.... 這次拋出 System.OverflowException。四、C# 浮點數
????????浮點數表示計算中的實數。實數衡量連續的數量,如體重、身高或速度。在 C# 中,我們有三種浮點類型:float、double 和decimal。
| float | System.Single | 4 bytes | 7 digits | +-1.5 x 10-45?to +-3.4 x 1038 |
| double | System.Double | 8 bytes | 15-16 digits | +-5.0 x 10-324?to +-1.7 x 10308 |
| decimal | System.Decimal | 16 bytes | 28-29 decimal places | +-1.0 x 10-28?to +-7.9 x 1028 |
上表給出了浮點類型的特征。
默認情況下,C# 程序中的實數是雙精度數。要使用不同的類型,我們必須使用后綴。 F/f 表示浮點數,M/m 表示十進制數。
Program.cs
float n1 = 1.234f; double n2 = 1.234; decimal n3 = 1.234m;Console.WriteLine(n1); Console.WriteLine(n2); Console.WriteLine(n3);Console.WriteLine(n1.GetType()); Console.WriteLine(n2.GetType()); Console.WriteLine(n3.GetType());在上面的程序中,我們為浮點數使用了三種不同的文字符號。
float n1 = 1.234f;The?f?suffix is used for a?float?number.
double n2 = 1.234;如果我們不使用后綴,那么它就是一個雙數。我們可以選擇使用 d 后綴。
Console.WriteLine(n1.GetType());GetType 方法返回數字的類型。
$ dotnet run 1.234 1.234 1.234 System.Single System.Double System.Decimal我們可以使用各種語法來創建浮點值。
Program.cs
float n1 = 1.234f; float n2 = 1.2e-3f; float n3 = (float)1 / 3;Console.WriteLine(n1); Console.WriteLine(n2); Console.WriteLine(n3);????????我們有三種方法來創建浮點值。第一種是使用小數點的“正常”方式。第二個使用科學記數法。最后一個是數值運算的結果。
float n2 = 1.2e-3f;這是浮點數的科學記數法。也稱為指數表示法,它是一種書寫過大或過小的數字而無法方便地以標準十進制表示法書寫的方式。
float n3 = (float) 1 / 3;(float) 構造稱為強制轉換。除法運算默認返回整數。通過強制轉換,我們得到一個浮點數。
$ dotnet run 1.234 0.0012 0.3333333The?float?and?double?types are inexact.
Program.cs
double n1 = 0.1 + 0.1 + 0.1; double n2 = 1 / 3.0;if (n1 == n2) {Console.WriteLine("Numbers are equal"); } else {Console.WriteLine("Numbers are not equal"); }比較浮點值時應謹慎。
$ dotnet run Numbers are not equal100m 短跑運動員跑了 9.87 秒。他的速度是多少公里/小時?
Program.cs
using System;float distance = 0.1f;float time = 9.87f / 3600;float speed = distance / time;Console.WriteLine($"The average speed of a sprinter is {speed} km/h");在此示例中,必須使用浮點值。
float distance = 0.1f;100 m is 0.1 km.
float time = 9.87f / 3600;9.87 s is 9.87/(60*60) h.
float speed = distance / time;為了獲得速度,我們將距離除以時間。
$ dotnet run The average speed of a sprinter is 36.47416 km/h五、C#枚舉
????????枚舉類型(也稱為枚舉或枚舉)是由一組命名值組成的數據類型。可以將已聲明為具有枚舉類型的變量分配為任何枚舉數作為值。枚舉使代碼更具可讀性。
Program.cs
Days day = Days.Monday;if (day == Days.Monday) {Console.WriteLine("It is Monday"); }Console.WriteLine(day);foreach (int i in Enum.GetValues(typeof(Days))) {Console.WriteLine(i); }enum Days {Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday }在我們的代碼示例中,我們為工作日創建了一個枚舉。
enum Days {Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday }枚舉是使用 enum 關鍵字創建的。星期一,星期二,... 裸字存儲實際上數字 0..6。
Days day = Days.Monday;我們有一個名為 day 的變量,它是枚舉類型 Days。它被初始化為星期一。
if (day == Days.Monday) {Console.WriteLine("It is Monday"); }此代碼比將日期變量與某個數字進行比較更具可讀性。
Console.WriteLine(day);此行將星期一打印到控制臺。
foreach (int i in Enum.GetValues(typeof(Days))) {Console.WriteLine(i); }此循環將 0..6 打印到控制臺。我們得到枚舉值的基礎類型。對于計算機,枚舉只是一個數字。 typeof 是用于獲取類型的 System.Type 對象的運算符。 GetValues 方法需要它。此方法返回指定枚舉值的數組。 foreach 關鍵字逐個元素地遍歷數組并將它們打印到終端。
我們進一步使用枚舉。
Program.cs
Seasons s1 = Seasons.Spring; Seasons s2 = Seasons.Autumn;Console.WriteLine(s1); Console.WriteLine(s2);public enum Seasons : byte {Spring = 1,Summer = 2,Autumn = 3,Winter = 4 }季節可以很容易地用作枚舉。我們可以為枚舉指定基礎類型,并且可以為它們提供準確的值。
public enum Seasons : byte {Spring = 1,Summer = 2,Autumn = 3,Winter = 4 }我們使用冒號和數據類型指定枚舉的基礎類型。我們還給每個成員一個特定的編號。
Console.WriteLine(s1); Console.WriteLine(s2);這兩行將枚舉值打印到控制臺。
$ dotnet run Spring Autumn六、C# 元組
????????元組是一個有序的、不可變的異構數據值列表。元組是值類型。元組必須至少包含兩個元素。元組用圓括號定義。
Program.cs
var words = ("sky", "blue", "rock", "fountain");Console.WriteLine(words);Console.WriteLine(words.Item1); Console.WriteLine(words.Item2);var words2 = (w1: "forest", w2: "deep", w3: "sea");Console.WriteLine(words2.w1); Console.WriteLine(words2.w2); Console.WriteLine(words2.w3);在示例中,我們定義了兩個元組。
var words = ("sky", "blue", "rock", "fountain");這是一個未命名的元組定義。
Console.WriteLine(words);我們將元組的所有元素打印到控制臺。
Console.WriteLine(words.Item1); Console.WriteLine(words.Item2);我們打印前兩個元素。我們使用特殊的 Item1、Item2、... 屬性訪問未命名元組的元素。
var words2 = (w1: "forest", w2: "deep", w3: "sea");這是命名元組的定義。
Console.WriteLine(words2.w1); Console.WriteLine(words2.w2); Console.WriteLine(words2.w3);我們通過名稱訪問元素。
$ dotnet run (sky, blue, rock, fountain) sky blue forest deep sea七、記錄C# records
C# 9 引入了記錄。記錄是不可變的引用類型。記錄類型使用基于值的相等性。使用記錄關鍵字創建記錄。
記錄的主要目的是成為數據持有者。
Program.cs
var cars = new List<Car> {new Car("Audi", 52642),new Car("Mercedes", 57127),new Car("Skoda", 9000),new Car("Volvo", 29000),new Car("Bentley", 350000),new Car("Citroen", 21000),new Car("Hummer", 41400),new Car("Volkswagen", 21600) };var res = from car in carswhere car.Price > 30000 && car.Price < 100000select new { car.Name, car.Price };foreach (var car in res) {Console.WriteLine($"{car.Name} {car.Price}"); }record Car(string Name, int Price);在示例中,我們使用 LINQ 過濾汽車對象列表。我們包括價格在 30000 到 100000 之間的所有汽車。語言集成查詢 (LINQ) 位于 System.Linq 命名空間中,該命名空間包含在隱式使用中。
record Car(string Name, int Price);A car is a?record?type.
$ dotnet run Audi 52642 Mercedes 57127 Hummer 41400八、C# 字符串和字節
????????字符串是一種數據類型,表示計算機程序中的文本數據。 C# 中的字符串是 Unicode 字符序列。 char 是單個 Unicode 字符。字符串用雙引號括起來。
Program.cs
string word = "ZetCode";char c = word[0];Console.WriteLine(c);程序將“Z”字符打印到終端。
string word = "ZetCode";在這里,我們創建一個字符串變量并為其分配“ZetCode”值。
char c = word[0];字符串是 Unicode 字符數組。我們可以使用數組訪問表示法從字符串中獲取特定字符。方括號內的數字是字符數組的索引。索引從零開始計數。這意味著第一個字符的索引為 0。
$ dotnet run Z九、C# 數組
數組是處理元素集合的復雜數據類型。每個元素都可以通過索引訪問。數組的所有元素必須具有相同的數據類型。
Program.cs
int[] numbers = new int[5];numbers[0] = 3; numbers[1] = 2; numbers[2] = 1; numbers[3] = 5; numbers[4] = 6;int len = numbers.Length;for (int i = 0; i < len; i++) {Console.WriteLine(numbers[i]); }在這個例子中,我們聲明一個數組,用數據填充它,然后將數組的內容打印到控制臺。
int[] numbers = new int[5];我們聲明了一個整數數組,它最多可以存儲五個整數。所以我們有一個由五個元素組成的數組,索引為 0..4。
numbers[0] = 3; numbers[1] = 2; numbers[2] = 1; numbers[3] = 5; numbers[4] = 6;在這里,我們將值分配給創建的數組。我們可以通過數組訪問表示法訪問數組的元素。它由后跟方括號的數組名稱組成。在括號內,我們指定我們想要的元素的索引。
int len = numbers.Length;每個數組都有一個 Length 屬性,它返回數組中元素的數量。
for (int i=0; i<len; i++) {Console.WriteLine(numbers[i]); }我們遍歷數組并將數據打印到控制臺。
十、C#日期和時間
DateTime 是一種值類型。它表示時間的瞬間,通常表示為一天中的日期和時間。
Program.cs
DateTime now = DateTime.Now;System.Console.WriteLine(now); System.Console.WriteLine(now.ToShortDateString()); System.Console.WriteLine(now.ToShortTimeString());我們以三種不同的格式顯示今天的日期:日期和時間、日期和時間。
DateTime now = DateTime.Now;獲取一個 DateTime 對象,該對象設置為此計算機上的當前日期和時間,以本地時間表示。
System.Console.WriteLine(now);此行以完整格式打印日期。
System.Console.WriteLine(now.ToShortDateString()); System.Console.WriteLine(now.ToShortTimeString());ToShortDateString 返回短日期字符串格式,ToShortTimeString 返回短時間字符串格式。
$ dotnet run 12/15/2021 7:58:51 PM 12/15/2021 7:58 PM十一、C# 類型轉化
????????我們經常同時處理多種數據類型。將一種數據類型轉換為另一種數據類型是編程中的一項常見工作。類型轉換或類型轉換是指將一種數據類型的實體更改為另一種數據類型。有兩種類型的轉換:隱式和顯式。隱式類型轉換,也稱為強制轉換,是編譯器自動進行的類型轉換。
Program.cs
int val1 = 0; byte val2 = 15;val1 = val2;Console.WriteLine(val1.GetType()); Console.WriteLine(val2.GetType());Console.WriteLine(12 + 12.5); Console.WriteLine("12" + 12);在這個例子中,我們有幾個隱式轉換。
val1 = val2;????????在這里,我們使用兩種不同的類型:int 和 byte。我們將一個字節值分配給一個整數值。這是一個加寬操作。 int 值有四個字節;字節值只有一個字節。允許擴大轉化。如果我們想將一個 int 分配給一個字節,這將是一個縮短轉換。
????????C# 編譯器不允許隱式縮短轉換。這是因為在隱式縮短轉換中,我們可能會無意中降低精度。我們可以進行縮短轉換,但我們必須通知編譯器。我們知道我們在做什么。它可以通過顯式轉換來完成。
Console.WriteLine(12 + 12.5);我們添加兩個值:一個整數和一個浮點值。結果是一個浮點值。這是一個擴大的隱式轉換。
Console.WriteLine("12" + 12);結果是 1212。??一個整數被轉換為一個字符串,兩個字符串被連接起來。
接下來,我們將展示 C# 中的一些顯式轉換。
Program.cs
double b = 13.5;float a = (float) b; float c = (int) a;Console.WriteLine(a); Console.WriteLine(b); Console.WriteLine(c);我們有三個價值觀。我們對這些值進行了一些顯式轉換。
float a = (float) b;我們將雙精度值轉換為浮點值。通過在兩個圓括號之間指定預期類型來完成顯式轉換。在這種情況下,不會丟失任何精度。數字 13.5 可以安全地分配給這兩種類型。
float c = (int) a;我們將浮點值轉換為整數值。在這個語句中,我們失去了一些精度:13.5 變成了 13。
$ dotnet run 13.5 13.5 13十二、C# 可為空數變量
????????不能為值類型分配 null 文字,引用類型可以。使用數據庫的應用程序處理空值。因此,在 C# 語言中引入了特殊的可為空類型。可空類型是 System.Nullable<T> 結構的實例。
Program.cs
Nullable<bool> male = null; int? age = null;Console.WriteLine(male.HasValue); Console.WriteLine(age.HasValue);一個演示可空類型的簡單示例。
Nullable<bool> male = null; int? age = null;????????有兩種方法可以聲明可空類型。可以使用 Nullable<T> 泛型結構,其中類型在尖括號之間指定,或者我們可以在類型后使用問號。后者實際上是第一個符號的簡寫。
$ dotnet run False False十三、C#?轉換和解析方法
有兩組用于轉換值的方法。
Program.cs
Console.WriteLine(Convert.ToBoolean(0.3)); Console.WriteLine(Convert.ToBoolean(3)); Console.WriteLine(Convert.ToBoolean(0)); Console.WriteLine(Convert.ToBoolean(-1));Console.WriteLine(Convert.ToInt32("452")); Console.WriteLine(Convert.ToInt32(34.5));Convert 類有許多用于轉換值的方法。我們使用其中的兩個。
Console.WriteLine(Convert.ToBoolean(0.3));We convert a?double?value to a?bool?value.
Console.WriteLine(Convert.ToInt32("452"));And here we convert a?string?to an?int.
$ dotnet run True True False True 452 34Program.cs
Console.WriteLine(int.Parse("34")); Console.WriteLine(int.Parse("-34")); Console.WriteLine(int.Parse("+34"));????????將字符串轉換為整數是一項非常常見的任務。當我們從數據庫或 GUI 組件中獲取值時,我們經常進行此類轉換。
Console.WriteLine(int.Parse("34"));我們使用 int 的 Parse 方法將字符串轉換為 int 值。
$ dotnet run 34 -34 34總結
以上是生活随笔為你收集整理的C#教程4:数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#教程3:基本语言结构
- 下一篇: C#教程5:操作算子(1)