方法

来源:互联网 发布:美国网络mba课程 编辑:程序博客网 时间:2024/05/18 04:58

实例构造器(构造函数)和类(引用类型)

构造器是将实例初始化为良好状态的特殊方法。比如:创建引用类型的对象的时候,首先为对象会分配内存地址,/然后初始化对象的附加字段(类型对象指针和同步块索引)/,然后调用实例构造器来设置对象的初始化状态。
要注意的是

  • 在调用构造函数之前,引用类型的变量的初始值总为0或为Null值
  • 如果父类没有提供无参的构造函数,那么子类必须显示调用一个父类的构造函数
  • `internal struct Point{
  • public Int32 m_x,m_y;
  • public Point(){
    m_x=m_y = 5;
    }
  • }`
    那么如上,即使新建了一个类,两个Point字段中的m_x,m_y都是0,因为他们的构造函数没有被任何对象显示的调用过。

实例构造与值类型

值类型其实不需要定义构造器,C#编译器也根本就不会为值类型内联嵌入默认的无参构造器。

只有嵌套在引用类型的值类型才会被初始化为0或null,如果是基于栈的值类型,那么在读取之前,被要求强制初始化,否则报错。

由于C#不允许值类型定义无参构造函数,所以值类型同样不准内联参数化。(静态字段可以内联初始化,因为是在类型对象里面,而不是实例对象)

且值类型的任何构造函数在初始化的时候,必须对值类型的所有字段都赋值。

对于这么麻烦的设定,当然也有解决的办法:


public struct Troy {
public int a;
public int b;
public Troy(int i) {
this = new Troy();//先初始化所有的字段都为0或null
//初始化自己想玩的字段
a = i;
}
}

类型构造器

首先要了解到,类型构造器实际上就是构造CLR分配内存中的类型对象初始化时用的。

类型构造器是不允许有参数的,当然也就只能定义一个类型构造函数。

实际上类型构造器必须是私有的,甚至不允许显式写上private修饰符,这样做正是为了防止开发人员调用。它的调用总是由CLR负责的。

简单样例:
class Program
{
static void Main(string[] args)
{
Troy obj = new Troy();
}
}
public class Troy
{
static Troy()
{
Console.WriteLine("我就问你6不6?");
Console.ReadKey();
}
}

类的构造函数中的代码只能访问类型的静态字段,所以类的构造函数的常规作用就是用来初始化这些静态字段。例如:
internal sealed class SomeType{
private static Int32 s_x = 5;
}
等同于internal sealed class SomeType{
private static Int32 s_x;
static SomeType(){
s_x = 5;

操作符重载:当编译器看到有+这种操作符时,就会看几个操作数的类型中是否有定义了名为op_Addition这个函数(被编译后的真正的函数名),而且该方法参数兼容于操作数的类型。

所以操作符重载函数中,一定要有一个参数的类型与定于这个重载方法的类型相同:
 public class Troy {
public static int operator +(Troy a, Troy b) {
return 10;
}
}

0 0
原创粉丝点击