c#调试遇到的问题

class Program
    {
        static void Main(string[] args)
        {
            Demo demo1 = new Demo();
        }
    }

public class Demo
    {
        private bool m_Real = false;

        public bool Real
        {
            get { return m_Real; }
            set { m_Real = value; }
        }

        private bool m_Checked = false;

        public bool Checked
        {
            get
            {
                if (!m_Real)
                {
                    m_Real = true;
                    return true;
                }
                return false;
            }
            set { m_Checked = value; }
        }

    }

代码如上所示,如果在调试时构建demo对象后停止,然后用调试器看对象的变量值得话,那么就会看到如下效果:


这显然不是我想要的结果,不过为什么会出现这种情况呢?

因为在查看数据的时候调试器会在取数据的时候把代码执行一遍然后下边这段代码执行了

get
            {
                if (!m_Real)
                {
                    m_Real = true;
                    return true;
                }
                return false;
            }
但是此时你再get里边打断点它是不会停止的,但也确确实实的执行了这块代码。


现在把局部变量窗口关掉,再在调试=》窗口里打开,就会看到如下图


又会执行一遍获取所有属性与字段的代码。这就说明:即使代码没有错误,在调试的时候我所看到的也不一定是我想要的,调试器会执行一段代码,并且不会被断点打住。

(鼠标指上去,局部变量,监视里的打开时都会使调试器执行一遍代码)

那么如果把代码改成如下会怎么样呢?

public class Demo
    {
        

        private bool m_Checked = false;

        public bool Checked
        {
            get
            {
                if (!m_Real)
                {
                    m_Real = true;
                    return true;
                }
                return false;
            }
            set { m_Checked = value; }
        }

        private bool m_Real = false;

        public bool Real
        {
            get { return m_Real; }
            set { m_Real = value; }
        }
        
    }


结果是还是一样的,没有任何变化;这说明调试器去取变量值得时候并不是按顺序的,

那么应该如何解决这个问题呢?我目前的想法如下:

首先:这个代码设计的本身就不合理,在调试时看到的m_Checked和Checked在第一次看的时候不匹配,所以不应该在Checked属性中返回特定的值,无论如何都应该对m_Checked进行返回。

其次:调试器只会在调试查看的时候获取一下属性和字段的值,并不会把方法也执行一遍。


所以代码如下:

public class Demo
    {
        private bool m_Real = false;

        public bool Real
        {
            get { return m_Real; }
            set { m_Real = value; }
        }

        private bool m_Checked = false;

        public bool Checked
        {
            get { return m_Checked; }
            set { m_Checked = value; }
        }

        public bool GetChecked()
        {
            if (!m_Checked)
            {
                m_Real = true;
            }
            return Checked;
        }
    }
使用GetChecked()方法在调试器查看的时候并不会执行,所以也就不会改变m_Real的值,只有在真正代码里(自己想好的位置)获取值得时候才会调用GetChecked改变m_Real的值(注意:这个GetChecked()方法也不能放在属性的Get方法里)。这里既然使用了GetChecked就不要再使用Checked的属性,应该把其注掉,除非你有特殊的用途,否则在一定的情况下会把自己搞迷糊。PS:可以从这理解理解为什么有的类提供Property和GetProperty()


综上所述:不要在属性的Get里边(里边调用方法则接着往里找)对另一个属性或字段进行修改赋值,以免引起不必要的调试麻烦,如果想在取一个属性值得时候改变另一个属性或字段的值,请用方法来做,不要直接在属性的Get里边操作。


以上所述的对于直接执行不会有任何影响,只会影响调试。

猜你喜欢

转载自blog.csdn.net/lihaoef/article/details/50897685