接口之间的转换
接口之间的转换
在 C# 中进行转换
在 C# 中,在接口之间进行强制转换的最佳方法是使用 as 运算符。 使用 as 运算符是比直接强制转换更好的编码策略,因为它在转换失败时产生 null 而不是引发异常。
以下代码示例中,第一行是直接转换。 如果您确定所讨论的对象实现了这两个接口,这是一种可接受的做法。 如果对象未实现您尝试获取句柄的接口,.NET 将引发异常。 使用更安全的方式,是 as 运算符,如果对象无法返回【对所需接口的引用】,则返回 null。
[C#]
IGeometry geometry=(IGeometry)point; // Straight cast.
IGeometry geometry=point as IGeometry; // As operator.
以下代码示例显示了,如何在显式强制转换后,管理返回空接口句柄的可能性:
[C#]
IPoint point=new PointClass();
IGeometry geometry=point as IGeometry;
if (geometry != null)
{
Console.WriteLine(geometry.GeometryType.ToString());
}
或者,您可以在执行直接转换之前,使用 is 关键字,测试对象在运行时是否实现了某个接口。 请参见以下代码示例:
[C#]
IPoint point=new PointClass();
if (point is IGeometry)
{
IGeometry geometry=(IGeometry)point;
Console.WriteLine(geometry.GeometryType.ToString());
}
在 VB .NET 中进行转换
以下是类型转换的2种方式:
- 隐式(Implicit) - 不需要额外的语法。
- 显式(Explicit) - 需要强制转换运算符。
请参见以下代码示例:
[VB.NET]
'Implicit cast.
geometry=point
'Explicit cast.
geometry=CType(point, IGeometry)
geometry=DirectCast(point, IGeometry)
geometry=TryCast(point, IGeometry)
在接口之间进行转换时,使用隐式转换是可以接受的,因为在数字类型之间进行转换时,不会丢失数据。 但是,当强制转换失败时,会引发异常 (System.InvalidCastException)。 为避免处理不必要的异常,最好事先测试对象是否实现了这两个接口。 您可以使用 TypeOf 关键字对此进行测试,该关键字是一个【比较子句】,用于测试对象是否派生自或实现特定类型、接口。
以下代码示例,执行了从 IPoint 到 IGeometry 的隐式转换,仅当在运行时才确定 Point 类实现了 IGeometry 时:
[VB.NET]
Dim point As New PointClass
Dim geometry As IGeometry
If TypeOf point Is IGeometry Then
geometry=point
End If
如果您更喜欢使用 Option Strict On 语句来限制隐式转换,请使用 CType 或 DirectCast 函数进行显式强制转换。 以下代码示例,对上一个代码示例进行了显式转换:
[VB.NET]
Dim point As New PointClass
Dim geometry As IGeometry
If TypeOf point Is IGeometry Then
geometry=CType(point, IGeometry)
End If
或者,您可以跳过 TypeOf 比较,并使用 TryCast,它在转换失败时,返回 Nothing。 请参见以下代码示例:
[VB.NET]
Dim point As New PointClass
Dim geometry As IGeometry=TryCast(point, IGeometry)
If geometry IsNot Nothing Then
Console.WriteLine(geometry.GeometryType.ToString())
End If
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?