C#中new一个对象时,发生了什么事?
摘要:问:当我们new一个对象时,会发生什么事?答:调用该类型的构造函数。问题看似简单,不过事实上,CLR做的比这要多。。。要准确回答这个问题,还要分情况来说。new一个引用类型首先,要实例化一个引用类型,就一定需要在堆上分配内存。要分配内存,就需要先计算出这个引用类型占多大空间,需要给它分配多少内存。那怎么计算呢?简单!只要计算该类型所有字段的长度总和就可以啦。我们知道,引用类型的字段,占一个指针的长度(32位机器上是4个字节,64位机器上是8个字节)。值类型的字段长度可以通过递归的方法计算得出(递归终点是遇到引用类型或基本类型)。根据这些信息,我们就可以轻松计算出所有字段长度的总和了。但是实际上
阅读全文
posted @
2013-02-11 16:44
东溟海
阅读(536)
推荐(0)
C#实例化执行顺序
摘要:前一阵子我参加了一次笔试,其中有一道选择题让我印象深刻,是这样的:实例化一个X类型对象时所执行的顺序:A.调用X类型构造函数,调用X类型基类的构造函数,调用X类型内部字段的构造函数B.调用X类型内部字段的构造函数,调用X类型基类的构造函数,调用X类型构造函数C.调用X类型基类的构造函数,调用X类型构造函数,调用X类型内部字段的构造函数D.调用X类型基类的构造函数,调用X类型内部字段的构造函数,调用X类型构造函数我觉的这道题出得很没水平。在C++的世界里,我会毫不犹豫的选D。但是,由于C#引入了字段初始化器,所以选什么答案完全依赖于类具体是如何设计的。好吧,我们今天就来谈谈C#在类型实例化时都有
阅读全文
posted @
2013-02-11 16:41
东溟海
阅读(795)
推荐(0)
C#中字符串的内存分配与驻留池
摘要:刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例。如下:String s1 = "Hello";String s2 = "Hello"; //s2和s1的实际值都是“Hello”bool same = (object) s1 == (object) s2; //这里比较s1、s2是否引用了同一个对象实例 ...
阅读全文
posted @
2013-02-11 16:38
东溟海
阅读(279)
推荐(0)
C# 实例化类的执行顺序
摘要:先进行细分:类的成员分为:字段、属性、方法、构造方法成员的修饰符:静态成员、实例成员层次结构:父类、子类先不考虑继承关系,执行顺序为:静态字段静态构造方法实例字段实例构造方法属性和方法是在调用的时候才执行,这里就不考虑了。如何理解上面的执行过程?假如让我来设计执行过程,我该如何考虑,依据是什么?首先,静态的东西是大家共享的,也就是相同的。应该先关心共享的东西,再关系个人的东西。“先公后私”,呵呵。其次,实例化之前,应该先初始化自己的内部数据。现在考虑继承关系,执行顺序为:子类的静态字段子类的静态构造方法子类的实例字段父类的静态字段父类的静态构造方法父类的实例字段父类的实例构造方法子类的实例构造
阅读全文
posted @
2013-02-11 16:23
东溟海
阅读(374)
推荐(1)
WinForm窗体事件执行次序
摘要:当 Windows Form 应用程序启动时,会以下列顺序引发主要表单的启动事件: System.Windows.Forms.Control.HandleCreated System.Windows.Forms.Control.BindingContextChanged System.Windows.Forms.Form.Load System.Windows.Forms.Control.VisibleChanged System.Windows.Forms.Form.Activated System.Windows.Forms.Form.Shown 当应用程序关闭时,会以下列顺序引发主要表单
阅读全文
posted @
2013-02-11 14:03
东溟海
阅读(494)
推荐(0)
C#语言规范
摘要:C#语言规范1. 命名规范a) 类【规则1-1】使用Pascal规则命名类名,即首字母要大写。【规则1-2】使用能够反映类功能的名词或名词短语命名类。【规则1-3】不要使用“I”、“C”、“_”等特定含义前缀。【规则1-4】自定义异常类应以Exception结尾。【规则1-5】文件名要能反映类的内容,最好是和类同名。b) 类字段【规则2-1】用camel规则来命名类成员变量名称,即首单词(或单词缩写)小写。【规则2-2】类字段变量名前可加“_”前缀。【规则2-3】坚决禁止在普通变量前加“m_”(这是VC老命名规则)。c)方法【规则3-1】方法名采用Pascal规则,第一个字符要大写。【规则3-
阅读全文
posted @
2012-12-07 15:09
东溟海
阅读(433)
推荐(0)
c# winform 子窗口刷新父窗口数据 (二)
摘要:上次发了委托实现的,有朋友问我另一种方法怎么弄,我就顺便发一份:和上次一样,还是创建两个窗口:MainForm和 SubFormMainForm关键代码如下: private void button1_Click(object sender, EventArgs e) { SubForm subform = new SubForm(this); subform.ShowDialog(); } public void doSomething() { //做点什么 ...
阅读全文
posted @
2012-11-24 18:42
东溟海
阅读(382)
推荐(0)
c# winform 子窗口刷新父窗口数据
摘要:当前的联系项目中用到了这个,在此记录一下,与大家分享~在网上看到有把窗口传过去的,虽说也有效,但为了调用个方法,把整个窗口给创建一次,总觉得有些不好,所以,我选用委托来解决。首先建立两个窗口:MainForm 和 SubFormSubForm 的关键代码如下: public partial class SubForm : Form { public SubForm() { InitializeComponent(); } public delegate void updateParentData(object ...
阅读全文
posted @
2012-11-24 18:20
东溟海
阅读(2435)
推荐(1)