C# 类(Class)详解
C# 类(class)是面向对象编程中的一个核心概念,它定义了一种数据类型,描述了一组属性、方法和事件等成员。类作为对象的蓝图,用于封装数据和行为。通过类,你可以创建对象,并通过对象访问和操作类中定义的成员。
一、类的基本概念
- 类是引用类型:类的实例化对象存储在堆内存中,传递的是引用(指针)而不是副本。
- 封装:类允许将数据和行为封装在一个单元中,提供了对数据的访问控制(如通过访问修饰符来控制对字段和方法的访问)。
- 构造函数:类可以包含构造函数,用于初始化类的实例。
- 继承:类可以继承其他类,继承使得一个类可以获取另一个类的成员。
- 多态:类可以实现方法重载和方法重写,支持多态性。
二、定义类
定义一个类需要使用 class 关键字。类中可以包含字段、属性、方法和构造函数等成员。
class Person
{
// 字段
public string Name;
public int Age;
// 构造函数
public Person(string name, int age)
{
Name = name;
Age = age;
}
// 方法
public void Introduce()
{
Console.WriteLine($"Hi, my name is {Name} and I am {Age} years old.");
}
}
三、创建类的实例
通过 new 关键字来创建类的实例,然后使用该实例访问类的成员。
Person person1 = new Person("John", 30); // 创建对象并初始化
person1.Introduce(); // 调用方法
Console.WriteLine(person1.Name); // 访问字段
四、类的成员
类可以包含多种成员,如字段、属性、方法、构造函数等。下面是每个成员的具体说明。
1. 字段(Field)
字段是类中的变量,用于存储对象的数据。
class Car
{
public string Model;
public int Year;
}
2. 属性(Property)
属性是对字段的封装,允许通过 get 和 set 方法访问字段的值。
class Car
{
private string model;
public string Model
{
get { return model; }
set { model = value; }
}
}
3. 方法(Method)
方法是类中的函数,用于定义对象可以执行的行为。
class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}
4. 构造函数(Constructor)
构造函数用于初始化类的实例。默认构造函数会由编译器自动生成,但你可以定义自定义构造函数。
class Car
{
public string Model;
public int Year;
public Car(string model, int year)
{
Model = model;
Year = year;
}
}
5. 析构函数(Destructor)
析构函数在对象被垃圾回收时自动调用,用于释放资源。
class Car
{
~Car() // 析构函数
{
Console.WriteLine("Car object is being destroyed.");
}
}
五、类的访问修饰符
C# 提供了多种访问修饰符来控制对类和类成员的访问权限:
public:可以被任何类访问。private:只能在类的内部访问。protected:只能在类及其子类中访问。internal:只能在当前程序集中访问。protected internal:可以在当前程序集中以及从派生类中访问。private protected:只能在当前类及其派生类中访问。
class Car
{
private string model; // 只能在Car类内部访问
public int year; // 可以在任何地方访问
}
六、类的继承
C# 支持类继承,子类可以继承父类的成员。继承让你可以创建一个新类,该类具备父类的功能,并可以添加自己的功能或重写父类的方法。
class Animal
{
public void Eat()
{
Console.WriteLine("Animal is eating.");
}
}
class Dog : Animal // Dog 类继承 Animal 类
{
public void Bark()
{
Console.WriteLine("Dog is barking.");
}
}
Dog dog = new Dog();
dog.Eat(); // 继承自Animal类的方法
dog.Bark(); // Dog类自己的方法
七、多态性
多态性使得一个父类引用可以指向子类对象,调用方法时会根据实际对象类型执行相应的方法。
1. 方法重写(Overriding)
通过重写(override)父类的方法,子类可以提供自己的实现。
class Animal
{
public virtual void Speak()
{
Console.WriteLine("Animal speaks");
}
}
class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("Dog barks");
}
}
Animal animal = new Dog();
animal.Speak(); // 输出 Dog barks
2. 方法重载(Overloading)
方法重载是指同名方法可以根据不同的参数类型或数量来区分。
class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public double Add(double a, double b)
{
return a + b;
}
}
八、类的实例化和内存管理
1. 类实例化
通过 new 关键字来创建类的实例,并调用构造函数初始化对象。
Person person = new Person("Alice", 25);
2. 类的内存管理
- 堆内存:类实例通常分配在堆内存中,通过引用进行访问。
- 垃圾回收(GC):类实例的内存会在不再使用时由垃圾回收器回收。
九、参考文献和文档
通过类,你可以实现强大的面向对象编程功能,提升代码的可维护性、扩展性和重用性。
更多详细内容,请关注其他相关文章!