.NET 帮助

C# AS(开发人员是如何工作的)

C# 编程经常涉及不同类型的数据。 有时,我们需要检查一个object是否为某种类型或尝试将其转换为那种类型。 这就是as运算符关键字派上用场的地方。 与其近亲一起,is operator在类型测试和转换中起作用。 在本教程中,我们将探讨该操作符的复杂性及其使用案例。

了解 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)
$vbLabelText   $csharpLabel

在上面的代码中,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.
$vbLabelText   $csharpLabel

显然,使用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
$vbLabelText   $csharpLabel

随着在 C# 后续版本中引入模式匹配,is 运算符在类型测试通过时也可以执行某些操作。 这通常减少了使用as运算符的需要。

深入探讨特殊情况和考虑因素

可空值类型转换

一个特殊情况下,as 操作符是非常有价值的,那就是在处理可空值类型时。值类型(例如 intdouble 等)不能被赋予一个 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?)
$vbLabelText   $csharpLabel

参考转换和用户自定义转换

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)
$vbLabelText   $csharpLabel

在这里,用户定义的转换方法允许类型为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
$vbLabelText   $csharpLabel

在这里,intValue 被装箱为 object

取消封装是封装的反向过程,即从object中提取值类型。 as 操作符可以用于安全地拆箱值,尤其是在你不确定 object 是否包含你期望的值类型时。 如果开箱不成功,表达结果将为空。

请参考以下开箱转换示例:

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?)
$vbLabelText   $csharpLabel

使用数组

数组是 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())
$vbLabelText   $csharpLabel

在上述代码中,arrayObject是一个对象数组,但实际上存储的是字符串。 使用as运算符,您可以安全地尝试将其视为字符串数组。

as与LINQ结合使用

语言集成查询(LINQ - Microsoft Documentation)是C#中的一个强大功能,它允许您以类似SQL的方式查询集合。 有时候,你可能会在集合中检索到不同类型的对象,并希望过滤出特定类型。在这里,as 运算符会非常有用。

例如,考虑一个包含字符串和整数的对象列表。 如果您只想检索字符串,可以结合 LINQ 使用 as 运算符:

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()
$vbLabelText   $csharpLabel

与 Iron Suite 集成

Iron Suite Solutions for C# Developers 是一套高质量的工具,能够让C#开发人员无缝集成诸如PDF操作、Excel处理、光学字符识别(OCR)以及条形码生成和读取等功能。 这些工具,如我们之前讨论过的asis运算符,对于提高开发人员在构建强大应用程序时的效率至关重要。

IronPDF

C# AS(开发人员如何使用)图 1 - IronPDF for .NET: C# PDF 库

IronPdf 允许开发人员在其 C# 应用程序中生成、处理和读取 PDF 文件。 考虑到与我们主题的相关性,假设您有一个包含某些数据的参考类型,您想将这些数据转换为报告或文档。 IronPDF 能够将您的应用程序输出,以类似于类型转换的方式,转化为格式良好的 PDF 文档。

IronXL

C# AS (它如何为开发者工作) 图2 - IronXL for .NET: C# Excel 库

处理 Excel 文件是许多软件应用程序中的常见要求。 IronXL for Excel Operations 为开发人员提供了读取、编辑和创建 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# 条形码库

在许多商业应用中,处理 BarCode 是不可或缺的。 IronBarcode Tool for Barcode Processing 协助开发者在 C# 应用程序中生成、读取和解码条形码。 关于我们讨论的类型转换,IronBarcode可以被视为一种工具,可以将可视条形码数据(一种object形式)转换为更具体、可用的数据类型,例如字符串或产品详细信息。

结论

C# AS(它如何为开发人员工作)图5 - Iron Suite for .NET

Iron Suite 产品中的每个产品都是 C# 灵活性和强大功能的证明,尤其是在我们讨论类型转换和类型检查时。 这些工具,例如asis运算符,为开发人员提供了高效转换和处理数据的能力。

如果您正在考虑将这些工具集成到您的项目中,值得注意的是,每个产品许可证起价为$749,每个产品都提供Iron Suite工具的免费试用。 对于寻求全面解决方案的人士,Iron Suite 提供了一个诱人的优惠:您可以以仅仅两个产品的价格获取 Iron Suite 许可证

Chipego
软件工程师
Chipego 拥有出色的倾听技巧,这帮助他理解客户问题并提供智能解决方案。他在 2023 年加入 Iron Software 团队,此前他获得了信息技术学士学位。IronPDF 和 IronOCR 是 Chipego 主要专注的两个产品,但他对所有产品的了解每天都在增长,因为他不断找到支持客户的新方法。他喜欢 Iron Software 的合作氛围,公司各地的团队成员贡献他们丰富的经验,以提供有效的创新解决方案。当 Chipego 离开办公桌时,你经常可以发现他在看书或踢足球。
< 前一页
C# 窗体(开发者如何使用)
下一步 >
C# 数据类型(开发人员工作原理)