属性 在调试期间鼠标悬停 (DataTip) 后自动实例化
Property autonomously instantiated after mouse hover (DataTip) during debug
大家晚上好。我发生了一件非常奇怪的事情。经过多次测试,我发现,在调试模式下(Visual Studio 2017),鼠标悬停在属性上出现DataTip后,它被独立实例化并设置为空。这是 Visual Studio 中的错误还是发生这种情况的原因?
private List<int> myVar;
public List<int> MyProperty
{
get
{
if (myVar == null)
{
myVar = new List<int>();
return myVar;
}
else
return myVar;
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
List<int> list = MyProperty;
}
如您所见,如果将鼠标放在 myVar 上,您会正确获得 null,但如果将鼠标放在 MyProperty 上,它会自动实例化,并且 myVar 也会立即实例化。
这种行为在调试过程中给我带来了很多问题,我花了很长时间才弄清楚到底发生了什么。这是正常行为还是错误?请注意,我没有提供 set 访问器。
这是正常现象。
MyProperty
的 getter 调用 每次 您尝试获取其值。调试时悬停 也算 。如果你把光标放在myVar
avoiding MyProperty
上,它会是myVar|null
,但是一旦你把它放在MyProperty
上,整个getter 调用,您会看到 MyProperty|Count = 0
。从那时起 myVar
也是 myVar|Count = 0
(因为它在 getter 中发生了变化)。如果您放置一个计数器来了解 getter 调用了多少次,您将看到它是如何变化的。
顺便说一句,
private List<int> myVar;
public List<int> MyProperty => myVar ?? (myVar = new List<int>());
做同样的事情,但看起来更整洁;)
大家晚上好。我发生了一件非常奇怪的事情。经过多次测试,我发现,在调试模式下(Visual Studio 2017),鼠标悬停在属性上出现DataTip后,它被独立实例化并设置为空。这是 Visual Studio 中的错误还是发生这种情况的原因?
private List<int> myVar;
public List<int> MyProperty
{
get
{
if (myVar == null)
{
myVar = new List<int>();
return myVar;
}
else
return myVar;
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
List<int> list = MyProperty;
}
如您所见,如果将鼠标放在 myVar 上,您会正确获得 null,但如果将鼠标放在 MyProperty 上,它会自动实例化,并且 myVar 也会立即实例化。
这是正常现象。
MyProperty
的 getter 调用 每次 您尝试获取其值。调试时悬停 也算 。如果你把光标放在myVar
avoiding MyProperty
上,它会是myVar|null
,但是一旦你把它放在MyProperty
上,整个getter 调用,您会看到 MyProperty|Count = 0
。从那时起 myVar
也是 myVar|Count = 0
(因为它在 getter 中发生了变化)。如果您放置一个计数器来了解 getter 调用了多少次,您将看到它是如何变化的。
顺便说一句,
private List<int> myVar;
public List<int> MyProperty => myVar ?? (myVar = new List<int>());
做同样的事情,但看起来更整洁;)