C#入门中,不理解构造函数问题

请问为何这个C#程序不需要调用构造函数也不会报错了?

using System;
namespace ConsoleApp5
{
    /// <summary>
    /// 人类Person
    /// </summary>
    class Person        //  在人类里,声明三个属性
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Gender { get; set; }    
    }

    /// <summary>
    /// 学生类
    /// </summary>
    class Student : Person      //  类名后面加冒号,表示学生类,继承人类
    {
        public float Score { get; set; }        //学生类,在人类的基础上,增加一个分数属性

        public void StuSayHello()       //声明一个方法,进行自我介绍
        {

            Console.WriteLine("大家好,我是学生:{0},性别:{1},我今年{2}岁,这次的考试分数是{3}",
                this.Name, this.Gender, this.Age, this.Score);

        }
    }
    /// <summary>
    /// 教师类
    /// </summary>
    class Teacher : Person          //  类名后面加冒号,表示教师类,继承人类
    {
        public string Subject { get; set; }          //教师类,在人类的基础上,增加一个学科属性
        public void TeacherSayHello()       //声明一个方法,进行自我介绍
        {
            Console.WriteLine("大家好,我是{0}老师,性别:{1},我今年{2}岁,我带的科目是{3}",
                this.Name, this.Gender, this.Age, this.Subject);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Student stu = new Student();        //声明一个学生对象
            //给对象初始化
            stu.Name = "王迪";
            stu.Gender = "女";
            stu.Age = 18;
            stu.Score = 80;
            stu.StuSayHello();          //调用学生对象的StuSayHello()方法,输出自我介绍
            Console.ReadLine();
        }
    }
}


```

Student stu = new Student();
这里调用了默认的公有无参构造函数
C#中,你不写构造函数,会有一个默认的无参公有构造函数

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7411534
  • 你也可以参考下这篇文章:C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题
  • 除此之外, 这篇博客: 如何用C#制作简易的飞行棋(内有详细步骤,代码和解析,欢迎讨论学习)中的 游戏成品 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在这里插入图片描述

  • 您还可以看一下 guiplan创始人周老师老师的【c#解放双手】模拟鼠标键盘纯自动化操作课程中的 补充:模拟双击小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    构造函数是一种特殊的方法,它会在创建对象时自动调用,并且负责初始化对象的一些字段和属性。因此,所有类都需要至少一个构造函数,而如果程序员没有定义构造函数,编译器就会提供一个默认的无参构造函数。当程序员在创建对象时,如果没有显式地调用构造函数,编译器会默认调用无参构造函数。所以有些程序不需要调用构造函数就能运行而不会报错,是因为使用了编译器提供的默认的无参构造函数。而有些程序可能需要定义自己的构造函数,以便对对象做进一步的初始化操作。

    以下是一个不需要调用构造函数就能正常运行的程序例子:

    using System;
    
    class MyClass
    {
        public int x;
    
        static void Main()
        {
            MyClass obj = new MyClass();
            obj.x = 10;
            Console.WriteLine(obj.x);
        }
    }
    

    这个程序中,编译器提供了一个默认的无参构造函数,用于初始化字段 x,并且在 Main 方法中创建了一个 MyClass 类型的对象 obj,这个对象可以通过访问 x 字段实现赋值和输出。在这个程序中,调用构造函数的过程被编译器自动完成了。

    除了默认的构造函数以外,程序员还可以定义自己的构造函数,来对对象进行更进一步的初始化操作。下面是一个定义了构造函数的程序例子:

    using System;
    
    class MyClass
    {
        public int x;
    
        public MyClass(int value)
        {
            x = value;
        }
    
        static void Main()
        {
            MyClass obj = new MyClass(10);
            Console.WriteLine(obj.x);
        }
    }
    

    这个程序中,我们自定义了一个构造函数 MyClass(int value),用于对字段 x 进行初始化,并且在 Main 方法中创建了一个 MyClass 类型的对象 obj,这个对象的 x 字段被初始化为 10。在这个程序中,我们必须显式调用构造函数,编译器不会自动调用。

    对于提供了自定义构造函数的类,编译器不会提供默认的无参构造函数,因此如果程序员想要在创建对象时不调用任何构造函数,就必须显式地定义一个无参构造函数。否则,试图创建对象时会出现编译错误。下面是为类提供了自定义构造函数的程序例子:

    using System;
    
    class MyClass
    {
        public int x;
    
        public MyClass(int value)
        {
            x = value;
        }
    
        public MyClass()
        {
            Console.WriteLine("调用了 MyClass 的无参构造函数");
        }
    
        static void Main()
        {
            MyClass obj1 = new MyClass(10);
            Console.WriteLine(obj1.x);
    
            MyClass obj2 = new MyClass();
            Console.WriteLine(obj2.x);
        }
    }
    

    这个程序中,我们定义了两个构造函数,MyClass(int value) 用于传入一个参数 value 初始化 x 字段,MyClass() 是无参构造函数,用于输出一句话并不做任何初始化操作。在 Main 方法中,我们创建了两个对象 obj1obj2,一个有参构造函数,一个无参构造函数。如果我们没有定义无参构造函数,程序在编译时就会报错。在这个程序中,我们展示了不调用构造函数、调用有参构造函数、调用无参构造函数的三种不同场景。