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对象的属性:)干杯@斯蒂芬·穆克:嗯,我认为应该这样做,但我不知道马蒂解释了什么:)