是否有使用 is 和 as 的理由?
Is there ever a reason to use is versus as?
在考虑 C# 中的 is
与 as
时,您可以使用其中之一来确认一种类型是否可以转换为另一种类型。
// using is
Employee e = new Manager();
if (e is Manager) {
var m = (Manager) e;
// m is now type `Manager`
}
// using as
Employee e = new Manager();
Manager m = e as Manager;
// m is now type `Manager`
if (m != null) {
}
我了解这两个运算符的工作原理以及使用方法。考虑 is
运算符检查类型两次,而 as
检查一次,并且它们都对支持的转换类型有相同的限制,是否有令人信服的理由使用 is
?
标记重复的是问这两个运算符有什么区别。我的问题是专门问"Understanding what both do, why use is
?"他们不是同一个问题,他们的答案也不一样
当目标类型是不可为 null 的值类型时,您必须使用 is
而不是 as
:
object obj = 0;
int i = obj as int; // compilation error because int can't represent null
if (obj is int)
{
int j = (int)obj; // works
}
is
运算符执行类型检查。 as
运算符执行类型检查和(如果可能)强制转换。
is there ever a compelling reason to use is
?
我能想到几个场景。首先,正如 已经指出的那样,您不能转换为不可空值类型。
但是您的原始示例虽然非常常见,但严重偏向 as
。这完全取决于您在转换 and/or 类型检查后要做什么。
假设您将在转换成功时调用以下方法:
private void PerformManagerDuty(Manager m)
{
//Stuff happens
}
执行 as
转换然后空检查比 is
:
多了一行代码
//as casting with null check
var m = e as Manager;
if (m != null)
{
PerformManagerDuty(m);
}
//is check before cast
if (e is Manager)
{
PerformManagerDuty((Manager)e);
}
此外,如果您愿意,在使用 is
执行类型检查后,您可以执行 as
转换而不会损失性能:
if (e is Manager)
{
PerformManagerDuty(e as Manager);
}
在考虑 C# 中的 is
与 as
时,您可以使用其中之一来确认一种类型是否可以转换为另一种类型。
// using is
Employee e = new Manager();
if (e is Manager) {
var m = (Manager) e;
// m is now type `Manager`
}
// using as
Employee e = new Manager();
Manager m = e as Manager;
// m is now type `Manager`
if (m != null) {
}
我了解这两个运算符的工作原理以及使用方法。考虑 is
运算符检查类型两次,而 as
检查一次,并且它们都对支持的转换类型有相同的限制,是否有令人信服的理由使用 is
?
标记重复的是问这两个运算符有什么区别。我的问题是专门问"Understanding what both do, why use is
?"他们不是同一个问题,他们的答案也不一样
当目标类型是不可为 null 的值类型时,您必须使用 is
而不是 as
:
object obj = 0;
int i = obj as int; // compilation error because int can't represent null
if (obj is int)
{
int j = (int)obj; // works
}
is
运算符执行类型检查。 as
运算符执行类型检查和(如果可能)强制转换。
is there ever a compelling reason to use
is
?
我能想到几个场景。首先,正如
但是您的原始示例虽然非常常见,但严重偏向 as
。这完全取决于您在转换 and/or 类型检查后要做什么。
假设您将在转换成功时调用以下方法:
private void PerformManagerDuty(Manager m)
{
//Stuff happens
}
执行 as
转换然后空检查比 is
:
//as casting with null check
var m = e as Manager;
if (m != null)
{
PerformManagerDuty(m);
}
//is check before cast
if (e is Manager)
{
PerformManagerDuty((Manager)e);
}
此外,如果您愿意,在使用 is
执行类型检查后,您可以执行 as
转换而不会损失性能:
if (e is Manager)
{
PerformManagerDuty(e as Manager);
}