.NET 帮助

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

发布 2023年十一月22日
分享:

在 C# 中编程经常需要处理不同类型的数据。有时,我们需要检查 "对象 "是否属于某种类型,或尝试将其转换为该类型。这就是 as "操作符关键字 就派上用场了。与它的近亲 "是 "运算符一起,"是 "运算符有助于类型测试和转换。在本教程中,我们将探讨该操作符的复杂性及其使用案例。

了解 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 将保存字符串值。否则,它将保存空值

它与明投有何不同?

虽然作为操作符和显式转置的目的相似,但两者有一个关键区别。如果显式转换失败,就会抛出异常。另一方面,如果 "作为 "操作符从一种类型转换到另一种类型的尝试失败,操作符会返回一个 "空值",而不是引发异常。让我们通过下面的代码示例来理解这一点:

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操作符是非常有用的特殊情况之一。值类型 (如 int, double 等。) 不能赋 "空值"。但是,通过使其可为空值,就可以为其赋值。可以使用 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#

参考转换和用户定义转换

作为 "操作符支持两种引用转换 (相关参照类型之间) 和用户定义的转换。用户自定义转换是指在类中使用特殊转换方法定义的转换。

下面是一段用户自定义转换的代码:

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 "操作符不能用于值类型 (除非处理可归零值类型) 或涉及显式方法的用户自定义转换。

作为操作员的高级场景

拳击和开箱,作为

装箱是将值类型实例转换为对象引用的过程。之所以能做到这一点,是因为每个值类型都隐式地继承自一个 对象。框选值类型时,就是将其封装在一个 对象中。

请看下面的代码,它可以实现盒式转换:

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 "被框入一个 "对象 "中。

拆箱是装箱的反向过程,即从对象中提取值类型。操作符 as 可以用来安全地取消值的装箱,尤其是在不确定 对象是否持有您所期望的值类型时。如果解框不成功,表达式结果将为空。

请看下面的开箱转换示例:

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 操作符,可以安全地尝试将其作为字符串数组处理。

Combiningaswith 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()
VB   C#

与 Iron Suite 集成

Iron Suite 是一套高质量的工具,使 C# 开发人员能够无缝集成 PDF 操作、Excel 处理、光学字符识别等功能。 (光学字符识别)以及条形码生成和读取。这些工具,就像我们之前讨论的 "as "和 "is "操作符一样,对于提高开发人员构建强大应用程序的效率至关重要。

IronPDF

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

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

IronXL

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

在许多软件应用程序中,处理 Excel 文件是一项常见要求。 铁XL 为开发人员提供了读取、编辑和创建 Excel 电子表格的能力,而无需依赖 Office Interop。在我们讨论类型转换的背景下,可以将 "IronXL "视为一种工具,它允许您将 C# 中的数据结构或数据库条目无缝转换为 Excel 格式。

IronOCR

C# AS(如何为开发人员工作) 图 3 - IronOCR for .NET:C# OCR 库

IronOCR 是一种光学字符识别工具,允许开发人员从图像中读取和解释文本。将其与我们的教程衔接起来,它类似于将一个 "对象 "转换为 "文本"。 (在这种情况下,图像) 更具体的类型 (字符串或文本数据) 使用先进的识别功能。

IronBarcode

图 4 - IronBarcode for .NET:C# 条码库

在许多商业应用中,处理条形码是必不可少的。 铁条码 帮助开发人员在 C# 应用程序中生成、读取和解码条形码。与我们关于类型转换的讨论相关,"IronBarcode "可被视为一种将可视化条形码数据转换为 (物体) 转化为更具体、更可用的数据类型,如字符串或产品详细信息。

结论

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

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

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

< 前一页
C# 窗体(开发者如何使用)
下一步 >
C# 数据类型(开发人员工作原理)

准备开始了吗? 版本: 2024.9 刚刚发布

免费NuGet下载 总下载量: 10,731,156 查看许可证 >