日期:2014-05-18  浏览次数:21001 次

c#里一个关于全局变量和局部变量的问题
WPF工程:
代码下载

此代码是学习自定义依赖属性的示例代码。
背景描述:

界面上有两个textbox,textbox1和textbox2
另外有一个具有依赖属性的类student。
student的Name属性和textBox1绑定,
textBox2和student绑定。

想实现的效果:在textBox1中输入内容textBox2会跟着变化。

下面是绑定部分的代码:
 
C# code
public partial class MainWindow : Window
        {   
                Student stu; //------------------------------------  1                 
                public MainWindow()
                {
                        InitializeComponent();
                        
                        stu = new Student();
                        stu.SetBinding(Student.NameProperty, new Binding("Text") { Source = textBox1 });

                        textBox2.SetBinding(TextBox.TextProperty, new Binding("Name") { Source = stu});
                }

         }

上面这样写没有任何问题,但是上面这段代码标记1处 声明student类对象的这句Student stu;如果放到构造函数里面,如下:
 
C# code
public partial class MainWindow : Window
        {   
                                
                public MainWindow()
                {
                        InitializeComponent();
                        Student stu; //------------------------------------  1 
                        stu = new Student();
                        stu.SetBinding(Student.NameProperty, new Binding("Text") { Source = textBox1 });

                        textBox2.SetBinding(TextBox.TextProperty, new Binding("Name") { Source = stu});
                }

         }


则出现了问题:
运行后在textBox1中输入内容,textBox2中得内容会有10个字符是跟着一起变的,其他的就不变了。截图如下:


目前分析:当Student stu;放到构造函数里面它就是局部变量,在构造函数走完之后它就不复存在了,这样的话在textBox1中输入内容textBox2中应该不会有任何内容才对。
然后我猜想是不是C#里内存自动回收机制搞的鬼?它过一会才把stu释放。如果是这样,那打开exe之后隔段时间再输入textBox2中应该不会有数据才对,但发现textbox2中还是有数据。

目前不知道是什么问题了,请大家帮忙分析一下~~

c#我接触不久,请大家多多指点。

------解决方案--------------------
牛人解释下,我也不懂
------解决方案--------------------
很明白啊,一个是在初始化前定义Student,另一个是在初始化过程中实例化Student。
------解决方案--------------------
全局变量是整个文件中声明变量的后面全部都可以用这个变量
局部变量,就是在函数中声明的变量,作用域是声明这变量开始,到这个函数结束

你想实现的效果:在textBox1中输入内容textBox2会跟着变化。
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
textBox2.Text = textBox1.Text;
}
不就行了么... 干嘛想那么复杂?
------解决方案--------------------
楼主分析的基本是对的。
你给Student加个析构方法
~Student()
{
 
}

运行之后什么都不做,稍等一下就会发现这个对象被释放了。

个人推测,因为依赖属性并不属于某一个特定对象,确切来说,依赖属性是你可以通过某一特定对象 对 一个唯一的 属性值 进行操作。
绑定的时候其实操作的是依赖属性,并不是对象,对象只是用来取属性值的一个参数。绑定本身并不强制保留对象
Student stu;
stu = new Student();
stu.SetBinding(Student.NameProperty, new Binding("Text") { Source = textBox1 });
stu作为了绑定的目标,但是这个目标对象不久之后就被释放了,绑定的机制不会考虑这个问题的,因为你不能由于UI上有一个绑定就阻止对象的释放。
------解决方案--------------------
LZ想练习WPF的依赖属性和数据绑定吧。先将TextBox1输入的值赋给类Student的Name属性,再取出赋值给TextBox2,并不是单纯的从TextBox1到TextBox2文本值的复制。
另外,WPF是数据驱动不是事件驱动,最好多用Binding,用事件是走WINFORM的老路。
------解决方案--------------------
双向绑定~
------解决方案--------------------
探讨

LZ想练习WPF的依赖属性和数据绑定吧。先将TextBox1输入的值赋给类Student的Name属性,再取出赋值给TextBox2,并不是单纯的从TextBox1到TextBox2文本值的复制。
另外,WPF是数据驱动不是事件驱动,最好多用Binding,用事件是走WINFORM的老路。