在生產環境中測試,無水印。
在任何需要的地方都能運行。
獲得 30 天的全功能產品。
在幾分鐘內上手運行。
試用產品期間完全訪問我們的支援工程團隊
在 C# 中編程通常涉及處理不同類型的數據。 有時候,我們需要檢查一個物件
是否屬於某種型別或者嘗試將它轉換成那種型別。 這就是as
運算符關鍵字派上用場的地方。 與其密切相關的is 運算符
一起,有助於類型測試和轉換。 在本教程中,我們將探討此運算子的複雜性及其使用情境。
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)
在上述程式碼中,myObj
是一個 object
類型的物件(C# 中所有類型的基礎類型)。 我們在編譯時不確定其底層類型。使用 as
運算子嘗試把 myObj
當作 string
處理。 如果成功,myStr
將保存該字符串值。 否則,它將保留一個null value
。
雖然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.
顯然,使用 as
運算子通常較為安全,因為可以避免潛在的運行時錯誤。
通常,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
隨著 C# 後來版本中引入模式匹配,is
運算子在類型測試通過時也可以執行某些操作。 這通常減少了使用as
運算符的必要性。
as
運算符在某些特殊情況下非常有價值,其中之一便是使用可空值類型。值類型(如 int
、double
等)不能被賦予 null value
。 但是,通過將它們設置為可空,您可以為它們賦予 null 值。 as
運算子可用於嘗試轉換為可為 null 的值類型:
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?)
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)
在這裡,使用者定義的轉換方法允許將Sample
類型的物件視為string
。
請記住,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
在這裡,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?)
在 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())
在上述程式碼中,arrayObject
是一個物件陣列,但實際上保存的是字串。 使用 as
運算符,您可以安全地嘗試將其視為字串陣列。
as
與LINQ結合語言整合查詢(LINQ - 微軟文檔)是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()
Iron Suite Solutions for C# Developers 是一套高品質工具,能讓 C# 開發人員無縫整合例如 PDF 操作、Excel 處理、光學字元辨識 (OCR) 和條碼生成及讀取等功能。 這些工具,如我們之前討論過的as
和is
運算符,對於提高開發人員在構建穩健應用程式時的效率至關重要。
IronPDF 允許開發者在其 C# 應用程式中生成、操作和讀取 PDF 文件。 考慮到我們主題的相關性,假設您有一個參考類型持有一些資料,並且您想將這些資料轉換成報告或文件。 IronPDF
可以將您的應用程式輸出,以類似類型轉換的方式,翻譯成格式良好的 PDF 文件。
在許多軟體應用中,處理 Excel 文件是一項常見的需求。 IronXL for Excel Operations
提供開發者讀取、編輯和創建 Excel 試算表的能力,而無需依賴 Office Interop。在我們關於類型轉換的討論中,可以將 IronXL
視為一種工具,使您能夠將 C# 中的數據結構或數據庫條目無縫轉換為 Excel 格式。
使用 IronOCR 的光學字符識別
是一個光學字符識別工具,允許開發人員從圖像中讀取和解釋文本。 將此轉至我們的教程,類似於使用高級識別功能將object
(在此例中為圖像)轉換為更具體的類型(string
或文本數據)。
在許多商業應用中,處理條碼是不可或缺的。 IronBarcode Tool for Barcode Processing
協助開發人員在 C# 應用程式中生成、讀取和解碼條碼。 關於我們討論的類型轉換,IronBarcode
可以被看作是一種工具,將視覺條碼數據(一種 object
形式)轉換為更具體、可用的數據類型,例如字串或產品詳細信息。
每個產品在Iron Suite Offerings中都是 C# 提供的靈活性和強大功能的見證,特別是在我們關於類型轉換和類型檢查的討論中。 這些工具,如as
和is
運算符,為開發者提供了高效轉換和處理數據的能力。
如果您正在考慮將任何這些工具整合到您的項目中,值得注意的是每個產品授權起始價格為$749,且每個產品都提供Iron Suite Tools 的免費試用。 對於那些尋求全面解決方案的人而言,Iron Suite
提供了一個吸引人的優惠:你可以以僅僅兩個產品的價格獲得Iron Suite許可證。