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*/        
}

哪个被认为是最佳实践:第 1 行或第 2 行?

4

3 回答 3

12

如果()源无法转换为目标类型,转换运算符将引发异常 (InvalidCastException)。如果无法完成强制转换,as操作员会将结果变量设置为。null

于 2013-08-15T19:31:55.160 回答
3

我确实理解,您的使用示例可能有些简化,但我认为值得一提的是,如果您必须在现实生活中做类似的事情 - 那么您可能遇到了设计问题。将接口转换为其实际实现是不好的做法,应尽可能避免(通常是可能的)。

如果您绝对必须强制转换:在您的情况下,您应该使用()运算符。如果您的逻辑存在错误,则使用as将隐藏它并在NullReferenceException以后导致,这比无效转换更难跟踪。

于 2013-08-16T06:19:07.510 回答
0

只有在知道自己在做什么时才应该施放。使用显式演员表,您是在说 »嘿,伙计!我知道,对象的类型是 x,但它确实是 y。所以转型不会造成任何伤害«。因此我会投赞成票,as因为它看起来更容易 - C# 是一种嘈杂的括号语言。

使用带括号的传统强制转换运算符,如果您的猜测是错误的,则抛出异常 - 如此证明,您实际上不知道,您在做什么 - 就像在说 »嘿男孩,我知道,我在做什么... d'oh ...哈哈哈,我只是在开玩笑«。

所以,当你想施法时,像男人一样去做

于 2013-08-16T23:31:01.097 回答