什么是适当的类型转换方式?

4

我有这个界面:

public interface IEntity
{
    int Id{get;set;}
}

一个类:

public class Customer: IEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

这是我的使用方式:

void Main()
{
    List<Customer> list =  new List<Customer>();
    IEntity obj = null;
    obj = new Customer() {Id = 4, Name="Jenny", Age =41};
    list.Add(obj as Customer);  /*Line #1*/     
    list.Add((Customer)obj); /*Line #2*/        
}

哪种被认为是最佳实践:第一行还是第二行?

2
如果您确定对象的类型,可以使用()T。如果不确定,请使用as T并检查是否为NULL。因此,我认为这取决于上下文。另外,顺便说一句,如果您搜索一下,我相信您会在Stack Overflow上找到答案。 - dreza
在 SR 上,关于代码理解的问题是不适合的话题。不过你的第二个问题是有效的 :) - Nikita B
我认为这是一个好问题。我将问题的上下文更改为与主题相关。 - Trae Moore
3个回答

12

()强制类型转换运算符会抛出异常(InvalidCastException),如果源类型无法转换为目标类型。而as运算符则会将结果变量设置为null,如果无法完成类型转换。


3
我明白,你的使用示例可能有些简化,但我认为值得一提的是,如果在现实生活中必须这样做,那么你可能存在设计问题。将接口转换为其实际实现是不好的实践,应尽可能避免(通常是可以避免的)。
如果你绝对必须进行类型转换:在你的情况下,你应该使用()操作符。如果逻辑中存在错误,使用as将隐藏它,并在以后导致NullReferenceException,这比无效转换更难跟踪。

将接口转换为其实际实现 - 这几乎是代码中的异味。特别是在实例化和填充列表时发生这种情况尤为糟糕。这表明存在问题,可能是 a) 设计问题或 b) 对引用类型为对象类型的超类型的工作原理的理解不足。 - radarbob

0

你只应该在知道自己在做什么的情况下进行类型转换。使用显式类型转换,你在说:“嘿伙计!我知道这个对象的类型是x,但实际上它是y。所以转换不会有任何问题。”因此,我会选择as,因为它更容易理解——C#语言本身就很喧闹。

使用传统的带括号的类型转换操作符,如果你的猜测错误就会抛出异常——从而证明你实际上并不知道自己在做什么——就像说:“嘿小伙子,我知道我在做什么...哎呀...哈哈,我只是开玩笑的。”

所以,当你想进行类型转换时,要像个男人一样去做!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接