用于空引用检查的更易读的方式

时间:2012-07-03 17:19:17

标签: c# asp.net-mvc code-readability human-readable

在我编写的很多应用程序中,我发现自己为DBML对象的子类分配了一个默认值。这是我必须要做的当前方式的一个例子:

var viewModel = new RandomViewModel
{
    ContactName = (Order.Customer != null ? Order.Customer.ContactName : "Unknown"),
    Date = Order.OrderDate,
    Shipper = (Order.Shipper != null ? Order.Shipper.CompanyName : "Fedex"),
    ShipCity = Order.ShipCity,
    ShipRegion = Order.ShipRegion,
    FirstCategory = (Order.OrderDetails.First().Product.Category != null
        ? Order.OrderDetails.First().Product.Category.CategoryName
        : "DefaultCategory",
    ItemCount = Order.OrderDetails.Count
};

理想情况下,它最具可读性:

var viewModel = new RandomViewModel
{
    ContactName = Order.Customer.ContactName ?? "Unknown",
    Date = Order.OrderDate,
    Shipper = Order.Shipper.CompanyName ?? "Fedex",
    ShipCity = Order.ShipCity,
    ShipRegion = Order.ShipRegion,
    FirstCategory =
        Order.OrderDetails.First().Product.Category.CategoryName
        ?? "DefaultCategory",
    ItemCount = Order.OrderDetails.Count
};

但是对于任何null的外键控对象都存在NullReferenceException。我不认为null合并在这里是可用的,但是还有其他一些方法来完成这个非常频繁的任务吗?也许有类/方法扩展,甚至VS宏?

我在这个例子中使用了Northwind数据库:

northwind db

对所有建议开放。

2 个答案:

答案 0 :(得分:1)

这是一种可行的方法。声明partial class Order,使用以下属性:

string CustomerNameOrDefault { get { return Customer != null ? Customer.ContactName : "Unknown"; } }

然后您的代码变为:

var viewModel = new RandomViewModel
{
    ContactName = Order.CustomerNameOrDefault,
...

答案 1 :(得分:0)

  

对所有建议开放。

我个人使用AutoMapper在我的域模型和视图模型之间进行映射。您的代码现在可以变为:

RandomViewModel viewModel = Mapper.Map<Order, RandomViewModel>(Order);