C#高级编程笔记 Day 2, 二〇一六年7月 31日 构造函数

1、构造函数:

  实例构造函数(只要创建了对象,就会执行)一般采取 this
关键字区分成员字段和同名的参数。能够把构造函数定义为private 或 protected
。那样不相干的类也无法访问他们。

1 public class MyTest{
2   private int i;
3   public MyTest(int i){
4     this.i=i;
5   }
6 }

  上边那些例子没有为MyTest
定义任何国有的或受保证的构造函数。那就使MyTest不可能运用new
运算符在外部代码中实例化(但可以在MyNumber中编辑一个国有的静态属性或格局,以实例化该类)这在上边三种意况下是实惠的。

  • 类仅作为某些静态成员或性质的容器,由此永远不会实例化它
  • 瞩望类仅经过某个静态成员函数来实例化(那就是所谓的靶子实例化的类工厂方法?)

    public class MyTest{
    private int i;
    private Mytest(int i){

    this.i=i;
    

    }
    }

  静态构造函数:编辑静态构造函数的一个缘故是,类有局部静态字段或品质须要在首先次使用类从前,从表面源中初阶化这一个静态字段和质量。

         在C#中,平时在首先次调用类的其它成员从前实施静态构造函数。

         静态构造函数没有其余访问修饰符,在加载类时,由 .Net
运行库调用它。静态构造函数不可以带任何参数,一个类只能够有一个静态构造函数。

         !!无参数的实例构造函数与静态构造函数可以在同一个类中定义。

2、

1 public static readonly Color BackColor;

该静态变量在静态构造函数中举办开头化,把该字段申明为只读类型表示其值只能够在构造函数中装置。

 

3、在一个类中差异构造函数之间的互相调用。通过 this
关键词来开展调用,假使要平素对基类(父类)的构造函数举行调用,则需求采取
base 代替 this

public Car(string description,uint nwheels){
    this.desprtion=desption;
    this.nwheels=nwheels;
}

public Car(string description):this(description,4){
//
}

 

4、只读字段:readonly 可以在构造函数中给其赋值,无法在其他地点。

5、【归咎实用】结构 struct :结构是值类型,不是援引类型。存储在栈中或存储为内联。

  ① 不协理继承

  ② 对于社团构造函数,编译器总是提供一个无参数的默许构造函数。  

  ③ 结构是值类型,因为社团是值类型,所以 new
运算符与类和其它引用类型的干活方式各异。new
运算符并不分红堆中的内存。而是只调用相应的构造函数,根据传送给它的参数。初叶化所有字段。

  ④ 结构主要用于小的数据结构。但当把结构作为参数传递给艺术时,应把它当作
ref 参数传递,以幸免质量损失,此时只传递了社团在内存中的地址。

  ⑤ 结构中禁止使用无参数的构造函数。

  ★ 结构的继承链是:每个协会派生自System.ValueType类。
System.ValueType 又派生自 System.Object 

  ★ 不可以为结构提供其余基类,每个协会都派生自 ValueType。

struct Dimension{
    public double Length=1;
    public double width=2;
}
//编译错误:
//默认构造函数把数值字段都初始化为 0 ,把引用类型初始化为 null 且总是隐式的给出。 
//提供字段的初始值也不能绕过默认构造函数。

 

6、【专题:C#中堆和栈的敞亮】

  Ⅰ:栈是编译时期就分配好的内存空间,因而你的代码中务必就栈的尺寸有明确的定义;

    堆是程序运行时期动态分配的内存空间你可以依据程序的运作意况确定要分配的堆内存大小。

  Ⅱ:存放在栈中时要管存储顺序,保持着先进后出的原则,栈是一片延续的内存域,由系统自动分配和掩护。

    堆是无序的,一片不总是的内存域,由用户自己来支配和自由,若用户不自由的话,当内存达到自然的特定值时,通过垃圾回收器GC
来回收。

  【值类型和指针总是放在它们被声称的地点,不自然被分配在栈上】

  调用方法:系统先将一段编码(堆的首部地点)放到栈上,紧接着放置方式的参数。然后代码执行到方法时,查找栈中放该堆首部地点所有参数。并透过堆的首部地方来决定堆。

  【引用类型:总是放在堆中】

  当大家运用引用类型时,实际上只是在处理该品种的指针,而引用类型我。使用值类型的话,则是动用其自己

1 //Code1:
2 public in AddTest(int value){
3     int result;
4     result=value+5;
5     return result;
6 }

图片 1

//Code2:
public class MyTest{
    public int value;
}
public MyTest AddTest(int key){
     MyInt result =new MyInt();
     result.value=key+5;
     return result;
}

  C#次第在 CLR 上运行时,内存从逻辑上划分两大块 栈和堆。

 

  Ⅲ、栈和堆的界别。

    ①、栈通常保存着大家代码执行的步子,比如在 Code 1 中的 AddTest()
方法。  int value ,int result 变量等。

      堆上存放的多是目的和数码。

    ②、栈内存无需大家管理,也不受GC
管理。当栈顶元素运用达成,立马释放。

      堆则必要GC 清理。

  当程序执行的时候,在堆和栈中分配的最主要有以下四连串型, 

  1、值类型 。2、引用类型。 3、指针 。4、指令。

7、弱引用
:弱引用允许创制和采纳对象,可是垃圾回收器运行时,就会回收对象并释放内存。

  WeakReference 类。

  例: WeakReference mathReference =new WeakReference(new MathTest());

 

8、部分类:partial 关键字允许把类、结构、方法 或接口放在三个文件中。

9、继承:落成延续和接口继承。

    不帮助多重落实连续允许多重接口继承

C#中的类可以派生自另一个类和随机七个接口。

10、【结构和类的区分】

  ①、结构总是派生自 System.ValueType,他们还足以派生自任意两个接口。

  ②、类总是派生自System.Object
或用户拔取的另一个类,他们还能派生自任意七个接口。

 

兑现三番五次的语法 

    class MyTestClass :MyTest{

      //….

    }

 

相关文章