本章描述了一些C#在Web应用程序开发使用的一些特性中的null条件运算符。主要用来对开发中一些空值的管理。
目录
准备工作
创建项目
创建一个简单的模型类,这样就可以使用一些数据。
public class Products
{
public string Name { get; set; }
public decimal? Price { get; set; }
public static Products[] GetProducts()
{
Products steering = new Products
{
Name = "Steering",
Price = 12.5M
};
Products car = new Products
{
Name = "Car",
Price = 654M
};
return new Products[] { steering , car ,null};
}
}
Products类定义了Name和Price属性,有一个名为GetProducts的静态方法返回Products数组,GetProducts方法返回的数组包含一个设置为null的元素。
管理空值运算符
使用null条件运算符
null条件运算符允许更优雅的检测空值,在开发过程中可能回进行很多的空值检查,请求是否包含特定的头或值,或者模型是否包含特定的数据项等等。传统的处理空值需要显式检查。当需要检查对象及其属性时,这种检查可能会有点乏味,并且容易出错。null条件运算符使这个过程更简单,更简洁。
创建控制器和视图
//ProductController 控制器代码
public class ProductController : Controller
{
public ViewResult Index()
{
List<string> result = new List<string>();
foreach (Products p in Products.GetProducts())
{
string name = p?.Name;
decimal? price = p?.Price;
result.Add(string.Format("Name:{0},Price:{1}", name, price));
}
return View(result);
}
}
在Index方法中检查Products对象,以获取Name和Price的列表。问题是数组中的的对象和属性的值都有可能是null,在循环中引用到了p.Name和p.Price,这可能会导致NullReferenceException异常。为避免这种情况,使用null条件运算符。
null运算符就是一个❓(?字符),如果p的值是null,那么名称Name也设置为null,如果p不为null,那么名称就设置为Products.Named的值。Price属性以此类推。有一个需要注意的点是,在使用null条件运算符时,指定的变量能够赋值为空。
@*index视图代码*@
<ul>
@foreach (string s in Model)
{
<li>@s</li>
}
</ul>
![](https://img-blog.csdnimg.cn/83bae7c0163943ad8d6a71c2a8dc6c60.png)
链接null条件运算符
可以链接null条件运算符,在对象层次结构中导航,这样就它就成为简化代码和允许安全导航的有效工具。
在模型类中添加了一个更复杂的对象结构
每个Products对象都有一个相关属性,该属性可能引用到另一个Products对象,在GetProducts方法中为car对象设置了相关属性steering
修改controller方法,链接null条件运算符来导航对象属性,检测嵌套的空值
上图可见,null条件运算符可以运用到属性链的每一个部分,当p.Realted为空时,relatedName变量将为空,否则变量将会被赋值为p.RelatedName的值。
![](https://img-blog.csdnimg.cn/d7aea6668d52494aaa9cfa04b0410156.png)
结合条件运算符和合并运算符
将null条件运算符(一个问号)和null合并运算符(两个问号)结合使用,可以设置回退值,以防在应用程序中使用空值。
修改controller方法,组合null运算符
![](https://img-blog.csdnimg.cn/ba99e76e5f6744f1908c718f86ca2b6d.png)
总结:
null条件运算符确保在浏览对象属性时不会得到NullReferenceException异常,null合并运算符确保在浏览器中显示的结果中不包含空值。