上海龙凤419

C说话

C说话外面机关函数和析构函数的应用体例

时候:2024-07-01 08:44:55 C说话 我要投稿
  • 相干保举

C说话外面机关函数和析构函数的应用体例

  摘 要:机关函数与析构函数是一个类中看似较为简略的两类函数,但在现实应用进程中总会呈现一些意想不到的运转毛病。本文将较体系的先容机关函数与析构函数的道理及在C#中的应用,和在操纵进程中须要注重的多少事变。

  关头字:机关函数;析构函数;渣滓收受接管器;非托管资本;托管资本

  一.机关函数与析构函数的道理

  作为比C更进步前辈的说话,C#供给了更好的机制来加强法式的宁静性。C#编译用具有严酷的范例宁静查抄功效,它几近能找出法式中一切的语法题目,这简直帮了法式员的大忙。可是法式经由过程了编译查抄并不表现毛病已不存在了,在“毛病”的大师庭里,“语法毛病”的位置只能算是冰山一角。级别高的毛病凡是埋没得很深,不轻易发明。

  按照经历,不少难以发觉的法式毛病是由于变量不被准确初始化或断根形成的,而初始化和断根任务很轻易被人健忘。微软操纵面向工具的观点在设想C#说话时充实斟酌了这个题目并很好地予以处理:把工具的初始化任务放在机关函数中,把断根任务放在析构函数中。当工具被建立时,机关函数被主动履行。当工具灭亡时,析构函数被主动履行。如许就不必担忧健忘工具的初始化和断根任务。

  二.机关函数在C#中的应用

  机关函数的名字不能随意起,必须让编译器认得出才可以或许被主动履行。它的定名体例既简略又公道:让机关函数与类同名。除名字外,机关函数的别的一个出格的处所是不前往值范例,这与前往值范例为void的函数差别。若是它有前往值范例,那末编译器将不知所措。在你可以或许拜候一个类的体例、属性或任何别的工具之前, 第一条履行的语句是包罗有响应类的机关函数。乃至你本身不写一个机关函数,也会有一个缺省机关函数供给给你。

  class TestClass

  {

  public TestClass(): base() {} // 由CLR供给

  }

  上面罗列了几种范例的机关函数

  1)缺省机关函数

  class TestClass

  {

  public TestClass(): base() {}

  }

  上面已先容,它由体系(CLR)供给。

  2)实例机关函数

  实例机关函数是实现对类中实例停止初始化的体例成员。如:

  using System;

  class Point

  {

  public double x, y;

  public Point()

  {

  this.x = 0;

  this.y = 0;

  }

  public Point(double x, double y)

  {

  this.x = x;

  this.y = y;

  }

  }

  class Test

  {

  static void Main()

  {

  Point a = new Point();

  Point b = new Point(3, 4); // 用机关函数初始化工具

  }

  }

  申明了一个类Point,它供给了两个机关函数。它们是重载的。一个是不参数的Point机关函数和一个是有两个double参数的Point机关函数。若是类中不供给这些机关函数,那末会CLR会主动供给一个缺省机关函数的。但一旦类中供给了自界说的机关函数,如Point()和Point(double x, double y),则缺省机关函数将不会被供给,这一点要注重。

  3) 静态机关函数

  静态机关函数是实现对一个类停止初始化的体例成员。它普通用于对静态数据的初始化。静态机关函数不能有参数,不能有润色符并且不能被挪用,当类被加载时,类的静态机关函数主动被挪用。如:

  using System.Data;

  class Employee

  {

  private static DataSet ds;

  static Employee()

  {

  ds = new DataSet(...);

  }

  }

  申明了一个有静态机关函数的类Employee。注重静态机关函数只能对静态数据成员停止初始化,而不能对非静态数据成员停止初始化。可是,非静态机关函数既可以或许对静态数据成员赋值,也可以或许对非静态数据成员停止初始化。

  若是类仅包罗静态成员,你可以或许建立一个private的机关函数:private TestClass() {…},可是private象征着从类的外面不可以或许拜候该机关函数。以是,它不能被挪用,且不工具可以或许被该类界说实例化。

  以上是几种范例机关函数的简略应用,上面将重点先容一下在类的条理布局中(即担当布局中)基类和派生类的机关函数的操纵体例。派生类工具的初始化由基类和派生类配合实现:基类的成员由基类的机关函数初始化,派生类的成员由派生类的机关函数初始化。

  当建立派生类的工具时,体系将会挪用基类的机关函数和派生类的机关函数,构 造函数的履行顺序是:先履行基类的机关函数,再履行派生类的机关函数。若是派生类又有工具成员,则,先履行基类的机关函数,再履行成员工具类的机关函数,最初履行派生类的机关函数。

  至于履行基类的甚么机关函数,缺省环境下是履行基类的无参机关函数,若是要履行基类的有参机关函数,则必须在派生类机关函数的成员初始化表中指出。如:

  class A

  { private int x;

  public A( ) { x = 0; }

  public A( int i ) { x = i; }

  };

  class B : A

  { private int y;

  public B( ) { y = 0; }

  public B( int i ) { y = i; }

  public B( int i, int j ):A(i) { y = j; }

  };

  B b1 = new B(); //履行基类A的机关函数A(),再履行派生类的机关函数B()

  B b2 = new B(1); //履行基类A的机关函数A(),再履行派生类的机关函数B(int)

  B b3 = new B(0,1); //履行履行基类A的机关函数A(int) ,再履行派生类的

  机关函数B(int,int)

  在这里机关函数的履行顺序是必然要阐发清晰的。别的,若是基类A中不供给无参机关函数public A( ) { x = 0; },则在派生类的一切机关函数成员初始化表中必须指出基类A的有参机关函数A(i),以下所示:

  class A

  { private int x;

  public A( int i ) { x = i; }

  };

  class B : A

  { private int y;

  public B():A(i) { y = 0; }

  public B(int i):A(i) { y = i; }

  public B(int i, int j):A(i) { y = j; }

  };

  三.析构函数和渣滓收受接管器在C#中的应用

  析构函数是实现烧毁一个类的实例的体例成员。析构函数不能有参数,不能任何润色符并且不能被挪用。由于析构函数的目标与机关函数的相反,就加前缀‘~’以示区分。

  固然C#(更切当的说是CLR)供给了一种新的内存办理机制---主动内存办理机制(Automatic memory management),资本的开释是可以或许经由过程“渣滓收受接管器” 主动实现的,普通不须要用户干涉干与,但在有些特别环境下仍是须要用到析构函数的,如在C#中非托管资本的开释。

  资本的开释普通是经由过程"渣滓收受接管器"主动实现的,但详细来讲,仍有些须要注重的处所:

  1. 值范例和援用范例的援用实在是不须要甚么"渣滓收受接管器"来开释内存的,由于当它们出了感化域后会主动开释所占内存,由于它们都保管在栈(Stack)中;

  2. 只要援用范例的援用所指向的工具实例才保管在堆(Heap)中,而堆由于是一个自在存储空间,以是它并不像"栈"那样有保存期("栈"的元素弹出后就代表保存期竣事,也就代表开释了内存),并且要注重的是,"渣滓收受接管器"只对这块地区起感化;

  但是,有些环境下,当须要开释非托管资本时,就必须经由过程写代码的体例来处理。凡是是操纵析构函数开释非托管资本,将用户本身编写的开释非托管资本的代码段放在析构函数中便可。须要注重的是,若是一个类中不操纵到非托管资本,那末必然不要界说析构函数,这是由于工具履行了析构函数,那末"渣滓收受接管器"在开释托管资本之前要先挪用析构函数,而后第二次才真正开释托管资本,如许一来,两次删除举措的花消比一次大多的。上面操纵一段代码来示析构函数是若何操纵的:

  public class ResourceHolder

  {

  ~ResourceHolder()

  {

  // 这里是清算非托管资本的用户代码段

  }

  }

  四.小结

  机关函数与析构函数固然是一个类中情势上较简略的函数,但它们的操纵决非看上去那末简略,是以矫捷而准确的操纵机关函数与析构函数可以或许帮你更好的懂得CLR的内存办理机制,和更好的办理体系中的资本。

【C说话外面机关函数和析构函数的应用体例】相干文章:

浅谈若何应用C说话malloc和free函数08-09

C说话中isalnum()函数和isalpha()函数的对照10-12

C说话函数的递归和挪用08-22

c说话数学函数的先容10-20

C说话函数递归教程09-25

C说话函数的递归挪用08-26

C说话函数的参数和前往值09-14

C说话函数参数通报题目10-17

C说话中strpbr()函数的用法07-25

c说话中time函数的用法08-27