none
请问如何理解这些基础问题 RRS feed

  • 问题

  • 请先看代码:

    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#还允许这样来定义?

    2012年5月23日 6:20

答案

  • Hi Ah,

    1. 这些实例属性都是在调构造方法之前分配的,当这些属性都分配好后,然后执行构造方法。详见:http://msdn.microsoft.com/en-us/library/k6sa6h87.aspx 

    C# 允许我们在声明一个属性时同时赋予初值。

    2. 当你add这个assembly后,可以用 global::A 来获取。

    Best regards,


    Mike Feng
    MSDN Community Support | Feedback to us
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 ahdung_AI 2012年5月30日 9:45
    2012年5月24日 10:27
    版主

全部回复

  • 吐槽一下:MS论坛的代码呈现器好不专业,连最起码的使用等宽字体都没实现,更别说字体颜色不准、无行号无折叠,MS搞论坛开发的这帮人怎么好意思在MS混啊~,如果我是其中一员,一定觉得自己是滥竽充数,作为MS这么强大的机构居然有这么烂的网站体验
    2012年5月23日 6:30
  • Hi Ah,

    1. 这些实例属性都是在调构造方法之前分配的,当这些属性都分配好后,然后执行构造方法。详见:http://msdn.microsoft.com/en-us/library/k6sa6h87.aspx 

    C# 允许我们在声明一个属性时同时赋予初值。

    2. 当你add这个assembly后,可以用 global::A 来获取。

    Best regards,


    Mike Feng
    MSDN Community Support | Feedback to us
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 ahdung_AI 2012年5月30日 9:45
    2012年5月24日 10:27
    版主
  • 非常感谢Mike,学习了!
    2012年5月30日 9:45