C#构造函数里的base和this的区别

来源:互联网 发布:淘宝上买东西如何退货 编辑:程序博客网 时间:2024/05/17 00:18

用法一:

父类的构造函数总是在子类之前执行的。既先初始化静态构造函数,后初始化子类构造函数。

public class BaseCircle {
        publicBaseCircle()
        {
            Console.WriteLine(" no arguments base constructor!!!");
        }
        publicBaseCircle(doublearg)
        {
            Console.WriteLine("double arg base constructor!!!");
        }
    }
 
    publicclass SubCircle : BaseCircle {
        publicSubCircle():base()
        {
            Console.WriteLine("sub class no argument constructor,actually call base constructor !!!");
        }
 
        publicSubCircle(doublea):base(a)
        {
            Console.WriteLine("sub class with argument, actually call base double constructor!!!");
        }
 
        publicSubCircle(intk):this(1,2)
        {
            Console.WriteLine("sub class with argument int k, actually call sub class constructor int i & j !!!");
        }
 
        publicSubCircle(inti,int j)
        {
            Console.WriteLine("sub class with int i&j argument!!!!");
        }
    }
 
staticvoid Main(string[] args)
        {
            SubCircle s1 =new SubCircle();
            SubCircle s2 =new SubCircle(1.1);
            SubCircle s3 =new SubCircle(1);
 
输出结果:
 no argumentsbase constructor!!!
sub classno argument constructor,actually call baseconstructor !!!
 
doublearg base constructor!!!
sub classwith argument, actually call basedouble constructor!!!
 
 no argumentsbase constructor!!!
sub classwith int i&j argument!!!!
sub classwith argument intk, actually call sub classconstructor inti & j !!!

  

用法二:

是不是很模糊这两个关键字那?
 
哈,现在我来写份代码,代码可是最有说服力的啦!
 
 
    classBaseClass
    {
        privateint numA;
        publicBaseClass()
        {
            Console.WriteLine("基类的无参数构造函数. value:{0}", numA);
        }
        publicBaseClass(inti)
        {
            this.numA = i;
            Console.WriteLine("基类带一个参数的构造函数. value:{0}", numA);
        }
    }
    classChildClassA : BaseClass
    {
        privateint numB;
        publicChildClassA()
        {
            Console.WriteLine("子类无参数构造函数. value:{0}", numB);
        }
        publicChildClassA(inti)
        {
            this.numB = i;
            Console.WriteLine("子类带有一个参数的构造函数. value:{0}", numB);
        }
        publicChildClassA(inti, int j)
            :base(i)
        {
            this.numB = j;
            Console.WriteLine("子类带有两个参数的构造函数. value:{0}", numB);
        }
    }
    classChildClassB : BaseClass
    {
        privateint numB;
        publicChildClassB()
        {
            Console.WriteLine("子类无参数构造函数. value:{0}", numB);
        }
        publicChildClassB(inti)
        {
            this.numB = i;
            Console.WriteLine("子类带有一个参数的构造函数. value:{0}", numB);
        }
        publicChildClassB(inti, int j)
            :this(i)
        {
            this.numB = j;
            Console.WriteLine("子类带有两个参数的构造函数. value:{0}", numB);
        }
    }
    classDemo
    {
        staticvoid 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是调用基类的有参数构造函数。
 
够简洁明了吧,看了就懂,希望能给网友一些帮助。



转自:http://www.cnblogs.com/zfanlong1314/p/3591453.html

0 0