類型轉(zhuǎn)換
我們簡單地將值類型分為5種:整數(shù)型,浮點型,布爾型,字符型,再加上一個本屬于引用類型的字符串。
由于 C# 是在編譯時靜態(tài)類型化的,因此變量在聲明后就無法再次聲明,或無法分配另一種類型的值,除非該類型可以隱式轉(zhuǎn)換為變量的類型。
-
隱式轉(zhuǎn)換:由于這種轉(zhuǎn)換始終會成功且不會導致數(shù)據(jù)丟失,因此無需使用任何特殊語法。 示例包括從較小整數(shù)類型到較大整數(shù)類型的轉(zhuǎn)換以及從派生類到基類的轉(zhuǎn)換。
-
顯式轉(zhuǎn)換(強制轉(zhuǎn)換) :必須使用強制轉(zhuǎn)換表達式,才能執(zhí)行顯式轉(zhuǎn)換。 在轉(zhuǎn)換中可能丟失信息時或在出于其他原因轉(zhuǎn)換可能不成功時,必須進行強制轉(zhuǎn)換。 典型的示例包括從數(shù)值到精度較低或范圍較小的類型的轉(zhuǎn)換和從基類實例到派生類的轉(zhuǎn)換。
上述2種轉(zhuǎn)換就不過多贅述,隱式轉(zhuǎn)換和顯式轉(zhuǎn)換都是十分基礎(chǔ)的
-
用戶定義的轉(zhuǎn)換:用戶定義的轉(zhuǎn)換是使用特殊方法執(zhí)行,這些方法可定義為在沒有基類和派生類關(guān)系的自定義類型之間啟用顯式轉(zhuǎn)換和隱式轉(zhuǎn)換。 有關(guān)詳細信息,請參閱用戶定義轉(zhuǎn)換運算符。
-
使用幫助程序類進行轉(zhuǎn)換:若要在非兼容類型(如整數(shù)和 System.DateTime 對象,或十六進制字符串和字節(jié)數(shù)組)之間轉(zhuǎn)換,可使用 System.BitConverter 類、System.Convert 類和內(nèi)置數(shù)值類型的 Parse 方法(如 Int32.Parse)。 有關(guān)詳細信息,請參見如何將字節(jié)數(shù)組轉(zhuǎn)換為 int、如何將字符串轉(zhuǎn)換為數(shù)字和如何在十六進制字符串與數(shù)值類型之間轉(zhuǎn)換。
字符轉(zhuǎn)數(shù)字
GetNumericValue
GetNumericValue是char類型提供的方法,用于將字符轉(zhuǎn)換為double值的數(shù)字,失敗則返回-1.0
令我不解的是,字符類型只能保存0~9之間的數(shù)字,不可能保存浮點數(shù),不知為何返回值是double類型的。
public int a = 123;
char tmp;
tmp = a.ToString()[0];
char.GetNumericValue(tmp);// 使用char提供的GetNumericValue方法可以將char轉(zhuǎn)為double的1
Convert.ToInt32
Convert類型的轉(zhuǎn)換存在大量重載,基本可以應對所有轉(zhuǎn)換情況
public int a = 123;
char tmp;
tmp = a.ToString()[0];
int b =Convert.ToInt32(tmp); // 使用ToInt32會將字符1轉(zhuǎn)為ASCII碼49
隱式轉(zhuǎn)換計算
int a = 123;
char tmp;
tmp = a.ToString()[0];
int t = tmp - '0'; // 使用char類型進行計算,最后的結(jié)果類型是整數(shù)型,輸出結(jié)果是ASCII碼相減
// 49 - 48 = 1
字符串轉(zhuǎn)數(shù)字
字符串轉(zhuǎn)數(shù)字是一種比較萬能的方法,因為object提供了ToString方法,能夠讓任何值類型都轉(zhuǎn)化為字符串。
Parse 或 TryParse 方法
Parse 和 TryParse 方法會忽略字符串開頭和末尾的空格,但所有其他字符都必須是組成合適數(shù)值類型(int、long、ulong、float、decimal 等)的字符。
char tmp = '1';
int a = Int32.Parse(" -105 "); // a = -105,無視空格
a = Int32.Parse(tmp.ToString()); // a = 1
bool b = Int32.TryParse("200", out a); // a = 200,方法本身返回布爾值,b = true
錯誤用法:
Int32.Parse(" -1.05 "); //浮點型不能用整型的Parse方法,應該為float.Parse或其他浮點型的Parse方法
Int32.Parse(" 1 05 "); // 數(shù)字之間不能有空格
Int32.Parse(" 10e1 "); // 不接受科學計數(shù)法,
字節(jié)數(shù)組轉(zhuǎn)整數(shù)
由于一般的整數(shù)類型Int的類型是System.Int32。而一個byte代表8位,所以一個Int32=4個字節(jié),因此如果要字節(jié)轉(zhuǎn)整數(shù),一般需要四個四個地轉(zhuǎn)變。
使用BitConverter類來操作字節(jié)數(shù)組
byte[] bytes = { 0, 0, 0, 25 };
// 此處是根據(jù)操作系統(tǒng)來決定字符順序的
// 不同計算機的字節(jié)體系不同,可能高八位,可能低八位
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
int i = BitConverter.ToInt32(bytes, 0);
Console.WriteLine("int: {0}", i);
// Output: int: 25
as,is強制類型轉(zhuǎn)換
is
is 運算符檢查表達式結(jié)果的運行時類型是否與給定類型兼容。 is 運算符還會對照某個模式測試表達式結(jié)果。
具有類型測試 is 運算符的表達式具有以下形式
E is T
E is not T
其中E
是返回一個值的表達式,T
是類型或類型參數(shù)的名稱。 E
不得為匿名方法或 Lambda 表達式。
簡單的來說,is判斷true對應四種判斷
- 當
E
為T
類型時 - 當為
T
的派生類,子類,繼承類(包括類和接口)時。 - 當
E
為T
的可為空類型T?
,且E
不為空時 - 當
E
到T
的轉(zhuǎn)換涉及裝箱拆箱時
讓我們分別看看這四種對應的判斷:
當E
為T
類型時:
int a = 0;
if (a is int) // true
{
Debug.Log(a);
}
if (a is long) // false
{
Debug.Log(a);
}
當為T
的派生類,子類,繼承類(包括類和接口)時:
class Parent
{
}
interface IDonothing
{
}
class child : Parent, IDonothing
{
}
void Start()
{
child c = new child();
int a = 0;
if (c is Parent) // true
{
Debug.Log(0);
}
if (c is IDonothing) // true
{
Debug.Log(1);
}
}
當E
為T
的可為空類型T?
,且E
不為空時
int? a = null;
if (a is int) // a為int?但為空,false
{
Debug.Log(1);
}
if (a is int?) // a為int?但為空,false
{
Debug.Log(2);
}
int b = 1;
if (b is int) // b為int,true
{
Debug.Log(3);
}
if (b is int?) // b為int,true
{
Debug.Log(4);
}
a = 1;
if (a is int) // a為int?且不為空,true
{
Debug.Log(5);
}
if (a is int?) // a為int?且不為空,true
{
Debug.Log(6);
}
當E
到T
時涉及裝箱拆箱時
object O;
int a = 1;
O = a;
if (O is int) // true
{
Debug.Log(1);
}
if (O is int?) // true
{
Debug.Log(2);
}
if (a is object) // true,畢竟object是所有類的父類,此時符合第二條E為T的派生類
{
Debug.Log(3);
}
在檢測類型時,is類型會對E類型進行T類型轉(zhuǎn)換來判斷是否為T類型,但不對E的本身的類型造成影響。但is類型不會考慮用戶自定義的類型轉(zhuǎn)換。
as
as
運算符將表達式結(jié)果顯式轉(zhuǎn)換為給定的引用或可以為null
值的類型。 如果無法進行轉(zhuǎn)換,則as
運算符返回null
。 與強制轉(zhuǎn)換表達式 不同,as
運算符永遠不會引發(fā)異常。
E as T
使用as運算符,與下述三目運算符是一樣的:
E is T ? (T)(E) : (T)null
使用as
進行轉(zhuǎn)換,其中類型T
必須是可為null
值的類型as
運算符僅考慮引用類型、可以為 null
、裝箱和取消裝箱轉(zhuǎn)換。 不能使用 as
運算符執(zhí)行用戶定義的轉(zhuǎn)換。 為此,請使用強制轉(zhuǎn)換表達式。
object o = new object() as string;
o = "1";
Debug.Log(o.GetType()); // string類型
用戶定義的轉(zhuǎn)換
implicit operator
或 explicit operator
關(guān)鍵字分別用于定義隱式轉(zhuǎn)換或顯式轉(zhuǎn)換。 定義轉(zhuǎn)換的類型必須是該轉(zhuǎn)換的源類型或目標類型。 可用兩種類型中的任何一種類型來定義兩種用戶定義類型之間的轉(zhuǎn)換。文章來源:http://www.zghlxwxcb.cn/news/detail-631804.html
using System;
public readonly struct Digit
{
private readonly byte digit;
public Digit(byte digit)
{
if (digit > 9)
{
throw new ArgumentOutOfRangeException(nameof(digit), "Digit cannot be greater than nine.");
}
this.digit = digit;
}
public static implicit operator byte(Digit d) => d.digit;
public static explicit operator Digit(byte b) => new Digit(b);
public override string ToString() => $"{digit}";
}
public static class UserDefinedConversions
{
public static void Main()
{
var d = new Digit(7);
byte number = d;
Console.WriteLine(number); // output: 7
Digit digit = (Digit)number;
Console.WriteLine(digit); // output: 7
}
}
使用自定義類型可以定義隱式轉(zhuǎn)換和顯示轉(zhuǎn)換,但是要注意類型匹配。文章來源地址http://www.zghlxwxcb.cn/news/detail-631804.html
到了這里,關(guān)于【C#學習筆記】類型轉(zhuǎn)換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!