C#核心知识回顾——5.结构体和类区别、抽象类和接口、核心知识图解
发布人:shili8
发布时间:2024-07-21 23:36
阅读次数:0
以下是为您生成的一篇关于 C#核心知识回顾——结构体和类区别、抽象类和接口、核心知识图解的文章:---# C#核心知识回顾——结构体和类区别、抽象类和接口在 C#编程中,结构体(Struct)和类(Class)是两种重要的数据类型,它们在内存分配、成员访问、继承等方面存在显著差异。同时,抽象类(Abstract Class)和接口(Interface)也是构建灵活和可扩展代码的关键概念。本文将详细探讨这些核心知识,并通过代码示例和图解进行深入理解。##一、结构体和类的区别###1.内存分配结构体是值类型,在栈上分配内存,当结构体变量超出其作用域时,会自动释放内存。而类是引用类型,在堆上分配内存,通过垃圾回收机制来释放。
csharpstruct PointStruct{ public int X; public int Y;}class PointClass{ public int X; public int Y;}void Main(){ PointStruct structPoint = new PointStruct(); //结构体在栈上分配 PointClass classPoint = new PointClass(); //类在堆上分配}###2.成员默认值结构体的成员默认值为其类型的默认值。例如,整数类型的默认值为0,引用类型的默认值为 null。而类的成员默认值为 null。
csharpstruct PointStruct{ public int X; public string Name;}class PointClass{ public int X; public string Name;}void Main(){ PointStruct structPoint; // X为0,Name为 null PointClass classPoint; // X为0,Name为 null}###3.传递方式结构体作为参数传递时,是按值传递,会复制整个结构体的值。而类作为参数传递时,是按引用传递,传递的是对象的引用。
csharpstruct PointStruct{ public int X; public int Y;}class PointClass{ public int X; public int Y;}void ModifyStruct(PointStruct point){ point.X =10;}void ModifyClass(PointClass point){ point.X =10;}void Main(){ PointStruct structPoint = new PointStruct { X =5, Y =5 }; ModifyStruct(structPoint); //结构体的值未改变 Console.WriteLine(structPoint.X); //输出5 PointClass classPoint = new PointClass { X =5, Y =5 }; ModifyClass(classPoint); //类的对象的值改变 Console.WriteLine(classPoint.X); //输出10}###4.继承结构体不能继承其他结构体或类,但可以实现接口。类可以继承其他类(单继承)和实现多个接口。
csharpinterface IPoint{ void Print();}struct PointStruct : IPoint //结构体可以实现接口{ public int X; public int Y; public void Print() { Console.WriteLine($"X: {X}, Y: {Y}"); }}class BaseClass{ public void BaseMethod() { Console.WriteLine("Base Method"); }}class DerivedClass : BaseClass //类可以继承其他类{ public void DerivedMethod() { Console.WriteLine("Derived Method"); }}###5.构造函数结构体不能定义无参构造函数,但可以定义带参数的构造函数。类可以定义无参和带参数的构造函数。
csharpstruct PointStruct{ public int X; public int Y; public PointStruct(int x, int y) //结构体的带参数构造函数 { X = x; Y = y; }}class PointClass{ public int X; public int Y; public PointClass() //类的无参构造函数 { X =0; Y =0; } public PointClass(int x, int y) //类的带参数构造函数 { X = x; Y = y; }}##二、抽象类和接口###1.抽象类抽象类是一种不能被实例化的类,它可以包含抽象方法和非抽象方法。抽象方法没有实现,只有方法签名,子类必须实现这些抽象方法。
csharpabstract class Animal{ public abstract void MakeSound(); //抽象方法 public void Eat() //非抽象方法 { Console.WriteLine("Eating..."); }}class Dog : Animal{ public override void MakeSound() //实现抽象方法 { Console.WriteLine("Bark"); }}###2.接口接口定义了一组方法、属性、事件和索引器的签名,但没有实现。类或结构体可以实现多个接口。
csharpinterface IRun{ void Run();}interface IFly{ void Fly();}class Bird : IRun, IFly{ public void Run() //实现接口方法 { Console.WriteLine("Running"); } public void Fly() //实现接口方法 { Console.WriteLine("Flying"); }}###3.区别-抽象类可以包含字段、属性、方法的实现,而接口只能包含方法、属性、事件和索引器的签名。-类只能继承一个抽象类,但可以实现多个接口。-抽象类中的成员可以有访问修饰符,而接口中的成员默认是 public。##三、核心知识图解为了更直观地理解结构体和类、抽象类和接口的关系,我们可以通过以下图解:1.结构体和类的关系![结构体和类的关系]( C#中结构体和类的区别、抽象类和接口的详细介绍,以及相关的代码示例和图解,希望能够帮助您更深入地理解这些核心概念,从而在编程中更加灵活和准确地运用它们。---以上内容仅供参考,您可以根据实际需求进行调整和修改。如果您还有其他问题,欢迎继续向我提问。