C#构造函数里的base和this的区别
用法一:
父类的构造函数总是在子类之前执行的。既先初始化静态构造函数,后初始化子类构造函数。
- public class BaseCircle {
- public BaseCircle()
- {
- Console.WriteLine(" no arguments base constructor!!!");
- }
- public BaseCircle(double arg)
- {
- Console.WriteLine("double arg base constructor!!!");
- }
- }
- public class SubCircle : BaseCircle {
- public SubCircle():base()
- {
- Console.WriteLine("sub class no argument constructor,actually call base constructor !!!");
- }
- public SubCircle(double a):base(a)
- {
- Console.WriteLine("sub class with argument, actually call base double constructor!!!");
- }
- public SubCircle(int k):this(1,2)
- {
- Console.WriteLine("sub class with argument int k, actually call sub class constructor int i & j !!!");
- }
- public SubCircle(int i,int j)
- {
- Console.WriteLine("sub class with int i&j argument!!!!");
- }
- }
- static void Main(string[] args)
- {
- SubCircle s1 = new SubCircle();
- SubCircle s2 = new SubCircle(1.1);
- SubCircle s3 = new SubCircle(1);
- }
- 输出结果:
- no arguments base constructor!!!
- sub class no argument constructor,actually call base constructor !!!
- double arg base constructor!!!
- sub class with argument, actually call base double constructor!!!
- no arguments base constructor!!!
- sub class with int i&j argument!!!!
- sub class with argument int k, actually call sub class constructor int i & j !!!
用法二:
- 是不是很模糊这两个关键字那?
- 哈,现在我来写份代码,代码可是最有说服力的啦!
- class BaseClass
- {
- private int numA;
- public BaseClass()
- {
- Console.WriteLine("基类的无参数构造函数. value:{0}", numA);
- }
- public BaseClass(int i)
- {
- this.numA = i;
- Console.WriteLine("基类带一个参数的构造函数. value:{0}", numA);
- }
- }
- class ChildClassA : BaseClass
- {
- private int numB;
- public ChildClassA()
- {
- Console.WriteLine("子类无参数构造函数. value:{0}", numB);
- }
- public ChildClassA(int i)
- {
- this.numB = i;
- Console.WriteLine("子类带有一个参数的构造函数. value:{0}", numB);
- }
- public ChildClassA(int i, int j)
- : base(i)
- {
- this.numB = j;
- Console.WriteLine("子类带有两个参数的构造函数. value:{0}", numB);
- }
- }
- class ChildClassB : BaseClass
- {
- private int numB;
- public ChildClassB()
- {
- Console.WriteLine("子类无参数构造函数. value:{0}", numB);
- }
- public ChildClassB(int i)
- {
- this.numB = i;
- Console.WriteLine("子类带有一个参数的构造函数. value:{0}", numB);
- }
- public ChildClassB(int i, int j)
- : this(i)
- {
- this.numB = j;
- Console.WriteLine("子类带有两个参数的构造函数. value:{0}", numB);
- }
- }
- class Demo
- {
- static void Main(string[] args)
- {
- Console.WriteLine("使用base\n");
- ChildClassA a = new ChildClassA(2, 4);
- Console.WriteLine();
- Console.WriteLine("----------------------------------------\n");
- Console.WriteLine("使用this\n");
- ChildClassB b = new ChildClassB(2, 4);
- Console.ReadKey();
- }
- }
- 执行的结果如下:
- --------------------------------结果----------------------------------
- 使用base
- 基类带一个参数的构造函数. value:2
- 子类带有两个参数的构造函数. value:4
- ----------------------------------------
- 使用this
- 基类的无参数构造函数. value:0
- 子类带有一个参数的构造函数. value:2
- 子类带有两个参数的构造函数. value:4
- --------------------------------结果----------------------------------
- this只是调用本身,但是这样是需要调用一次基类没有参的构造函数,所以会多显示一条“基类的无参数构造函数. value:0”。
- base是调用基类的有参数构造函数。
- 够简洁明了吧,看了就懂,希望能给网友一些帮助。
C#构造函数里的base和this的区别的更多相关文章
- 构造函数this和base的区别
构造函数this和base的区别: this:调用的是本身,不能调用父类和子类的 base:调用父类的,不能调用本身的,但别人继承,可以调用 从中也可以得出另外个结果构造函数的运行过程 先从基类开始构 ...
- 构造函数后面的base()
先执行父类的对应的构造函数,再执行当前的构造函数. 关于子类对象的构造函数和父类构造函数的执行顺序 以下内容转自:http://blog.csdn.net/todototry/article/deta ...
- SAP MM 预留单据里的Base date和Requirement date
SAP MM 预留单据里的Base date和Requirement date Base date可以在预留创建的初始界面指定, 这个日期可以作为预留各个行项目默认的requirement date. ...
- C++ 里大写TRUE和小写true区别
1.C++里大写TRUE和小写true区别 true是bool型的: TRUE是int型的,VC里这个是ms自己定义的: C++规定不允许只通过返回类型不同区别两个函数 2.MFC中的”false“和 ...
- 《more effective C++》条款10 防止构造函数里的资源泄露
构造函数也可能发生内存泄露,考虑如下程序: class A { public: A(int *p) { if(p!=NULL) num=p; ); //do something } private: ...
- 构造函数中base与this的区别
base是对父类的引用,而this是对类本身的引用. namespace ConsoleApplication1 { public class BaseClass { private string n ...
- 在全局对象(不是指针)的构造函数里不要对std集合做太多操作
写MaxvisionOnvif的时候,我用个宏把每个Command类注册到了CommandBuilder里面,通过全局对象初始化实现的,如下: void CommandBuilder::Registe ...
- Qt设置窗口的初始大小(使用sizeHint这个虚函数,或者在构造函数里使用resize函数)
我们用qt创建一个窗口,先后显示它,代码如下: class Mywindow : public QMainWindow{ ..... } int main( int argc, char** argv ...
- Autowired注解的妙用---在Controller里的构造函数里获取需要注入的对象
/*@Resource private Observer<TaxiObserverVo> taxiPushObserver; @Resource private Observer<T ...
随机推荐
- Linux下JDK环境变量配置
JDK官方下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 我的下载路 ...
- 关于考虑浏览器兼容性时间的工具demo
//支持跨浏览器的添加事件. var btn = document.getElementById("btn"); function showMes() { alert(" ...
- this详解:JAVASCRIPT中的this到底是谁?
语法 this 全局对象 在全局执行上下文(函数之外),this引用的是全局对象. console.log(this.document === document); // true // In web ...
- 如何让input之间无空隙
有如下两个input: <form action="http://www.example.com/index/search" method="get"&g ...
- 4种检测是否支持HTML5的方法,你知道几个?
4种检测是否支持HTML5的方法,你知道几个? 1,检查特定的属性是否存在于全局的对象里面,比如说window或navigator. 比如geolocation,它是HTML5新加支持的新特性:它是由 ...
- STM32学习笔记——DMA控制器(向原子哥学习)
一.DMA简介 DMA,全称为:Direct Memory Access,即直接存储器访问,DMA 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输.当 CPU 初始化这个传输动作,传输 ...
- emmet插件的导入与实用
http://jingyan.baidu.com/article/ff4116259b057c12e48237b8.html http://www.iteye.com/news/27580 分享htm ...
- 解决win8与VC++6.0不兼容问题
找到VC++6.0安装文件夹Bin下的MSDEV.EXE程序 将MSDEV名字改为MSDEV1(或MSDEV2,3...) 右击改好的MSDEV1,打开属性面板,选择兼容性,勾上“在兼容模式下运行”, ...
- ha666_go运行环境配置
项目地址:http://git.oschina.net/ha666/ha666_go 服务器配置: CPU: 1核 内存: 1024 MB 操作系统: CentOS 7.0 64位 内网IP: 10. ...
- C# WinForm的SplitContainer控件固定Panel大小[转]
原文地址:http://zhidao.baidu.com/link?url=mhkUszZ8am_vqNX3KAOff-psd3af7Xl3DL77KxJ-rWIAqIArQHzQIEBoX49mQA ...