C# 如何防止Visual Studio 2015';使调试器无法评估具有副作用的静态属性?
我有一个singleton类,lazy在第一次调用属性时创建它的实例(属性副作用)C# 如何防止Visual Studio 2015';使调试器无法评估具有副作用的静态属性?,c#,visual-studio,debugging,properties,side-effects,C#,Visual Studio,Debugging,Properties,Side Effects,我有一个singleton类,lazy在第一次调用属性时创建它的实例(属性副作用) namespace singletontest2 { 使用系统诊断; 使用MySingleton=Singleton; 公共类MyClass { 私有int val=42; 公共MyClass() { } } 公共静态类单例,其中T:new() { 私有静态T; 公共静态bool为空 { 得到 { 返回t==null; } } [DebuggerBrowsable(DebuggerBrowsableState.N
namespace singletontest2
{
使用系统诊断;
使用MySingleton=Singleton;
公共类MyClass
{
私有int val=42;
公共MyClass()
{
}
}
公共静态类单例,其中T:new()
{
私有静态T;
公共静态bool为空
{
得到
{
返回t==null;
}
}
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
公共静态T实例
{
得到
{
如果(t==null)
t=新的t();
返回t;
}
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var a=MySingleton.IsNull;
var d=MySingleton.Instance;
}
}
}
如果我在实例
属性getter和var d
行中放置一个断点,那么当我进入实例
getter时,t
成员将已经初始化
如果我将断点从var d
移动到下一行,那么当我调试到实例
getter中时,t
为空
我的印象是DebuggerBrowsable
属性可以防止这种情况发生,但似乎没有任何区别
但是,如果我使用MySingleton=Singleton消除上面的代码>并调用Singleton.Instance
而不是MySingleton.Instance
,则当我输入实例
getter时,成员t
为null,而不管我想要的是什么DebuggerBrowsable
为什么使用
指令使调试器能够在实际执行代码之前评估该属性?关闭工具->选项->调试->启用属性评估和其他隐式函数调用,如此处所述:“如果我在实例属性getter和var d行中放置一个断点,那么当我进入实例getter时,t成员将已经初始化“--我无法用您提供的代码重现您声称的行为。当我进入实例时,t
的值是null
。由于上面的示例有一个main窗口
类,您未能提供该类的代码,因此,除了您共享的内容之外,您的代码中似乎还有其他内容导致您观察到的问题。请修复该问题,使其包含一个可靠地再现该问题的好代码。(注意:我使用的是VS2017)原始示例代码使用的是默认WPF项目,没有其他代码。我将示例更改为控制台应用程序,而不是WPF项目,但我仍然看到与以前相同的行为。也许这是VS 2015中的一个bug?您是否在手表窗口中的MySingleton.Instance
上设置了手表?@lesscode,而且也是不正确的,因为开发工具明确地涉及到这个主题。请注意,到目前为止只有一次接近票数的投票,所以我不担心这一点。
namespace singletontest2
{
using System.Diagnostics;
using MySingleton = Singleton<MyClass>;
public class MyClass
{
private int val = 42;
public MyClass()
{
}
}
public static class Singleton<T> where T : new()
{
private static T t;
public static bool IsNull
{
get
{
return t == null;
}
}
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
public static T Instance
{
get
{
if (t == null)
t = new T();
return t;
}
}
}
class Program
{
static void Main(string[] args)
{
var a = MySingleton.IsNull;
var d = MySingleton.Instance;
}
}
}