.NET 幫助

C# AS(對開發人員的運作方式)

發佈 2023年11月22日
分享:

在 C# 中編程通常涉及處理不同類型的數據。 有時,我們需要檢查一個 object 是否為某種型別,或嘗試將其轉換為該型別。 這就是as 運算子關鍵字派上用場。 與其近親 is 運算符 一樣,幫助進行類型測試和轉換。 在本教程中,我們將探討此運算子的複雜性及其使用情境。

了解 as 運算子

as 運算子的基本概念

C# 中的 as 運算符關鍵字是一個二元運算符,用於在兼容的引用類型或可空類型之間執行某些轉換。以下代碼提供了一個簡單的示範:

object myObj = "Hello, World!";
string myStr = myObj as string;
object myObj = "Hello, World!";
string myStr = myObj as string;
Dim myObj As Object = "Hello, World!"
Dim myStr As String = TryCast(myObj, String)
VB   C#

在上述程式碼中,myObj 是類型為 object 的物件(C#中所有類型的基礎類型). 我們在編譯時不確定其底層類型。as 運算子用於嘗試將 myObj 視為 string。 如果成功,myStr 將保存字串值。 否則,它將持有一個 null 值

怎麼與顯式類型轉換不同?

雖然 as-operator 和顯式轉型具有類似的用途,但存在一個關鍵區別。 如果顯式轉型失敗,將拋出異常。 另一方面,如果 as 運算子的類型轉換嘗試失敗,運算子會返回一個 null 值,而不是拋出異常。 讓我們透過以下程式碼範例來理解這一點:

object someValue = 12345;

// Using explicit cast
string castResult;
try {
    castResult = (string)someValue; // This will throw an exception since the cast fails.
}
catch(Exception ex) {
    castResult = null;
}

// Using the as operator
string asResult = someValue as string; // No exception, but asResult will be null since the cast fails.
object someValue = 12345;

// Using explicit cast
string castResult;
try {
    castResult = (string)someValue; // This will throw an exception since the cast fails.
}
catch(Exception ex) {
    castResult = null;
}

// Using the as operator
string asResult = someValue as string; // No exception, but asResult will be null since the cast fails.
Dim someValue As Object = 12345

' Using explicit cast
Dim castResult As String
Try
	castResult = DirectCast(someValue, String) ' This will throw an exception since the cast fails.
Catch ex As Exception
	castResult = Nothing
End Try

' Using the as operator
Dim asResult As String = TryCast(someValue, String) ' No exception, but asResult will be null since the cast fails.
VB   C#

顯然地,使用 as 運算符通常更安全,因為你可以避免潛在的運行時錯誤。

與 is 運算符的連接

通常,as 運算符is 運算符 一起用於類型測試,以便在嘗試轉換之前進行檢查。 is 運算符 用於檢查提供的物件是否為給定類型,如果是,則返回 true,否則返回 false。

以下代碼範例說明了這一點:

object testObject = "This is a string";

if(testObject is string) {
    string result = testObject as string;
    Console.WriteLine(result);
} else {
    Console.WriteLine("Not a string");
}
object testObject = "This is a string";

if(testObject is string) {
    string result = testObject as string;
    Console.WriteLine(result);
} else {
    Console.WriteLine("Not a string");
}
Dim testObject As Object = "This is a string"

If TypeOf testObject Is String Then
	Dim result As String = TryCast(testObject, String)
	Console.WriteLine(result)
Else
	Console.WriteLine("Not a string")
End If
VB   C#

隨著 C# 的較新版本引入模式匹配,is 運算子在類型測試通過時也可以執行某些操作。 這通常降低了使用 as 運算子的需求。

深入探討 特殊情況與考慮因素

可空值類型轉換

as 運算符在空值類型上特別有用。數值類型(如 intdouble 等。)不能被賦予 null 值。 但是,通過將它們設置為可空,您可以為它們賦予 null 值。 as 運算子可以用於嘗試轉換為可空值類型:

int? nullableInt = 10;
object objInt = nullableInt;
int? resultInt = objInt as int?;
int? nullableInt = 10;
object objInt = nullableInt;
int? resultInt = objInt as int?;
Dim nullableInt? As Integer = 10
Dim objInt As Object = nullableInt
Dim resultInt? As Integer = CType(objInt, Integer?)
VB   C#

引用轉換和用戶定義轉換

as 運算子支持參考轉換(相關引用類型之間)和用戶定義的轉換。 使用者自定義轉換是指在你的類別中使用特殊轉換方法定義的轉換。

考慮以下使用者定義的轉換代碼:

class Sample {
    public static implicit operator string(Sample s) {
        return "Converted to String";
    }
}

Sample sampleObject = new Sample();
string conversionResult = sampleObject as string;
class Sample {
    public static implicit operator string(Sample s) {
        return "Converted to String";
    }
}

Sample sampleObject = new Sample();
string conversionResult = sampleObject as string;
Friend Class Sample
	Public Shared Widening Operator CType(ByVal s As Sample) As String
		Return "Converted to String"
	End Operator
End Class

Private sampleObject As New Sample()
Private conversionResult As String = TryCast(sampleObject, String)
VB   C#

這裡,自定義轉換方法允許將 Sample 類型的物件當作 string 來處理。

當不適用時

請記住,as 運算符無法用於值類型。(除非處理可空值類型)或者使用涉及明確方法的用戶自定義轉換。

使用 as 運算子的進階情境

使用 as 進行裝箱和拆箱

裝箱是將值類型實例轉換為對象引用的過程。 這得以實現是因為每個值類型都隱式地繼承自object。 當你將值類型裝箱時,你會將其包裹在一個 object 中。

考慮以下程式碼進行裝箱轉換:

int intValue = 42;
object boxedValue = intValue;
int intValue = 42;
object boxedValue = intValue;
Dim intValue As Integer = 42
Dim boxedValue As Object = intValue
VB   C#

在這裡,intValue 被封裝到一個 object 中。

拆箱是裝箱的反向過程,即從 object 中提取值類型。 as 運算子可以用於安全地拆箱值,特別是在您不確定 object 是否包含您所期望的值類型時。 如果取消裝箱不成功,表達式結果將為 null。

考慮以下拆箱轉換的範例:

object obj = 42;
int? result = obj as int?;
object obj = 42;
int? result = obj as int?;
Dim obj As Object = 42
Dim result? As Integer = CType(obj, Integer?)
VB   C#

陣列操作

在 C# 中,陣列是參考型別。 有時,您可能需要確定一個 object 是否為特定類型的陣列,然後進行操作。 as 運算符在這裡也有幫助。

請考慮以下程式碼:

object[] arrayObject = new string[] { "one", "two", "three" };
string[] stringArray = arrayObject as string[];
object[] arrayObject = new string[] { "one", "two", "three" };
string[] stringArray = arrayObject as string[];
Dim arrayObject() As Object = New String() { "one", "two", "three" }
Dim stringArray() As String = TryCast(arrayObject, String())
VB   C#

在上面的程式碼中,arrayObject 是一個物件的陣列,但實際上包含字串。 使用 as 運算子,您可以安全地將其視為字串陣列。

as 與 LINQ 結合使用

語言整合查詢(LINQ - Microsoft 文檔)是 C# 中一個強大的功能,允許您以類似 SQL 的方式查詢集合。 有時候,在集合中可能會取得混合類型的物件,並希望過濾出特定類型。在這裡,as 運算符會非常有用。

例如,考慮一個包含字串和整數的物件清單。 如果您想僅檢索字串,可以將 as 運算子與 LINQ 結合使用:

var mixedList = new List<object> { "Hello", 42, "World", 100 };
var stringValues = mixedList
    .Select(item => item as string)
    .Where(item => item != null)
    .ToList();
var mixedList = new List<object> { "Hello", 42, "World", 100 };
var stringValues = mixedList
    .Select(item => item as string)
    .Where(item => item != null)
    .ToList();
Dim mixedList = New List(Of Object) From {"Hello", 42, "World", 100}
Dim stringValues = mixedList.Select(Function(item) TryCast(item, String)).Where(Function(item) item IsNot Nothing).ToList()
VB   C#

整合 Iron Suite

Iron Suite 解決方案適用於 C# 開發人員是一套高品質工具,能夠使C#開發人員無縫整合如PDF操作、Excel處理、光學字符識別等功能。(光學字符識別),條碼生成和讀取。 這些工具,就像我們之前討論的 asis 運算符一樣,在提高開發人員構建強大應用程式的效率方面具有關鍵作用。

IronPDF

C# AS(開發人員指南)圖 1 - IronPDF for .NET:C# 的 PDF 庫

IronPDF 允許開發者在其 C# 應用程式中生成、操作和讀取 PDF 文件。 考慮到我們主題的相關性,假設您有一個參考類型持有一些資料,並且您想將這些資料轉換成報告或文件。 IronPDF 可以將您的應用程式輸出,類似於類型轉換,轉換成格式良好的 PDF 文件。

IronXL

C# 使用(如何對開發者運作)圖 2 - IronXL for .NET:C# Excel 函式庫

在許多軟體應用中,處理 Excel 文件是一項常見的需求。 IronXL 用於 Excel 操作為開發人員提供讀取、編輯和創建Excel電子表格的能力,而無需依賴Office Interop。在我們關於類型轉換的討論中,可以將IronXL視為一個可以讓您將C#中的數據結構或數據庫條目無縫轉換為Excel格式的工具。

IronOCR

C# AS(對開發人員的工作原理)圖 3 - IronOCR for .NET:C# OCR 函式庫

使用 IronOCR 的光學字符識別是一款光學字符識別工具,允許開發者從圖像中讀取和解釋文字。 將此內容與我們的教程聯系起來,就像將一個 object 進行轉換。(在這種情況下,一張圖片)到更具体的类型(string 或文本數據)使用先進的識別能力。

IronBarcode

C# AS(它如何為開發人員運作)圖 4 - IronBarcode for .NET:C# 條碼庫

在許多商業應用中,處理條碼是不可或缺的。 IronBarcode 條形碼處理工具協助開發人員在 C# 應用程式中生成、讀取和解碼條碼。 關於我們關於類型轉換的討論,IronBarcode 可以被視為一個將視覺條碼數據轉換的工具。(object 的一種形式)轉換為更具體、可用的數據類型,例如字串或產品詳細資料。

結論

C# 作為(它如何為開發人員工作)圖 5 - Iron Suite for .NET

每個產品中的Iron Suite 產品提供是 C# 所提供的靈活性和強大功能的明證,特別是在我們討論類型轉換和類型檢查時。 這些工具,如 asis 運算符,為開發人員提供了高效轉換和處理數據的能力。

如果您正在考慮將任何這些工具整合到您的專案中,值得注意的是,每個產品授權均從$749開始,並且每個產品都提供一個Iron Suite Tools 的免費試用. 對於尋找全面解決方案的人而言,Iron Suite 提供了引人注目的方案:您可以獲取 Iron Suite 授權僅需兩款產品的價格。

< 上一頁
C# 表單(對開發人員的運作方式)
下一個 >
C# 資料類型(如何為開發人員工作)

準備開始了嗎? 版本: 2024.12 剛剛發布

免費 NuGet 下載 總下載次數: 11,622,374 查看許可證 >