习惯了在设计器里添加控件的同学们可能和我一样很少用到控件的name属性,甚至网络上的大部分人都认为name属性是不能更改的,某种角度上说,这是个误会~
1. 在窗体的Designer.cs文件中,我们可以看到很多诸如this.Name="Form1";这样的语句;
2. 当使用上一级控件的Controls.Find方法时(如窗体的this.Controls.Find()),会发现它的返回值是一个Control数组,并且有这样的说明:Searches for controls by their System.Windows.Forms.Control.Name property and builds an array of all the controls that match 。
这些都表明,Name属性不仅可以更改,而且可以相同。
但是,仅仅这样就会有很多人头大:为什么一个控件会在被赋予名字之前就可以用名字找到它?如果两个控件名字相同,那程序怎么进行区分?
其实,我们所理解的Name属性,和上面所展示的Name属性,是有本质区别的:
在设计器的属性窗口中,我们会看到Name属性是被括号括起来的,这一对括号是在说明,你看到的Name属性只是表面,在这个属性的背后才是程序真正识别一个控件的东西。这个东西在编译之前的代码中是(Name)属性,在运行的程序中被称为“句柄”。
说白了,就是内存指针。
对于(Name)属性的本质,是一个在编程环境中(如Visual Studio.NET)创建和更改,而无法在代码中更改的东西,它就是你看到的变量,是this.Name中的this,而不是Name。
************************ 华丽的分割线 *************************
这样大家可以在自己的程序中做个试验,尝试更改一个控件的Name属性,并通过这个属性引用它,你会发现,程序运行的时候Name属性和某些控件的Text属性差别很小。
有的同学可能担心,如果Name属性可以相同,那怎么知道通过这个属性找到的控件中,究竟哪一个是我想要的呢?
对于不同类型的控件,在你要找它的时候,你就已经知道答案了:别忘了,C#中的变量都是强类型的。
对于相同类型的控件……你只有避免让这些控件的Name属性相同。
reload note: 2010-05-20 http://blog.renren.com/blog/bp/Qm0pxeS07l