不可不知的C#基础 2. -–从 struct 和 class的异同 说开去
我知道很多人都讨论过这个问题, 多我一个不多, 少我一个不少.
最近有人又问到这个问题, 所以想再说说. 万丈高楼平地起, 地基很重要. 懂了的人不要嫌罗嗦, 欢迎补充或者纠正.
从起源/定义说起
Struct 从C 的时代就已经有了(向丹尼斯.里奇致敬), 它是Structure 的缩写 -- 就是结构的意思. 它是一种最初级的数据结构, 它包含一到多个相同类型或不同类型的值或者变量. 它就像是一个存储数据的"包".
Class(类) 是有了面向对象概念之后才有的, 它"是创建对象的蓝图,描述了所创建的对象共同的属性和方法".
从它们被创立的用途可以看出Class 比Struct 负担了更大的使命.
类从出生的那天就被赋予了一个伟大的使命: 模拟真实世界的行为, 拥有继承和多态两种利器.
Struct 到了C#这个领域中有了一个进化, 它甚至可以实现接口(当然,这个也是C时代没有的东西), 在本文中会有一个简单的介绍.
值类型 VS 引用类型
Struct 是属于值类型这个阵容, 而所有class 都是引用类型.
这意味着什么?
当我们使用等号"赋值"时, 对于Struct而言就是将同样的值复制给另一个变量; 而对于Class而言就只是将它们的名字指向同一个对象.
看下面的实例:
class FooClass
{
public int FooValue;
}
struct FooStruct
{
public int FooValue;
}
class Program
{
static void Main(string[] args)
{
FooClass classObj = new FooClass();
classObj.FooValue = 0;
FooClass classObj2 = classObj;
classObj2.FooValue = 1;
FooStruct structObj = new FooStruct();
structObj.FooValue = 0;
FooStruct structObj2 = structObj;
structObj2.FooValue = 1;
}
}
Struct实现接口
前面提到了Struct可以实现接口, 下面我们引用一个实例:
interface IPromotion
{
void promote();
}
struct Employee : IPromotion
{
public string Name;
public int JobGrade;
public void promote()
{
JobGrade++;
}
public Employee(string name, int jobGrade)
{
this.Name = name;
this.JobGrade = jobGrade;
}
public override string ToString()
{
return string.Format("{0} ({1})", Name, JobGrade);
}
}
class Program
{
static void Main(string[] args)
{
Employee employee = new Employee("Cool Guy", 65);
IPromotion p = employee;
Console.WriteLine(employee);
p.promote();
Console.WriteLine(employee);
}
}
不同的用途
使用中在struct 和 class 两者间该选谁?
我们在编程中要实现某种数据结构时, 绝大部分情况下我们会选择class -- 因为它的强大和特定的使命. 但是当我们要传递或存储一些小数据结构时,可以考虑struct.
Net framework 下有很多已经定义好了的struct例如:
System.Drawing.Rectangle
System.Drawing.Color
System.Drawing.Point
使用时要记住struct的特性.
本文来自于喜乐的ASP.NET(Alex Song) 转贴请注明出处
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库