C# 中,构造函数(Constructor) 是类的一种特殊方法,它在创建对象时自动调用,主要用于初始化对象的成员变量。构造函数可以确保对象在创建时处于有效状态,简化对象的初始化过程,提高代码的可读性和可维护性。本文主要介绍C# 构造函数。

1、C# 构造函数

C# 中的构造函数是一种用于初始化对象的特殊方法。 创建类的对象时将调用构造函数。 可用于设置对象属性的初始值:

例如,

创建构造函数:

using System;
using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication { // 定义MainClass类 public class MainClass { int x; // 创建一个类属性 // 为Main类创建一个类构造函数 public MainClass() { x = 5; // 为类属性x设置初始值 } public static void Main(string[] args) { MainClass myObj = new MainClass(); // 创建Main类的对象(这将调用构造函数) Console.WriteLine(myObj.x); // 输出x的值 } } }// 输出 5

注意:构造函数名称必须匹配类名称,并且不能具有返回类型(例如,void)。 另外注意,在创建对象时会调用构造函数。默认情况下,所有类都具有构造函数:如果未创建类构造函数,则C# 会为创建一个。 但是将无法设置对象属性的初始值。

2、构造函数参数

构造函数还可以使用参数来初始化属性。

构造函数还可以使用参数来初始化属性。

下面的示例向构造函数添加一个int y参数。在构造函数内部,我们将x设置为y(x = y)。当我们调用构造函数时,我们将一个参数传递给构造函数(5),它将x的值设置为5

例如,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication
{
public class MainClass
{
int x;
public MainClass(int y)
{
x = y;
}
public static void Main(string[] args)
{
MainClass myObj = new MainClass(5);
Console.WriteLine(myObj.x);
}
}
}// 输出 5

可以根据需要设置任意个数的参数:

例如,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication
{
public class MainClass
{
int age;
string name;
public MainClass(int a, String n)
{
age = a;
name = n;
}
public static void Main(string[] args)
{
MainClass myLanguage = new MainClass(3, "cjavapy");
Console.WriteLine(myLanguage.age + " " + myLanguage.name);
}
}
}// 输出 3 cjavapy

3、构造函数与普通函数的区别

1)一般函数是用于定义对象应该具备的功能。而构造函数定义的是,对象在调用功能之前,在建立时,应该具备的一些内容。也就是对象的初始化内容。

2)构造函数是在对象建立时由.NET FrameWork调用, 给对象初始化。一般函数是对象建立后,当对象调用该功能时才会执行。

3)普通函数可以使用对象多次调用,构造函数就在创建对象时调用。

4)构造函数的函数名要与类名一样,而普通的函数只要符合标识符的命名规则即可。

5)构造函数没有返回值类型。

4、构造函数重载

构造函数重载是指在同一个类中定义多个构造函数,它们具有相同的名称(即类名),但参数列表不同。C# 允许在创建对象时选择不同的构造函数,从而提供更灵活的初始化方式。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication
{
    class Person
    {
        public string Name;
        public int Age;
    
        // 无参构造函数
        public Person()
        {
            Name = "默认名称";
            Age = 18;
        }
    
        // 带参数的构造函数
        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }
    }
    
    class Program
    {
        static void Main()
        {
            Person p1 = new Person();
            Console.WriteLine($"{p1.Name}, {p1.Age}");
    
            Person p2 = new Person("李四", 30);
            Console.WriteLine($"{p2.Name}, {p2.Age}"); 
        }
    }

}

5、使用 this 关键字调用其他构造函数

可以在一个构造函数内部调用另一个构造函数,减少重复代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication
{
    class Person
    {
        public string Name;
        public int Age;
    
        // 主构造函数
        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }
    
        // 调用上面的构造函数,提供默认值
        public Person() : this("默认用户", 18) { }
    }
    
    class Program
    {
        static void Main()
        {
            Person p1 = new Person();
            Console.WriteLine($"{p1.Name}, {p1.Age}"); 
        }
    }
}

6、static 构造函数(静态构造函数)

静态构造函数用于初始化静态成员,它不能带参数,也不能手动调用。它在类的第一次使用时自动执行且仅执行一次

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication
{
     class Database
    {
        public static string ConnectionString;
    
        // 静态构造函数
        static Database()
        {
            ConnectionString = "Server=localhost;Database=test;";
            Console.WriteLine("静态构造函数执行");
        }
    }
    
    class Program
    {
        static void Main()
        {
            //     触发静态构造函数
            Console.WriteLine(Database.ConnectionString);
        }
    }

}

7、私有构造函数(单例模式)

如想阻止类被外部实例化(例如用于 单例模式),可以使用 private 构造函数。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication
{
    class Singleton
    {
        private static Singleton _instance;
    
        // 私有构造函数,禁止外部实例化
        private Singleton() { }
    
        // 提供一个获取唯一实例的方法
        public static Singleton GetInstance()
        {
            if (_instance == null)
            {
                _instance = new Singleton();
            }
            return _instance;
        }
    }
    
    class Program
    {
        static void Main()
        {
            Singleton s1 = Singleton.GetInstance();
            Singleton s2 = Singleton.GetInstance();
            输出:True,两个引用指向同一个实例
            Console.WriteLine(s1 == s2); //     
        }
    }

}

8、结构体(struct)构造函数

结构体 struct 也可以定义构造函数,但必须显式赋值所有字段,且不能定义无参构造函数(C# 10 及以上版本支持)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication
{
    struct Point
    {
        public int X;
        public int Y;
    
        // 结构体构造函数
        public Point(int x, int y)
        {
            X = x;
            Y = y;
        }
    }
    
    class Program
    {
        static void Main()
        {
            Point p = new Point(10, 20);
            Console.WriteLine($"X: {p.X}, Y: {p.Y}");
        }
    }

}

推荐文档