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是调用基类的有参数构造函数。

够简洁明了吧,看了就懂,希望能给网友一些帮助。

  

时间: 2024-11-08 20:25:27

C#构造函数里的base和this的区别的相关文章

final修饰的终态变量只能在声明变量时或构造函数里赋值嘛?

问题描述 final修饰的终态变量只能在声明变量时或构造函数里赋值嘛? class GongChengShi { final String name;//名字 final String dizhi;//地址 int age;//年龄 public GongChengShi(String name, int age) { this.name = name;//构造函数初始化时给名字和年龄赋值 this.age = age; } void setDizhi(String dizhi){//在子类中调

c++-Qt为啥在构造函数里建立的radiobutton不显示

问题描述 Qt为啥在构造函数里建立的radiobutton不显示 MainWidget::MainWidget(QWidget *parent) : QMainWindow(parent) ui(new Ui::MainWidget){ int ij; for(i=0;i<10;i++) for(j=0;j<19;j++) { radio_arr[i][j] = new QRadioButton; init_RadioButton(radio_arr[i][j]40+j*3860+i*38);

右值引用-移动构造函数里为什么要将参数赋值为空指针

问题描述 移动构造函数里为什么要将参数赋值为空指针 移动构造函数里为什么要将参数赋值为空指针 解决方案 这是移动语法啊.把数据移动成功后.本身变量清空.这样防止再次被使用 解决方案二: 似乎只是为了初始化变量而已 解决方案三: 应该只是为了初始化,以后的操作可以通过检测指针是否为空来判断指针是否被分配了内存. 解决方案四: 感觉其目的在销毁sp时不至于释放其内存

既然非静态构造函数里可以对静态字段赋值,那还要静态构造函数干嘛?

问题描述 既然非静态构造函数里可以对静态字段赋值,那还要静态构造函数干嘛?难道是为了在本类被实例化之前就可以使用静态字段吗? 解决方案 本帖最后由 syncsdn9 于 2016-03-23 16:29:23 编辑解决方案二:你没见过不需要实例化就能用的类吗?比如System.Array解决方案三:静态构造函数是你在调用这个函数的任何方法.属性(尤其是static的)之前执行,非静态构造函数是在new的时候才执行,这能一样吗?解决方案四:你最后句话还真说对了,静态字段与实例无关,不需要实例化就可

c++ 类和对象-【C++】写在构造函数里的变量能够被同一个类中其他成员访问吗?为什么?

问题描述 [C++]写在构造函数里的变量能够被同一个类中其他成员访问吗?为什么? class rational { private: long denom,den; //denom为分子,den为分母 double a; public: rational(int n, int m) { denom=n; den=m;a=(double)denom/(double)den; //比如这里构造函数里的a能被其他成员函数访问吗?为什么? } int operator<(rational r) cons

Swift里的值类型与引用类型区别和使用

  这篇文章主要介绍了Swift里的值类型与引用类型区别和使用,本文讲解了值类型与引用类型的区别.如何选择类型.什么时候该用值类型.什么时候该用引用类型等内容,需要的朋友可以参考下 Swift里面的类型分为两种: ●值类型(Value Types):每个实例都保留了一分独有的数据拷贝,一般以结构体 (struct).枚举(enum) 或者元组(tuple)的形式出现. ●引用类型(Reference Type):每个实例共享同一份数据来源,一般以类(class)的形式出现. 在这篇博文里面,我们

C++里大写TRUE和小写true区别

1.C++里有区别true是bool型的:TRUE是int型的,VC里这个是ms自己定义的: C++规定不允许只通过返回类型不同区别两个函数 ===================== ===========================你写错了吧--原函数声明是virtual BOOL InitInstance( ); 你函数声明是bool,麻烦把它写成BOOLbool跟BOOL是不一样的   2.而"DWORD"和"HWND"分别指什么?DWORD类型表示&q

PS里不透明度和填充有什么区别?

  有朋友问,填充和不透明度有什么区别,什么时候该用不透明度?什么时候该用填充?今天@P大点S微博 用通俗易懂的方式给同学们科普一下这两者的区别,案例生动形象,值得一读. 填充和不透明度都是图层的一个选项,其位置都是位于图层面板选项. "不透明度"(Opacity),这个很好理解吧,就是图层的透明度."填充fill"呢,什么意思?我们先看一张图. 看上去,不透明度和填充好像没有区别.但是事实上,是有区别的.我们再看一张图,我给设问的LOGO添加一个3像素的黑色描边图

js里slice,substr和substring的区别

概要: string.slice(start, end)提取一个字符串 string.substring(start, end)提取一个字符串,end不支持负数 string.substr(start, len)提取一个长度为len的字符串   1.slice和substring接收的是起始位置和结束位置(不包括结束位置),而substr接收的则是起始位置和所要返回的字符串长度.直接看下面例子: var test = 'hello world'; alert(test.slice(4,7));