C#构造函数详解和析构函数详解
首先来了解下构造函数的定义:
C#构造函数是一种特殊的成员函数,它的作用主要用于为对象分配存储空间,对数据成员进行初始化。
接下来看一下他的语法定义形式:
|访问修饰符| 标识符 (|参数列表|) |: base(|参数列表|)| |:this(|参数列表|)|
{
构造函数语句块;
}
解释:
访问修饰符:就是我们大家所熟悉的public,private,protected,internal 这四个。
标识符:就是类名,并且必须是类名。
参数列表:就是方法或者函数的参数列表。
base:就是调用父类中的构造函数。
this:就是调用本身的其他构造函数。
看了上面的定义和语法形式,是不是很简单大。
构造函数的细则如下:
1、构造函数的名字必须和类的名字相同。
2、构造函数可以使用访问修饰符。
3、可以调用父类中的构造函数。
4、可以调用本身的其他构造函数。
5、构造函数没有返回类型,不可以有返回值。
6、构造函数可以带参数,也可以不带参数。
7、构造函数可以重载。主要是根据参数的个数不同而引起的。
8、如果不显示定义构造函数,则有默认的无参构造函数,此时构造函数的函数体是为空的。
9、静态构造函数,必须用static修饰,用于初始化静态变量。一个类中,只允许有一个构造函数。
10、如果有静态构造函数,在实例化时加载,这时修饰符就失去作用了。
11、如果定义了,有参数的构造函数,最好也显示顶一个无参的构造函数。
上面说了这么多,下面看一个demo
public class Base {
public Base() {
Console.WriteLine("爸爸的构造函数被调用啦~");
}
}
public class A :Base
{
public A() : this("hello"){
Console.WriteLine("我是可以调用基类和我的其他构造函数的类");
}
public A(string info) : base()
{
Console.WriteLine("我是被其他构造函数调用的,它发过来字符串"+info);
}
}
class Program
{
static void Main(string[] args)
{
A a = new A();
Console.ReadLine();
}
}
根据上面的这个demo,输出的结果会是什么样的。这里就引起了另外一个问题。那就是子类本身和父类构造函数的构造顺序是怎么样执行的。
我们来分析一下:
首先调用构造函数A()
然后呢,因为A()使用了this关键字,所以在还没有进入函数体的是否就调用了this("hello")也就是A(string info)
这时候A(string info)构造函数被调用,但是由于该构造函数使用了base关键字,所以在没有进入函数体就去调用它爸爸构造函数Base()咯
然后调用完Base()就依次的输出结果咯,整个过程其实就是一个压栈然后取栈顶元素的过程
分析过之后,上面的执行结果就是:
爸爸的构造函数被调用啦~
我是被其他构造函数调用的,它发过来字符串hello
我是可以调用基类和我的其他构造函数的类
接下类我们在学习一下 析构函数的用法:
析构函数的作用:垃圾回收器,它用来清理对象时调用
析构函数的细则:
1、不能有参数
2、不能有任何修饰符而且不能被调用,它是自动调用的,这是它与构造函数的一个主要区别。
3、由于析构函数的目的与构造函数的相反,就加前缀‘~’以示区别。
接下来我们先看下析构函数的用法:
public class Base {
public Base() {
Console.WriteLine("爸爸的构造函数被调用啦~");
}
~Base()
{
Console.WriteLine("我是析构函数 Base");
}
}
public class A :Base
{
public A() : this("hello"){
Console.WriteLine("我是可以调用基类和我的其他构造函数的类");
}
public A(string info) : base()
{
Console.WriteLine("我是被其他构造函数调用的,它发过来字符串"+info);
}
~A()
{
Console.WriteLine("我是析构函数A");
}
}
class Program
{
static void Main(string[] args)
{
A a = new A();
Console.ReadLine();
}
}
由于析构函数的作用也是销毁对象的。
我们和Dispose和Close方法的区别;
| 说明 | 析构函数 | Dispose | Close |
| 意义 | 销毁对象 | 销毁对象 | 关闭对象资源 |
| 调用方式 | 不能被显示调用 | 需要显示调用或者通过using语句调用 | 需要显示调用 |
| 调用时机 | 不确定 | 确定 | 确定 |
》》》》》》》》》》》》》》》》》》》》》》》》》》》
--------------------C#面向对象入门级教程--------------------------
》》》》》》》》》》》》》》》》》》》》》》》》》》》
C#构造函数详解和析构函数详解的更多相关文章
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- 小甲鱼PE详解之基址重定位详解(PE详解10)
今天有一个朋友发短消息问我说“老师,为什么PE的格式要讲的这么这么细,这可不是一般的系哦”.其实之所以将PE结构放在解密系列继基础篇之后讲并且尽可能细致的讲,不是因为小甲鱼没事找事做,主要原因是因为P ...
- 小甲鱼PE详解之输入表(导出表)详解(PE详解09)
小甲鱼PE详解之输出表(导出表)详解(PE详解09) 当PE 文件被执行的时候,Windows 加载器将文件装入内存并将导入表(Export Table) 登记的动态链接库(一般是DLL 格式)文件一 ...
- Lambda表达式详解(例子详解)(转自:http://blog.csdn.net/damon316/article/details/51734661)
Lambda表达式详解(例子详解) lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 ...
- css 12-CSS3属性详解:动画详解
12-CSS3属性详解:动画详解 #前言 本文主要内容: 过渡:transition 2D 转换 transform 3D 转换 transform 动画:animation #过渡:transiti ...
- Log4j2详解——XML配置详解
Log4j2详解--XML配置详解 找到了个很详细的文章链接 https://www.jianshu.com/p/bfc182ee33db
- 【ES6 】ES6 解构赋值--数组解构赋值
定义 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构 数组的解构赋值 以前,为变量赋值,只能直接指定值. let a = 1; let b = 2; let c = 3; ...
- Git使用总结 Asp.net生命周期与Http协议 托管代码与非托管代码的区别 通过IEnumerable接口遍历数据 依赖注入与控制反转 C#多线程——优先级 AutoFac容器初步 C#特性详解 C#特性详解 WPF 可触摸移动的ScrollViewer控件 .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用
一,原理 首先,我们要明白Git是什么,它是一个管理工具或软件,用来管理什么的呢?当然是在软件开发过程中管理软件或者文件的不同版本的工具,一些作家也可以用这个管理自己创作的文本文件,由Linus开发的 ...
- ES6(二)解构赋值详解
详解一下之前的解构赋值 ①解构赋值中的"..." let [a,...b]= [1]; b // [] ...代表变量b去匹配剩余的所有元素返回一个数组 ,匹配不到时返回[] // ...
随机推荐
- 【转】 Pro Android学习笔记(九十):了解Handler(4):Worker线程
目录(?)[-] worker线程小例子 小例子代码worker线程通过handler实现与主线程的通信 小例子代码继承Handler代码 小例子代码子线程的Runnable 文章转载只能用于非商业性 ...
- Py修行路 python基础 (二十二)异常处理
异常处理 一.错误和异常 程序中难免出现错误,而错误分为两种:语言异常和逻辑异常 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) for i in range ...
- python's thirty-first day for me re模块
正则表达式: re 模块 可以读懂 你写的正则表达式,根据你写的表达式去执行任务. 正则表达式:字符串的操作. 使用一些规则来检测字符串是否符合我的要求 —— 表单验证 从一段字符串中找到符合我要 ...
- Windows下搭建PHP开发环境-WEB服务器
PHP集成开发环境有很多,如XAMPP.AppServ......只要一键安装就把PHP环境给搭建好了.但这种安装方式不够灵活,软件的自由组合不方便,同时也不利于学习.所以我还是喜欢手工搭建PHP开发 ...
- Android Studio 配置模拟器AVD存放路径(默认在c盘,解决c盘空间不够问题)
Android Studio 安装之后,默认的会给我们创建一个 Nexus 的模拟器, 这个模拟器的镜像文件放在了 C:\Users\Administrator\.android 中 其中的avd文 ...
- 【转载】用原生JS和html5进行视频截图并保存到本地
支持并尊重原创!原文地址:http://www.cnblogs.com/xieshuxin/p/6731637.html <!doctype html> <html> < ...
- InputStreamReader和BufferedReader的区别
.InputStream.OutputStream 处理字节流的抽象类 InputStream 是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream等. OutputSt ...
- 概览JVM的基本结构和JVM内存结构
概览JVM的基本结构和JVM的内存结构 这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫 ...
- a标签:鼠标指针变成文本输入图形
今天我在使用a标签的时候,鼠标放在上面的时候总是显示文本输入的图形,不是小手的形状,找了好久的原因才发现由于我给它绑定了一个click事件,在事件里面进行了跳转,然后把 href ="#&q ...
- AngularJS框架
http://www.runoob.com/angularjs/angularjs-intro.html