9.7结构类型
第8章提到过结构和类非常相似,但结构是值类型,而类是引用类型。这意味着什么?最简单的方式是用一个示例来说明
class Chapter09Ex03 { public static void Method() { MyClass objectA = new MyClass(); MyClass objectB = objectA; objectA.val = 10; objectB.val = 20; myStruct structA = new myStruct(); myStruct structB = structA; structA.val = 30; structB.val = 40; Console.WriteLine("objectA.val = {0}", objectA.val); Console.WriteLine("objectB.val = {0}", objectB.val); Console.WriteLine("structA.val = {0}", structA.val); Console.WriteLine("structB.val = {0}", structB.val); } }
这个应用程序包含两个类型定义。一个是结构myStruct的定义,它有一个public int字段val,另外一个是类MyClass的定义,它包含一个相同的字段(第10章介绍类的成员,如字段,现在只要知道它们的语法是相同的即可)。
接着对两种类型的实例执行相同的操作:
尽管对两种类型的变量执行了相同的操作,但结果是不同的。在显示val字段的值时,两个object类型有相同的值,而结构类型有不同的值。为什么会这样呢?
对象是引用类型。在把对象赋给变量时,实际上是把带有一个指针的变量赋给了该指针所指向的对象。在实际代码中,指针是内存中的第一个地址。在这种情况下,地址是内存中该对象所在的位置。在下面的代码,把第一个对象引用赋给类型MyClass的第二个变量时,实际上是复制了这个地址。
MyClass objectB=objectA;
这样两个变量就包含同一个对象的指针。
结构是值类型。其变量并不是包含结构的指针,而是包含结构本身。在用下面的代码把第一个结构赋给类型为myStruct的第二个变量时,实际上是把第一个结构的所有信息复制到另一个结构中。
myStruct structB=structA;
这个过程与本书前面介绍的简单变量类型如int是一样的。最终的结果是两个结构类型变量包含不同的结构。使用指针的技术隐藏在托管C#代码中,它使得代码更简单。使用C#中的不安全代码可以进行低级操作,如指针操作,但这是一个较高级的论题,这里不讨论。
作者:Chuck Lu GitHub |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 如何基于DeepSeek开展AI项目