请问为何这个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#中,你不写构造函数,会有一个默认的无参公有构造函数
构造函数是一种特殊的方法,它会在创建对象时自动调用,并且负责初始化对象的一些字段和属性。因此,所有类都需要至少一个构造函数,而如果程序员没有定义构造函数,编译器就会提供一个默认的无参构造函数。当程序员在创建对象时,如果没有显式地调用构造函数,编译器会默认调用无参构造函数。所以有些程序不需要调用构造函数就能运行而不会报错,是因为使用了编译器提供的默认的无参构造函数。而有些程序可能需要定义自己的构造函数,以便对对象做进一步的初始化操作。
以下是一个不需要调用构造函数就能正常运行的程序例子:
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
方法中,我们创建了两个对象 obj1
和 obj2
,一个有参构造函数,一个无参构造函数。如果我们没有定义无参构造函数,程序在编译时就会报错。在这个程序中,我们展示了不调用构造函数、调用有参构造函数、调用无参构造函数的三种不同场景。