我有这个界面:
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行?
答案 0 :(得分:12)
如果源无法转换为目标类型,()
强制转换操作符将抛出异常(InvalidCastException)。如果无法完成投射,as
运算符会将结果变量设置为null
。
答案 1 :(得分:3)
我明白,您的使用示例可能有些简化,但我认为值得注意的是,如果您必须在现实生活中做类似的事情 - 那么您可能有一个设计问题。对其实际实现进行转换是不好的做法,应该尽可能避免(通常是可能的)。
如果你绝对需要施放:在你的情况下你应该使用()
运算符。如果你的逻辑中出现错误,as
会将其隐藏并稍后导致NullReferenceException
,这比无效的投射更难跟踪。
答案 2 :(得分:0)
你应该只在知道自己在做什么时施展。使用明确的演员,你说»嘿,伙计!我知道,Object的类型是x,但它确实是y。所以转型不会造成任何伤害。因此,我会投票给as
,因为眼睛更容易 - C#是一种嘈杂的语言。
将传统的施法操作符与括号一起使用,如果猜测错误则抛出异常 - 如此推测,实际上你不知道,你在做什么 - 是半心半意的说“嘿男孩,我知道,什么我在做......噢......哈哈哈,我只是小孩子。
所以,当你想要演员时,就像男人一样!