c#中的对象

 

字段,属性,方法

 

 

对象初始化过程

如果没有继承,顺序如下:

  • 静态变量
  • 静态构造函数
  • 非静态变量
  • 非静态构造函数

 

如果类有基类,那么基类和子类的初始化顺序如下:

  • 继承类静态成员变量初始化
  • 继承类静态构造函数调用
  • 继承类实例变量初始化
  • 基类静态静态成员变量初始化
  • 基类静态构造函数调用
  • 基类实例变量初始化
  • 基类构造方法调用
  • 继承类构造方法调用

 

静态变量和静态属性

类的静态变量和静态属性都是输入真个类的,而不是属于哪个类的实例的。都可以直接用ClassName.field和ClassProperty来访问。

但是类的静态变量和静态属性有什么差别呢?有些地方还是要注意下的。比如,类A有一个public的field(虽然field很少是public的),一个public的属性。每次我们访问A.field得到的都是同一个值吗?每次我们访问A.Property都是同一个值吗?

下面有个例子,大家可以

public class SimpleClass

    {

        public static int staticField = new Random().Next();



        public static int StatidProperty

        {

            get { return new Random().Next(); }

        }



        public static int StaticProperty2

        {

            get { return staticField; }

        }



    }

 

 

public class MyClass

    {

        public void Test()

        {

            int i1 = SimpleClass.StatidProperty;

            Thread.Sleep(2000);

            int i2 = SimpleClass.StatidProperty;



            Console.WriteLine(i1);

            Console.WriteLine(i2);



            Console.WriteLine("--------------");



            int i3 = SimpleClass.staticField;

            Thread.Sleep(2000);

            int i4 = SimpleClass.staticField;



            Console.WriteLine(i3);

            Console.WriteLine(i4);



            Console.WriteLine("-----------");



            int i5 = SimpleClass.StaticProperty2;

            Thread.Sleep(2000);

            int i6 = SimpleClass.StaticProperty2;



            Console.WriteLine(i5);

            Console.WriteLine(i6);

        }

    }

以下是运行结果

------ Test started: Assembly: Castle.DynamicProxy.Demo.dll ------



160653910

1987364442

--------------

160653910

160653910

-----------

160653910

160653910



1 passed, 0 failed, 0 skipped, took 6.15 seconds (Ad hoc).



 

其实很好理解,C#里的属性虽然和字段很类似,但属性的本质是方法。字段在申明时时必须初始化的,如果没有初始化,会给它一个默认值(即default(T),T是字段的类型)。也就是说,静态字段在申明时即确定了。所以上面实例中2次调用静态字段得到的都是同一个值。但是静态属性,我们可以理解为是一个静态方法。2次调用,返回的值是不一样的。

你可能感兴趣的:(C#)