施法的正确方法是哪种?

时间:2013-08-15 19:17:55

标签: c#

我有这个界面:

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行?

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

我明白,您的使用示例可能有些简化,但我认为值得注意的是,如果您必须在现实生活中做类似的事情 - 那么您可能有一个设计问题。对其实际实现进行转换是不好的做法,应该尽可能避免(通常是可能的)。

如果你绝对需要施放:在你的情况下你应该使用()运算符。如果你的逻辑中出现错误,as会将其隐藏并稍后导致NullReferenceException,这比无效的投射更难跟踪。

答案 2 :(得分:0)

你应该只在知道自己在做什么时施展。使用明确的演员,你说»嘿,伙计!我知道,Object的类型是x,但它确实是y。所以转型不会造成任何伤害。因此,我会投票给as,因为眼睛更容易 - C#是一种嘈杂的语言。

将传统的施法操作符与括号一起使用,如果猜测错误则抛出异常 - 如此推测,实际上你不知道,你在做什么 - 是半心半意的说“嘿男孩,我知道,什么我在做......噢......哈哈哈,我只是小孩子。

所以,当你想要演员时,就像男人一样