程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 詳解C#編程中結構函數的應用

詳解C#編程中結構函數的應用

編輯:C#入門知識

詳解C#編程中結構函數的應用。本站提示廣大學習愛好者:(詳解C#編程中結構函數的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C#編程中結構函數的應用正文


當類或構造創立時,其結構函數挪用。結構函數與選件類或構造雷同,而且,它們平日用於初始化新對象的數據成員。
鄙人面的示例中,應用一個簡略的結構函數界說了名為 Taxi 的類。然後應用 new 運算符來實例化該類。在為新對象分派內存以後,new 運算符立刻挪用 Taxi 結構函數。

public class Taxi
{
  public bool isInitialized;
  public Taxi()
  {
    isInitialized = true;
  }
}

class TestTaxi
{
  static void Main()
  {
    Taxi t = new Taxi();
    Console.WriteLine(t.isInitialized);
  }
}

不帶參數的結構函數稱為“默許結構函數”。不管什麼時候,只需應用 new 運算符實例化對象,而且不為 new 供給任何參數,就會挪用默許結構函數。
除非類是 static 的,不然 C# 編譯器將為無結構函數的類供給一個公共的默許結構函數,以便該類可以實例化。
經由過程將結構函數設置為公有結構函數,可以阻攔類被實例化,以下所示:

class NLog
{
  // Private Constructor:
  private NLog() { }

  public static double e = Math.E; //2.71828...
}

構造類型的結構函數與類的結構函數相似,然則 structs 不克不及包括顯式默許結構函數,由於編譯器將主動供給一個結構函數。此結構函數會將 struct 中的每一個字段初始化為默許值。但是,只要當 struct 用 new 實例化時,才會挪用此默許結構函數。例如,上面的代碼應用 Int32 的默許結構函數,是以您可以確信整數已初始化:

int i = new int();
Console.WriteLine(i);

不外,上面的代碼卻會招致編譯器毛病,由於它沒有應用 new,並且測驗考試應用還沒有初始化的對象:

int i;
Console.WriteLine(i);

或許,基於 structs 的對象(包含一切內置數值類型)可以初始化或賦值後應用,以下面的示例所示:

int a = 44; // Initialize the value type...
int b;
b = 33;   // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);

是以對值類型挪用默許結構函數不是必須的。
類和 structs 都可以界說具有參數的結構函數。帶參數的結構函數必需經由過程 new 語句或 base 語句來挪用。類和 structs 還可以界說多個結構函數,而且兩者均不須要界說默許結構函數。例如:

public class Employee
{
  public int salary;

  public Employee(int annualSalary)
  {
    salary = annualSalary;
  }

  public Employee(int weeklySalary, int numberOfWeeks)
  {
    salary = weeklySalary * numberOfWeeks;
  }
}

可使用以下語句中的任一個語句來創立此類:

Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);

結構函數可使用 base 症結字來挪用基類的結構函數。例如:

public class Manager : Employee
{
  public Manager(int annualSalary)
    : base(annualSalary)
  {
    //Add further instructions here.
  }
}

在此示例中,基類的結構函數在履行結構函數塊之前被挪用。 base 症結字可帶參數應用,也可不帶參數應用。結構函數的任何參數都可用作 base 的參數,或用作表達式的一部門。有關更多信息,請拜見base(C# 參考)。
在派生類中,假如不應用 base 症結字來顯式挪用基類結構函數,則將隱式挪用默許結構函數(假如有的話)。這意味著上面的結構函數聲明在後果上是雷同的:

 public Manager(int initialdata)
{
  //Add further instructions here.
}


 public Manager(int initialdata)
  : base()
{
  //Add further instructions here.
}


 

假如基類沒有供給默許結構函數,派生類必需應用 base 顯式挪用基結構函數。
結構函數可使用 this 症結字挪用統一對象中的另外一結構函數。和 base 一樣,this 可帶參數應用也可不帶參數應用,結構函數中的任何參數都可用作 this 的參數,或許用作表達式的一部門。例如,可使用 this 重寫前一示例中的第二個結構函數:

public Employee(int weeklySalary, int numberOfWeeks)
  : this(weeklySalary * numberOfWeeks)
{
}

上一示例中對 this 症結字的應用招致此結構函數被挪用:

public Employee(int annualSalary)
{
  salary = annualSalary;
}

結構函數可以標志為 public、private、protected、internal 或 protectedinternal。這些拜訪潤飾符界說類的用戶結構該類的方法。有關更多信息,請拜見拜訪潤飾符。


實例結構函數
應用 new 表達式創立某個類的對象時,會應用實例結構函數創立和初始化一切實例成員變量。要初始化靜態類或非靜態類中的靜態變量,必需界說靜態結構函數。
上面的示例演示實例結構函數:

class CoOrds
{
  public int x, y;

  // constructor
  public CoOrds()
  {
    x = 0;
    y = 0;
  }
}

留意
為了清晰起見,此類包括公共字段。建議在編程時不要應用公共字段,由於這類做法會使法式中任何地位的任何辦法都可以不受限制、不經歷證地拜訪對象的外部組件。數據成員平日應該為公有的,而且只應該經由過程類辦法和屬性來拜訪。
只需創立基於 CoOrds 類的對象,就會挪用此實例結構函數。諸如斯類不帶參數的結構函數稱為“默許結構函數”。但是,供給其他結構函數平日非常有效。例如,可以向 CoOrds 類添加結構函數,以即可認為數據成員指定初始值:

// A constructor with two arguments:
public CoOrds(int x, int y)
{
  this.x = x;
  this.y = y;
}

如許即可以用默許或特定的初始值創立 CoOrd 對象,以下所示:

CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);

