Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止Visual Studio 2015';使调试器无法评估具有副作用的静态属性?_C#_Visual Studio_Debugging_Properties_Side Effects - Fatal编程技术网

C# 如何防止Visual Studio 2015';使调试器无法评估具有副作用的静态属性?

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

我有一个singleton类,lazy在第一次调用属性时创建它的实例(属性副作用)

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;
        }
    }
}