天天看點

構造函數中base和this的用法與差別

看C#進階程式設計中關于類的構造函數時候碰到BASE和THIS不懂 看了下這篇文章,不錯!

代碼最具有說服性了,看下面代碼吧:

//代碼段一

public  class ConstructorProgram1

    {

      private string name;

      public ConstructorProgram1()

      {

          Console.WriteLine("No Info Left");

      }

      public ConstructorProgram1(string name)

          this.name = name;

          Console.WriteLine("name=" + this.name);

      } 

    }

這裡我重載了另外一個構造函數,裡面的this作為一個指針訓示了一個類的引用。即是ConstructorProgram1類的引用。這個很簡單,但不是重點。

這篇文章最重點要說一下:this和base在構造函數中扮演的角色。

看下面的代碼:

public class ConstructorProgram

       private string name;

       private int age;

       public ConstructorProgram():this("bell")

       {

           //Console.WriteLine("No Info Left.");

       }

       public ConstructorProgram(string name)

           :this("Simple Programmer",20)

        {

            this.name = name;

            Console.WriteLine("name=" + this.name);

        }

        public ConstructorProgram(string name, int age)

            this.age = age;

            Console.WriteLine("age=" + this.age);

       public static void Main()

           ConstructorProgram cp1= new ConstructorProgram("goal");

           ConstructorProgram cp2 = new ConstructorProgram();

運作結果:

name=Simple Programmer

age=20

name=goal

name=bell

在上面的代碼當中,可以看出來這裡紅色字型的this用來調用ConstructorProgram類的自身的構造函數。明白這句話的涵義,應該會明白執行結果了。

接着下面的代碼如下:

 public  class ConstructorProgram1

      private int age;

      public ConstructorProgram1(string name, int age)

          this.age = age;

          Console.WriteLine("age=" + this.age);

  public  class ConstructorProgram : ConstructorProgram1

      public ConstructorProgram()

          //Console.WriteLine("sdfsdf");

      public ConstructorProgram(string name)

          : base("goalbell",20)

          Console.WriteLine("name=" + name);

      public static void Main()

          ConstructorProgram cp = new ConstructorProgram("Programmer");

運作結果如下:

name=goalbell

name=Programmer

可以看出上面的代碼,派生類中的base調用了父類(基類)的構造函數了,但是如果不提供初始化(即把 : base("goalbell",20)

不要)指向基類的構造函數的話,它會執行基類中沒有參數的構造函數。

會得到如下結果:

No Info Left

也就是說BASE是對父類的引用,而THIS是對類本身自己的引用。

在看下下面的代碼

using System;

namespace Zjw.Csharp

{

      }

public class ConstructorProgram:ConstructorProgram1

           Console.ReadLine();

}

執行結果是

繼續閱讀