假如某個類沒有結構函數,則會主動生成一個默許結構函數,並應用默許值來初始化對象字段。例如,int 初始化為 0。有關默許值的更多信息,請拜見 默許值表(C# 參考)。是以,因為 CoOrds 類的默許結構函數將一切數據成員都初始化為零,是以可以將它完整移除,而不會更改類的任務方法。本主題的稍後部門的示例 1 中供給了應用多個結構函數的完全示例,示例 2 中供給了主動生成的結構函數的示例。
也能夠用實例結構函數來挪用基類的實例結構函數。類結構函數可經由過程初始值設定項來挪用基類的結構函數,以下所示:

class Circle : Shape
{
  public Circle(double radius)
    : base(radius, 0)
  {
  }
}

在此示例中,Circle 類將表現半徑和高度的值傳遞給 Shape(Circle 從它派生而來)供給的結構函數。應用 Shape 和 Circle 的完全示例請見本主題中的示例 3。
示例 1
上面的示例解釋包括兩個類結構函數的類:一個類結構函數沒有參數,另外一個類結構函數帶有兩個參數。

class CoOrds
{
  public int x, y;

  // Default constructor:
  public CoOrds()
  {
    x = 0;
    y = 0;
  }

  // A constructor with two arguments:
  public CoOrds(int x, int y)
  {
    this.x = x;
    this.y = y;
  }

  // Override the ToString method:
  public override string ToString()
  {
    return (String.Format("({0},{1})", x, y));
  }
}

class MainClass
{
  static void Main()
  {
    CoOrds p1 = new CoOrds();
    CoOrds p2 = new CoOrds(5, 3);

    // Display the results using the overriden ToString method:
    Console.WriteLine("CoOrds #1 at {0}", p1);
    Console.WriteLine("CoOrds #2 at {0}", p2);
    Console.ReadKey();
  }
}

輸入:

 CoOrds #1 at (0,0)
 CoOrds #2 at (5,3)    

示例 2
在此示例中,類 Person 沒有任何結構函數;在這類情形下,將主動供給默許結構函數,同時將字段初始化為它們的默許值。

public class Person
{
  public int age;
  public string name;
}

class TestPerson
{
  static void Main()
  {
    Person person = new Person();

    Console.WriteLine("Name: {0}, Age: {1}", person.name, person.age);
    // Keep the console window open in debug mode.
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();
  }
}

輸入:

 Name: , Age: 0

留意,age 的默許值為 0,name 的默許值為 null。有關默許值的更多信息,請拜見 默許值表(C# 參考)。
示例 3
上面的示例解釋應用基類初始值設定項。 Circle 類是從通用類 Shape 派生的,Cylinder 類是從 Circle 類派生的。每一個派生類的結構函數都應用其基類的初始值設定項。

abstract class Shape
{
  public const double pi = Math.PI;
  protected double x, y;

  public Shape(double x, double y)
  {
    this.x = x;
    this.y = y;
  }

  public abstract double Area();
}

class Circle : Shape
{
  public Circle(double radius)
    : base(radius, 0)
  {
  }
  public override double Area()
  {
    return pi * x * x;
  }
}

class Cylinder : Circle
{
  public Cylinder(double radius, double height)
    : base(radius)
  {
    y = height;
  }

  public override double Area()
  {
    return (2 * base.Area()) + (2 * pi * x * y);
  }
}

class TestShapes
{
  static void Main()
  {
    double radius = 2.5;
    double height = 3.0;

    Circle ring = new Circle(radius);
    Cylinder tube = new Cylinder(radius, height);

    Console.WriteLine("Area of the circle = {0:F2}", ring.Area());
    Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());

    // Keep the console window open in debug mode.
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();
  }
}

輸入:

  Area of the circle = 19.63
  Area of the cylinder = 86.39
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved