在C#中,as
和 强制类型转换(例如 (T)value
)的主要区别在于它们处理类型转换不成功时的行为和适用场景:
Type variable = (Type)expression;
expression
的运行时类型可以安全地转换为目标类型 Type
时,使用强制类型转换。System.InvalidCastException
异常。Type variable = expression as Type;
as
运算符。variable
将被赋值为转换后的新类型实例;如果转换失败,则 variable
将被赋值为 null
(对于引用类型)。null
,所以 as
运算符不能用于从非 null 值类型到其他值类型的转换。object obj = "Hello, World!";
string str = (string)obj; // 此处的强制类型转换是安全的,因为 obj 实际上是一个字符串。
// 或者对于值类型的转换:
int value = 123;
double dblValue = (double)value; // 这是一个合法的数值类型转换。
class Animal { }
class Dog : Animal { }
Animal myAnimal = new Dog();
Dog myDog = myAnimal as Dog; // 此处转换成功,myDog 现在引用了 Dog 类型的对象。
// 如果尝试转换一个实际上是 Animal 类型的对象:
Animal notADog = new Animal();
Dog failedDog = notADog as Dog; // 此处转换失败,failedDog 将被赋值为 null。
// 对于值类型,以下代码无法编译,因为 int 是非 null 值类型:
// int? nullableInt = 123;
// object obj = nullableInt.Value;
// int backToInt = obj as int; // 编译错误,as 不适用于从对象到非 null 值类型的转换。
在这两个例子中,如果使用强制类型转换并且转换不成功,程序会抛出异常。而在使用 as
运算符时,如果转换不成功,则变量会被赋值为 null
(对于引用类型)。
强制转换适合你知道转换一定能成功的情况,并且愿意承担转换失败时引发异常的风险。
python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(41-50)
————————————————
?最后我们放松一下眼睛