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

请问如何理解这些基础问题
请先看代码:

C# code
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace BinHuoAsst
{
    public partial class FmMain : Form
    {
        //方法外除了可以申明变量,还可以顺便开new
        Button btn = new Button();
        DataTable dt = new DataTable();
        DataGridView dgv = new DataGridView();

        //btn.Name = "asdf";方法外无法写这样的语句

        public FmMain()   //在方法内可以进行的操作:
        {
            InitializeComponent();

            this.Controls.Add(btn);            //控件的添加
            btn.Location = new Point(10, 10);  //new对象

            this.Controls.Add(dgv);
            dgv.Location = new Point(90, 10);
            btn.ResetText();                   //调用对象的方法
            btn.Text = "Test";                 //访问和设置对象的属性

            dt.Columns.AddRange(new DataColumn[] { new DataColumn(), new DataColumn() });
            dt.Rows.Add("A", "C");
            dt.Rows.Add("B", "A");

            dgv.DataSource = dt;               //绑定数据源

            int v1 = (int)A.a;                 //使用类中的枚举
            int v2 = (int)BinHuoAsst.A.m;      //使用类外但在命名空间内的枚举
            //int v3 = A.x;                    //无法使用无命名空间的同名枚举
            int v4 = (int)B.x;                 //可以使用无命名空间的枚举,但不能与现有内层枚举同名
        }
        enum A { a, b, c };                    //属于类的枚举
    }
    enum A { l, m, n };                        //与类平级的枚举
}
enum A { x, y, z };                            //不处于任何命名空间的枚举,与内层枚举同名
enum B { x, y, z };                            //不处于任何命名空间的枚举,不与内层枚举同名



基础问题:
 
1、如何理解方法外可以new,我所知的new是为对象分配内存空间,那么,在方法内的new,我理解是调用该方法时分配,但在方法外的new,分配的时机是何时?是Main()方法中Application.Run(new FmMain())时开始分配吗?如果是,那么new FmMain()执行的是类FmMain的构造函数,可本例中,这些new不在构造函数里啊?
 
2、枚举相关。分别可以在类中、类外但命名空间内、命名空间外定义枚举(结构体也如此),前两种的定义和使用都好理解,但后一种(即不处于任何命名空间)就超出我的理解了,上述代码可以正常编译,说明C#并没有限定任何东东都应该处在命名空间内,但这样的话,当这样的枚举与内层枚举同名时(例如A),如何使用它?同样,枚举B在其它项目又该如何使用?如果用不了,为什么C#还允许这样来定义?


------解决方案--------------------
第一个问题,在主要位置下断点跟踪一下就知道了,类外的对象实例化是先于该类的构造函数的,就好比你的例子里面btn的构造函数要在FmMain之前执行

至于命名空间
http://msdn.microsoft.com/zh-cn/library/dfb3cx8s(v=vs.80).aspx
看这个吧