下面是对于C#基础教程中class与struct的区别的详细讲解:
什么是class与struct
class
和struct
都是C#中用于封装数据和行为的能力。他们两个非常相似,并且可以实现相同的功能。
class
是引用类型,struct
是值类型。使用class
类型创建的对象,会在堆中分配内存。当你使用new
操作符实例化一个类对象时,实际上是在堆上为类分配了一块内存空间。唯一标识这块内存空间的是该对象的引用地址。而struct
类型则会在栈中分配内存,在定义值类型变量时,变量实际上存储的是值类型对象的副本,而不是引用,因此它的操作更快。
class与struct的区别
- 封装性
在C#中,class
和struct
都可以用来封装数据和行为;但是他们的封装方式不同。
class
是引用类型,因此使用class
定义的对象始终是基于对象引用的概念。换句话说,使用class
处理数据,就是让类实例引用数据,并且通常情况下,只会创建一个类实例来引用这些数据。
class Animal
{
public string Name { get; set; }
}
class Example
{
static void Main()
{
Animal firstAnimal = new Animal();
Animal secondAnimal = new Animal();
firstAnimal.Name = "Tiger";
secondAnimal.Name = "Lion";
Console.WriteLine(firstAnimal.Name); // Output: Tiger
Console.WriteLine(secondAnimal.Name); // Output: Lion
}
}
struct
是值类型,因此使用struct
封装的数据通常是基于值的概念。使用struct
时,每个结构实例都有自己的数据和状态。结构的实例通常都是基于值类型分配的组合类型。
struct Animal
{
public string Name { get; set; }
}
class Example
{
static void Main()
{
Animal firstAnimal = new Animal();
Animal secondAnimal = firstAnimal;
firstAnimal.Name = "Tiger";
secondAnimal.Name = "Lion";
Console.WriteLine(firstAnimal.Name); // Output: Tiger
Console.WriteLine(secondAnimal.Name); // Output: Lion
}
}
结果显示,使用结构实例时,数据值真正地根据值属性定义,并且每个实例都包含此特定值。
- 继承
在C#中,class
支持类的继承,而且继承是OOP程序设计中非常常见的技术。而struct
则不支持继承。
class Animal
{
public string Name { get; set; }
public virtual void Move()
{
Console.WriteLine("I am animal and I can move!");
}
}
class Mammal : Animal
{
public bool Fur { get; set; }
}
class Example
{
static void Main()
{
Animal animal = new Animal();
Mammal mammal = new Mammal();
mammal.Fur = true;
mammal.Move(); // Output: I am animal and I can move!
}
}
- 可空性
在C#中,可以使用可空类型定义类型的可空属性。这在某些代码中非常有用。
由于struct
是值类型,因此它可以被定义为可空类型。class
是引用类型,不能直接定义可空属性。
struct Animal
{
public string Name { get; set; }
}
class Example
{
static void Main()
{
Animal? animal = null;
Console.WriteLine(animal.HasValue); // Output: False
}
}
- 默认继承
在C#中,所有的类都是object
的派生类,这意味着类具有object
类的所有成员。而struct
则不是由object
派生的,因此它们需要单独实现任何成员。
以下是来自class
和 struct
的默认派生类的示例:
class ExampleClass
{
// The class inherits from object, so it has ToString
public override string ToString()
{
return "I am a class.";
}
}
struct ExampleStruct
{
// The struct doesn't inherit from object, so it doesn't
// have ToString
//public override string ToString()
//{
// return "I am a struct.";
//}
}
class Example
{
static void Main()
{
ExampleClass a = new ExampleClass();
ExampleStruct b = new ExampleStruct();
Console.WriteLine(a.ToString()); // Output: I am a class.
//Console.WriteLine(b.ToString()); // Error CS1061 类型“ExampleStruct”上不存在“ToString”的定义,且找不到可接受该名称的第一个参数的扩展方法
}
}
结论
class
和struct
在C#中都是封装数据和行为的优秀工具。但是,它们有不同的特征和限制用法。一般来说,开发人员可以根据特定的开发场景和需要决定使用哪种类型。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#基础教程之类class与结构struct的区别 - Python技术站