我有一个用户定义的对象类型的静态只读集合,它的初始化如下所示。
private static readonly List<MyClass> obj = new List<MyClass>();
另一个公共实用程序方法填充此集合并将集合返回。
public static List<MyClass> GetMyClasses(){
// some code for DB calls goes here
// in a loop based on recordset, i fill the collection like below
obj.Add(new MyClass(){// my class property settings based on DB values});
// finally return the collection
return obj;
}
我在下一行的“ac”对象上得到“对象引用未设置为对象的实例”。
var cl = TestClass.GetMyClasses().FirstOrDefault(ac => ac.name == "myname")
我想知道为什么 'ac' 对象在这里是 NULL,即使我们的集合是空的,根据 MSDN FirstOrDefault 如果找不到匹配项,它应该为引用类型返回 NULL。
有人可以帮助我了解我在这里缺少什么吗?在今天开始抛出异常之前,相同的代码已经完美运行了几个月。即使在今天,相同的代码在其他服务器上运行良好,没有问题。
出于安全原因,我无法发布整个异常堆栈跟踪,但是它指向下面的 IL 代码
在 System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 源,Func`2 谓词)
使用问题的示例类似代码更新问题。
public static class DemoDataAccess
{
private static readonly List<MyTestClass> classes
= new List<MyTestClass>();
public static IList<MyTestClass> GetMyClasses()
{
using (var cnn = new SqlConnection(@"connection string goes here"))
{
cnn.Open();
using (var cmd = new SqlCommand("SP Name", cnn))
{
cmd.CommandType = CommandType.StoredProcedure;
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
classes.Add(new MyTestClass()
{
Id = Convert.ToInt32(rdr["id"]),
Name = Convert.ToString(rdr["name"])
});
}
}
}
}
return classes;
}
}
public class MyTestClass
{
public int Id { get; set; }
public string Name { get; set; }
}
始终在下面的行上引发异常,并且堆栈跟踪指向“ac”实例。
var obj = DemoDataAccess
.GetMyClasses()
.FirstOrDefault(ac => ac.Name == "something");