2.9C#函数成员之构造函数(Constructor)

构造函数的声明方式与方法相似,与所属结构或类同名,不过没有返回类型。

如果没有为结构或类提供实例构造函数,则会隐式自动提供无参数的实例构造函数,这时此结构或类可以被实例化。

不过,如果显式地使用 private 修饰符修饰无参数的空实例构造函数会清楚地表明该类不能被实例化。

//Expression-bodied表达式声明法
public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   }
}

1.构造函数分类

名称修饰符用途
静态构造函数static 修饰 静态构造函数是无参数构造函数,用于初始化类型的静态成员。
实例构造函数static 修饰 实例构造函数是有参数(非必须)构造函数,用于初始化类型的实例成员。

2.重载

静态构造函数不支持重载,实例构造函数支持重载。

3.复制构造函数

using System;

class Person
{
    // Copy constructor.
    public Person(Person previousPerson)
    {
        Name = previousPerson.Name;
        Age = previousPerson.Age;
    }

    //// Alternate copy constructor calls the instance constructor.
    //public Person(Person previousPerson)
    //    : this(previousPerson.Name, previousPerson.Age)
    //{
    //}

    // Instance constructor.
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public int Age { get; set; }

    public string Name { get; set; }

    public string Details()
    {
        return Name + " is " + Age.ToString();
    }
}

class TestPerson
{
    static void Main()
    {
        // Create a Person object by using the instance constructor.
        Person person1 = new Person("George", 40);

        // Create another Person object, copying person1.
        Person person2 = new Person(person1);

        // Change each person's age.
        person1.Age = 39;
        person2.Age = 41;

        // Change person2's name.
        person2.Name = "Charles";

        // Show details to verify that the name and age fields are distinct.
        Console.WriteLine(person1.Details());
        Console.WriteLine(person2.Details());

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output:
// George is 39
// Charles is 41

4.base关键字

构造函数可以使用 base 关键字调用基类的构造函数。

public class BaseClass
{
    int num;

    public BaseClass()
    {
        Console.WriteLine("in BaseClass()");
    }

    public BaseClass(int i)
    {
        num = i;
        Console.WriteLine("in BaseClass(int i)");
    }

    public int GetNum()
    {
        return num;
    }
}

public class DerivedClass : BaseClass
{
    // This constructor will call BaseClass.BaseClass()
    public DerivedClass() : base()
    {
    }

    // This constructor will call BaseClass.BaseClass(int i)
    public DerivedClass(int i) : base(i)
    {
    }

    static void Main()
    {
        DerivedClass md = new DerivedClass();
        DerivedClass md1 = new DerivedClass(1);
    }
}
/*
Output:
in BaseClass()
in BaseClass(int i)
*/

5.this关键字

构造函数可以使用 this 关键字调用同一对象中的另一构造函数。

public class Employee
{
    public int Salary;

    public Employee() { }

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

    public Employee(int weeklySalary, int numberOfWeeks)
    {
        Salary = weeklySalary * numberOfWeeks;
    }
}
//可以使用 this 重写第三个构造函数
public Employee(int weeklySalary, int numberOfWeeks)
    : this(weeklySalary * numberOfWeeks)
{
}
//this 关键字会导致第二个构造函数被调用
public Employee(int annualSalary)
{
    Salary = annualSalary;
}

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/8261.html

(0)
上一篇 2021年2月8日 20:39
下一篇 2021年2月10日 20:16

相关推荐

  • 3.2C#值类型之结构(Struct)

    1.结构声明 struct 类型定义包含数据成员和函数成员的结构,这一点与类类型相似。 2.继承 所有结构类型只能隐式派生自 System.ValueType类,结构类型不能从其它类或结构类型继承,也不能作为类的基础类型,因为结构类型是隐式密封的。 3.构造函数 如果显式声明一个无参数构造函数,那创建对象调用无参数构造…

    C#语言教程 2021年3月2日
    05450
  • 2.10C#函数成员之终结器(Finalizer)

    终结器声明 终结器(Finalizer),以前称为 析构函数(Destructor),用于在类实例被垃圾回收器回收时执行任何必要的最终清理操作。因此,无法在结构中定义终结器,它们仅用于类。 终结器的声明方式与方法相似,名称为所属类的名称前加~波浪号,不过既不能包含参数和可访问性修饰符,也不能进行显式调用。 重载 终结器…

    C#语言教程 2021年2月10日
    06400
  • 3.3C#值类型之枚举(Enum)

    枚举声明 所有枚举继承自 System.Enum类(继承自 System.ValueType)。 枚举类型 定义了一组常量值。 每个 enum 类型都有一个基础类型(必须是八种整型类型之一)。默认情况下,枚举常量的基础类型为 int,它们从 0 开始,并按定义…

    C#语言教程 2021年3月3日
    05210

发表回复

登录后才能评论