C# 对空变量的引用是否应引发异常
下面的查询由多个C# 对空变量的引用是否应引发异常,c#,linq,exception,C#,Linq,Exception,下面的查询由多个内部联接子句组成 Student表中有许多外键,它们在查询中被名称替换。我正在使用下面的左外部联接查询。请注意Students中的MarkID可以null。这意味着marksGroup.DefaultifEmpty()也可能返回null。因此,如果我只放置m而不是m!=无效的m、 MarkName:“--Not marked--”在最后一行中,当m为空时,代码IMO应该引发异常,因为我引用的是这个变量,但它没有。在我构建此查询的示例上,编译器引发了异常。请参阅代码: var re
内部联接
子句组成
Student
表中有许多外键,它们在查询中被名称替换。我正在使用下面的左外部联接
查询。请注意Students
中的MarkID
可以null
。这意味着marksGroup.DefaultifEmpty()
也可能返回null
。因此,如果我只放置m
而不是m!=无效的m、 MarkName:“--Not marked--”
在最后一行中,当m
为空时,代码IMO应该引发异常,因为我引用的是这个变量,但它没有。在我构建此查询的示例上,编译器引发了异常。请参阅代码:
var result = from st in dbContext.Students where st.DepartmentID == 17
join d in dbContext.Departments on st.DepartmentID equals d.DepartmentID
join sv in dbContext.SoftwareVersions on st.SoftwareVersionID equals sv.SoftwareVersionID
join stat in dbContext.Statuses on st.StatusID equals stat.StatusID
join m in dbContext.Marks on st.MarkID equals m.MarkID into marksGroup
from m in marksGroup.DefaultIfEmpty()
select new
{
student = st.StudentName,
department = p.DepartmentName,
software = sv.SoftwareVersionName,
status = st.StatusName,
marked = m != null ? m.MarkName : "-- Not marked --"
};
我错过了什么。对于C#和LINQ而言,我仍然是初学者。当您对SQL后端执行LINQ语句时(我假设您在这里有实体框架),整个语句将转换为SQL并由数据库引擎执行 这就是.Net运行时所做的:
- 将语句(这是一个
)转换为SQL表达式
- 通过ADO.Net将SQL发送到数据库
- 接收SQL结果集(本质上是一个行数组,其中一行本身就是一个值数组)
- 从这些行创建对象
select new
{
student = st.StudentName,
department = p.DepartmentName,
software = sv.SoftwareVersionName,
status = st.StatusName,
marked = m.MarkName
}
Net运行时只关心创建匿名类型的实例,并从结果集中的一行设置其属性。在某些行中,标记的的值可能是null
,因此该特定对象中标记的将设置为null
。Net运行时没有处理那里的MarksGroup
对象
当然,在LINQ中,这与对象完全不同。空检查对于防止空对象引用是绝对必要的。[…]如果我只放m[…]
。引用对象不会引发异常。但是,对其执行任何操作都将抛出一个。也就是说,尝试调用方法或属性。例如,marked=m
不应引发任何异常,您只是在引用对象<但是,如果m==null
,则code>marked=m.MarkName
应引发NullReferenceException。您的意思是您认为marked=m
应引发异常吗?@MatiCicero感谢Mati。这就是我和这个例子之间的区别。我又看了一遍示例代码,作者确实试图引用null对象的属性:)干杯@斯蒂芬·穆克:嗯,我认为应该这样做,但我不知道马蒂解释了什么:)