提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、类(Class)
- 二、结构体(Struct)
- 示例代码(定义类和结构体)
- 类的继承
- 代码示例(类的继承)
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
写单片机习惯了结构体的方式定义数据;导致现在写C# 忽略了类的方式定义
一、类(Class)
- 引用类型:类是引用类型,当一个类的实例被创建时,变量指向堆上的对象
- 继承:类支持继承,可以派生自另一个类,并且可以实现多个接口。
- 构造函数:类可以有无参或有参构造函数,默认情况下会有一个无参构造函数。
- 成员访问修饰符:类可以包含私有、受保护、公共等不同访问级别的成员。
- 垃圾回收:由于类是引用类型,所以不再使用的类实例将由CLR的垃圾收集器自动清理。
二、结构体(Struct)
- 值类型:结构体是值类型,意味着它们直接存储数据,而不是引用数据的位置。因此,当一个结构体实例被赋值给另一个变量时,实际上是复制了整个结构体的数据。
- 不支持继承:结构体不能从其他类或结构体继承,也不能作为其他类型的基类型。但是,结构体可以实现接口。
- 构造函数:结构体可以拥有有参构造函数,但默认情况下不会提供无参构造函数。如果定义了任何构造函数,则必须显式地定义无参构造函数。
- 成员访问修饰符:结构体也可以包含私有、公共等不同访问级别的成员,但是默认字段和事件是私有的。
- 性能:因为结构体是值类型,所以在某些场景下(如频繁创建和销毁的小型数据结构),使用结构体可能比使用类更高效。
示例代码(定义类和结构体)
代码如下(示例):
// 定义一个类
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
// 构造函数
public Person(string name, int age)
{
Name = name;
Age = age;
}
// 方法
public void Introduce()
{
Console.WriteLine($"Hello, my name is {Name} and I'm {Age} years old.");
}
}
// 定义一个结构体
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
// 构造函数
public Point(int x, int y)
{
X = x;
Y = y;
}
// 方法
public void PrintPoint()
{
Console.WriteLine($"Point: ({X}, {Y})");
}
}
class Program
{
static void Main(string[] args)
{
// 使用类
Person person1 = new Person("Alice", 30);
Person person2 = person1;
person2.Age = 35;
person1.Introduce(); // 输出 "Hello, my name is Alice and I'm 35 years old."
// 使用结构体
Point point1 = new Point(1, 2);
Point point2 = point1;
point2.Y = 10;
point1.PrintPoint(); // 输出 "Point: (1, 2)"
point2.PrintPoint(); // 输出 "Point: (1, 10)"
}
}
类的继承
C#中的类的继承是指一个类(派生类)从另一个类(基类)中继承属性和方法。这允许代码的重用和扩展,使派生类可以继承基类的特性,并在其基础上添加或覆盖特定的行为。
代码示例(类的继承)
// 基类
public class Animal
{
public string Name { get; set; }
public void Speak()
{
Console.WriteLine("Animal speaks");
}
}
// 派生类
public class Dog : Animal
{
public string Breed { get; set; }
public new void Speak()
{
Console.WriteLine("Dog barks");
}
}
// 另一个派生类
public class Cat : Animal
{
public string Color { get; set; }
public void Meow()
{
Console.WriteLine("Cat meows");
}
}
// 程序入口
class Program
{
static void Main(string[] args)
{
// 创建一个Dog对象
Dog myDog = new Dog();
myDog.Name = "Fido";
myDog.Breed = "Golden Retriever";
// 调用基类的Speak方法
myDog.Speak(); // 输出: Dog barks
// 创建一个Cat对象
Cat myCat = new Cat();
myCat.Name = "Kitty";
myCat.Color = "White";
// 调用基类的Speak方法
myCat.Speak(); // 输出: Animal speaks
// 调用派生类的Meow方法
myCat.Meow(); // 输出: Cat meows
}
}
总结
结构体对内存友好,用完及时释放,但是对面向对象编程不友好,当大量数据时操作繁琐复杂(不是老手不建议使用);类的方式适合面向对象编程,特别是处理大量数据的时候更能体现其价值;