调试:Objectreferencenotesettoaninstanceofanobject.
今天调试代码遇到⼀个奇怪的问题,每次调试到 var files = new List<string>()这⼀⾏代码,总是报错:System.NullReferenceException:
'Object reference not set to an instance of an object.'
但是怎么看都没觉得代码有问题,甚⾄把这⾏代码多复制⼏⾏,也只有这⼀⾏代码会出错。
经过研究发现,这个变量List<string> files在后⾯的匿名函数中被使⽤到,⽽我在调试代码的时候,为了⽅便,直接⽤⿏标拖动调试进度,导致跳过了⼀些花括号。这可能会导致匿名函数的作⽤域会有问题。
public static void Star()
{
int i = 1;
i++;
{
var ls = new List<string>();
Func<List<string>, int> f = (ls2) => { return ls2.Count; };
//ls.ForEach((f) =>
//{
// int count = ls.Count;
//});
}
}
⼀段⽰例代码,在i++这打上断点。然后等程序运⾏到i++,继续正常运⾏,则代码不会有问题,如果代码运⾏到i++,⽤⿏标往后拖动进度,跳过花括号,则会报错:'Object reference note set to an instance of an object.'
object to不知道为什么,⽤js的思想理解,这很可能是创建匿名函数的时候,就会创建⼀个闭包,闭包就是保
存了函数的运⾏环境:变量、作⽤域等。在C#中,花括号也是作⽤域,我们拖动进度跳过花括号,可能会导致闭包⽣成的作⽤域与代码定义的不同,所以闭包内的变量ls⽆法从作⽤域中到这个对象,所以就报错了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论