c#里一个关于全局变量和局部变量的问题

danxuezx 2012-04-10 10:45:24
WPF工程:
代码下载

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

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

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

下面是绑定部分的代码:
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;如果放到构造函数里面,如下:
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#我接触不久,请大家多多指点。
...全文
822 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
色拉油 2012-04-10
  • 打赏
  • 举报
回复
霸气[Quote=引用 4 楼 的回复:]

全局变量是整个文件中声明变量的后面全部都可以用这个变量
局部变量,就是在函数中声明的变量,作用域是声明这变量开始,到这个函数结束

你想实现的效果:在textBox1中输入内容textBox2会跟着变化。
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
……
[/Quote]
qldsrx 2012-04-10
  • 打赏
  • 举报
回复
绑定的变量必须是全局的,局部的自然会有问题,其实你这里根本没必要绑定一个对象,直接控件直接绑定就把联系建立好了。
textBox2.SetBinding(TextBox.TextProperty, new Binding("Text") { Source = textBox1 });
samsone 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

LZ想练习WPF的依赖属性和数据绑定吧。先将TextBox1输入的值赋给类Student的Name属性,再取出赋值给TextBox2,并不是单纯的从TextBox1到TextBox2文本值的复制。
另外,WPF是数据驱动不是事件驱动,最好多用Binding,用事件是走WINFORM的老路。
[/Quote]
了解皮毛...看需求来
WPF太耗内存显卡了...这技术还不是很成熟... 也是取代不了WINFORM原因之一...
项目准备改Web
danxuezx 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

楼主分析的基本是对的。
你给Student加个析构方法
~Student()
{

}

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

个人推测,因为依赖属性并不属于某一个特定对象,确切来说,依赖属性是你可以通过某一特定对象 对 一个唯一的 属性值 进行操作。
绑定的时候其实操作的是依赖属性,并不是对象,对象只是用……
[/Quote]
是这样子的,在输入过程中析构函数会被调用,之后就不能同步了。
但是如果不在textBox1中输入数据则析构函数不会被调用。

也就是双击打开exe后放那不管它没见到析构函数被调用。


C#的内存回收是有条件的?不是定期的?

得去了解一下了。。。
铜臂阿铁木 2012-04-10
  • 打赏
  • 举报
回复
双向绑定~
danxuezx 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

楼主分析的基本是对的。
你给Student加个析构方法
~Student()
{

}

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

个人推测,因为依赖属性并不属于某一个特定对象,确切来说,依赖属性是你可以通过某一特定对象 对 一个唯一的 属性值 进行操作。
绑定的时候其实操作的是依赖属性,并不是对象,对象只是用……
[/Quote]
有道理,我加一个析构函数再分析一下。
danxuezx 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

全局变量是整个文件中声明变量的后面全部都可以用这个变量
局部变量,就是在函数中声明的变量,作用域是声明这变量开始,到这个函数结束

你想实现的效果:在textBox1中输入内容textBox2会跟着变化。
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
……
[/Quote]
我在学习WPF依赖属性这块~~
mizuho_2006 2012-04-10
  • 打赏
  • 举报
回复
LZ想练习WPF的依赖属性和数据绑定吧。先将TextBox1输入的值赋给类Student的Name属性,再取出赋值给TextBox2,并不是单纯的从TextBox1到TextBox2文本值的复制。
另外,WPF是数据驱动不是事件驱动,最好多用Binding,用事件是走WINFORM的老路。
cheng2005 2012-04-10
  • 打赏
  • 举报
回复
楼主分析的基本是对的。
你给Student加个析构方法
~Student()
{

}

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

个人推测,因为依赖属性并不属于某一个特定对象,确切来说,依赖属性是你可以通过某一特定对象 对 一个唯一的 属性值 进行操作。
绑定的时候其实操作的是依赖属性,并不是对象,对象只是用来取属性值的一个参数。绑定本身并不强制保留对象
Student stu;
stu = new Student();
stu.SetBinding(Student.NameProperty, new Binding("Text") { Source = textBox1 });
stu作为了绑定的目标,但是这个目标对象不久之后就被释放了,绑定的机制不会考虑这个问题的,因为你不能由于UI上有一个绑定就阻止对象的释放。
samsone 2012-04-10
  • 打赏
  • 举报
回复
全局变量是整个文件中声明变量的后面全部都可以用这个变量
局部变量,就是在函数中声明的变量,作用域是声明这变量开始,到这个函数结束

你想实现的效果:在textBox1中输入内容textBox2会跟着变化。
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
textBox2.Text = textBox1.Text;
}
不就行了么... 干嘛想那么复杂?
问路87 2012-04-10
  • 打赏
  • 举报
回复
很明白啊,一个是在初始化前定义Student,另一个是在初始化过程中实例化Student。
danxuezx 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

牛人解释下,我也不懂
[/Quote]
不知道我问题描述清楚了没~~
仁兄可以下载代码帮忙分析的。。。
问路87 2012-04-10
  • 打赏
  • 举报
回复
牛人解释下,我也不懂
danxuezx 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

楼主分析的基本是对的。
你给Student加个析构方法
~Student()
{

}

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

个人推测,因为依赖属性并不属于某一个特定对象,确切来说,依赖属性是你可以通过某一特定对象 对 一个唯一的 属性值 进行操作。
绑定的时候其实操作的是依赖属性,并不是对象,对象只是用……
[/Quote]
感谢wddw1986的指点,原因就是这样子的。
danxuezx 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

两行足以
XML code

<TextBox Name="txt1"/>
<TextBox Name="txt2" Text="{Binding ElementName=txt1, Path=Text, Mode= OneWay}"/>
[/Quote]
非常感谢您的指点,我是在了解依赖属性,所以才会有这样的代码~~
ohkuy 2012-04-10
  • 打赏
  • 举报
回复
两行足以

<TextBox Name="txt1"/>
<TextBox Name="txt2" Text="{Binding ElementName=txt1, Path=Text, Mode= OneWay}"/>

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