飞道的博客

C#构造函数(超详解,建议收藏!!!)

341人阅读  评论(0)

一、构造函数的定义

C#中构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。不带参数的构造函数称为“默认构造函数”。 无论什么时候,只要使用new运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。除非类是静态的,否则C#编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。默认构造函数:public 类名(){}

构造函数可分为:实例构造函数,静态构造函数,私有构造函数(下面会详细介绍)


二、构造函数时的注意事项

  • 构造函数没有返回值(void也不需要)
  • 一个类中可以有多个构造函数,可根据其参数个数,参数顺序,参数类型的不同来区分它们,这称作构造函数的重载
  • 构造函数的命名必须和类名相同
  • 调用子类的构造函数时会先调用父类的无参构造函数
  • 通常使用构造函数来进行类中字段的赋初值
  • 构造函数不能直接被调用,必须通过关键字new在创建对象时自动调用
  • 当一个类没有定义任何构造函数时,C#编译器会自动为其生成一个默认的隐式无参构造函数
  • 如果一个类中定义了有参构造函数,实例化时需要调用无参构造函数,这时我们就必须定义一个显式无参数构造函数,否则运行会报错

三、构造函数与一般函数的区别

1.声明方式不同

  • 构造函数:
    [访问修饰符] 类名(参数列表){函数主体}
  • 一般函数:
    [访问修饰符] 返回类型 方法名(参数列表){函数主体}

2.调用方式不同

  • 构造函数:在类实例化时调用
  • 一般函数:在类实例化后,必须手动调用

四、构造函数的作用

当需要给一个类中的字段进行初始化时,第一种:实例化后手动给属性赋值;第二种实例化时直接把参数放进去自动给属性赋值,显然第二种简单省事。下来我们一起看看两种方法:

第一种:

 class Program
    {
        static void Main(string[] args)
        {
            Student stu = new Student();
            stu.Id = 1807;
            stu.Name = "王麻子";
            stu.Sex = "男";
            stu.Score = 88.6;
            Console.WriteLine($"学号:{stu.Id}-姓名{stu.Name}-性别:{stu.Sex}-成绩{stu.Score}");
            Console.ReadLine();
        }
    }
class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Sex { get; set; }
        public double Score { get; set; }
    }

第二种:

class Program
    {
        static void Main(string[] args)
        {
        	Student stu1 = new Student();//无参构造函数调用
            Student stu = new Student(1807,"王麻子","男",88.6);
            Console.WriteLine("学号:{0}-姓名{1}-性别:{2}-成绩{3}",stu.Id,stu.Name,stu.Sex,stu.Score);
            Console.ReadLine();
        }
    }
class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Sex { get; set; }
        public double Score { get; set; }
        //无参构造函数
        public Student()
        {
            Console.WriteLine("无参构造函数被调用");
        }
        //有参构造函数
        public Student(int id,string name,string sex,double score) {
            this.Id=id;
            this.Name = name;
            this.Sex = sex;
            this.Score = score;
        }
    }

五、实例构造函数

  • 构造函数的名字与类名相同
  • 使用new表达式创建类的对象时,会调用其构造函数。并且通常初始化新对象的数据成员。
  • 除非类是静态的,否则会为没有构造函数的类,自动生成一个默认构造函数,并使用默认值来初始化对象字段。
  • 构造函数可以有参数,可以以参数个数、参数类型、参数顺序不同的形式存在多个构造函数。
class Program
    {
        static void Main(string[] args)
        {
        	Student stu1 = new Student();//无参构造函数调用
			Student stu2 = new Student(10,"20");
			Console.WriteLine($"X={stu1.X}---Y={stu1.Y}");//结果为:X=0---Y=0
            Console.WriteLine($"X={stu2.X}---Y={stu2.Y}");//结果为:X=10---Y=20
            Console.ReadLine();
        }
    }
class Student
    {
        public int X { get; set; }
        public string Y { get; set; }
        //无参构造函数
        public Student()
        {
            this.X = 0;
            this.Y = "0";
        }
        //有两个参数构造函数
        public Student(int x, string y) {
            this.X = x;
            this.Y = y;
        }
    }

六、静态构造函数

  • 静态构造函数不使用访问修饰符或不具有参数。
  • 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数以初始化类。
  • 不能直接调用静态构造函数。
  • 无法控制在程序中执行静态构造函数的时间。
  • 静态构造函数的一种典型用法是在类使用日志文件且将构造函数用于将条目写入到此文件中时使用。
  • 静态构造函数对于创建非托管代码的包装类也非常有用,这种情况下构造函数可调用 LoadLibrary 方法。
  • 如果静态构造函数引发异常,运行时将不会再次调用该函数,并且类型在程序运行所在的应用程序域的生存期内将保持未初始化。
class Program
    {
        public static int X = 0;//静态变量
       //实例构造函数
        public Program()
        {
            X = 1;
        }
        //静态构造函数
        static Program()
        {
            X = 2;//第二步,执行静态构造函数
        }
        //第一步,程序入口Main最先执行,然后执行静态变量public static int X = 0
        static void Main(string[] args)
        {
            Console.WriteLine(X);//结果为2
            Program dd = new Program();//第三步,执行构造函数
            Console.WriteLine(X);//结果为1
            Console.ReadLine();
        }
    }

调用类的静态函数时的执行顺序:

  • 静态变量==>静态构造函数==>实例构造函数
  • 静态变量==>静态构造函数==>静态函数

那么调用类的实例函数时的执行顺序则是:

  • 非静态变量==>实例构造函数==>实例函数

七、私有构造函数

私有构造函数是一种特殊的实例构造函数。 它通常只在包含静态成员的类中。 如果类具有一个或多个私有构造函数而没有公共构造函数,则在其他类(除嵌套类外)中无法进行实例化。

class Program
    {
        int i = 0;
        private Program()
        {
            i = 9;
        }
        static void Main(string[] args)
        {
            Program ss = new Program();
            Console.WriteLine($"i={ss.i}");//运行结果:i=9
            Console.ReadLine();
        }
    }
class person
    {
        //Program ddd = new Program();//注释打开会报错,错误信息:不可访问,因为它受保护级别限制。因为私有构造函数无法在类的外面实例化。
    }



觉得博主写的还可以,就点个赞再走嗷!!!


转载:https://blog.csdn.net/liu991029/article/details/106550226
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场