C#基础:类class与结构struct的区别
创始人
2024-04-03 04:34:42
0

一、类class

类class是引用类型,可以直接赋值为null,默认值也是null

XClass xClass = null;//语法正确

    一般来说,某个类对象使用另一个类的对象赋值时,则两者共用一个内存地址【节约内存空间】,ReferenceEquals引用比较此时返回true

            XClass xClass3 = new XClass() { Id = 7, Name = "天晴之海" };XClass xClass4 = xClass3;

类的构造函数(构造方法)

如果一个类没有显示定义构造函数,则默认有一个无参构造函数,

如果一个类已定义了带参数的构造函数,如果不手动定义无参构造函数,则没有无参构造函数

特殊类String:

特殊类【字符串String】虽然是引用类型,但对字符串的更新并不会修改字符串的原实际值,

字符串作为参数传递并不能篡改原来的值,

可以认为字符串虽然是引用类型,但使用时按值类型处理

二、结构struct

结构struct是值类型,不能直接赋值为null,结构的默认值为0,false,类型名称字符串等

XStruct xStruct=null;//语法错误,不能为值类型赋值为null

如果想为值类型赋值为null,请使用可空类型Nullable

public struct Nullable where T : struct

比如如下代码即可编译通过:

Nullable xStruct = null;//可空值类型

或者简化为

XStruct? xStruct = null;//可空值类型的简化

    某个结构对象使用另一个结构的对象赋值时,则两者的内存地址完全不同,第二个结构对象新开一个内存空间,只不过内存的值完全一致【内存空间增加】,ReferenceEquals引用比较此时返回false

结构的构造函数

所有结构都自动继承抽象值类型基类ValueType,有个默认无参构造函数ValueType(),因此无法在自定义结构中定义无参构造函数

using System.Runtime.InteropServices;
using System.Security;namespace System
{//// 摘要://     为值类型提供基类。[ComVisible(true)]public abstract class ValueType{//// 摘要://     初始化 System.ValueType 类的新实例。protected ValueType();//// 摘要://     指示此实例与指定对象是否相等。//// 参数://   obj://     要与当前实例进行比较的对象。//// 返回结果://     如果 true 和该实例具有相同的类型并表示相同的值,则为 obj;否则为 false。[SecuritySafeCritical]public override bool Equals(object obj);//// 摘要://     返回此实例的哈希代码。//// 返回结果://     一个 32 位带符号整数,它是此实例的哈希代码。[SecuritySafeCritical]public override int GetHashCode();//// 摘要://     返回此实例的完全限定类型名称。//// 返回结果://     完全限定的类型名称public override string ToString();}
}

值类型重写了Equals方法,如果一个值类型的具体属性值完全一致时,两个对象是相等的

三、测试控制台应用程序GenericTemplateDemo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace GenericTemplateDemo
{class Program{static void Main(string[] args){Console.SetWindowSize(120, 30);Console.WriteLine($"结构的默认值为类型名(一定不为null):{default(XStruct)},类型名为【{typeof(XStruct)}】");Console.WriteLine($"类的默认值为null?【{default(XClass) == null}】");Console.WriteLine("---------------------------------结构的Equal比较---------------------------------");XStruct xStruct1 = new XStruct() { Id = 5, Name = "ABC" };XStruct xStruct2 = new XStruct("ABC") { Id = 5 };Console.WriteLine($"结构一的内容{{Id:{xStruct1.Id},Name:{xStruct1.Name}}}");Console.WriteLine($"结构二的内容{{Id:{xStruct2.Id},Name:{xStruct2.Name}}}");Console.WriteLine();Console.WriteLine($"比较两个结构的实例值是否相等:{xStruct1.Equals(xStruct2)}");Console.WriteLine($"比较两个结构的引用是否指向同一个实例:{ReferenceEquals(xStruct1, xStruct2)}");XStruct xStruct3 = new XStruct("修吾") { Id = 8 };XStruct xStruct4 = xStruct3;Console.WriteLine($"结构三的内容{{Id:{xStruct3.Id},Name:{xStruct3.Name}}}");Console.WriteLine($"结构四的内容{{Id:{xStruct4.Id},Name:{xStruct4.Name}}}");Console.WriteLine();Console.WriteLine($"比较两个结构的实例值是否相等:{xStruct3.Equals(xStruct4)}");Console.WriteLine($"比较两个结构的引用是否指向同一个实例:{ReferenceEquals(xStruct3, xStruct4)}");Console.WriteLine("---------------------------------类的Equal比较---------------------------------");XClass xClass1 = new XClass() { Id = 6, Name = "毒瘴泉" };XClass xClass2 = new XClass("毒瘴泉") { Id = 6 };Console.WriteLine($"类一的内容{{Id:{xClass1.Id},Name:{xClass1.Name}}}");Console.WriteLine($"类二的内容{{Id:{xClass2.Id},Name:{xClass2.Name}}}");Console.WriteLine();Console.WriteLine($"比较两个类的实例值是否相等:{xClass1.Equals(xClass2)}");Console.WriteLine($"比较两个类的引用是否指向同一个实例:{ReferenceEquals(xClass1, xClass2)}");Console.WriteLine();XClass xClass3 = new XClass() { Id = 7, Name = "天晴之海" };XClass xClass4 = xClass3;Console.WriteLine($"类三的内容{{Id:{xClass3.Id},Name:{xClass3.Name}}}");Console.WriteLine($"类四的内容{{Id:{xClass4.Id},Name:{xClass4.Name}}}");Console.WriteLine();Console.WriteLine($"比较两个类的实例值是否相等:{xClass3.Equals(xClass4)}");Console.WriteLine($"比较两个类的引用是否指向同一个实例:{ReferenceEquals(xClass3, xClass4)}");Console.ReadLine();}        }/// /// 测试用的结构,结构继承ValueType,而ValueType重写了Equals(object obj)方法,因此比较/// 结构不允许显式定义无参的构造函数,因 结构struct一经定义,自动会生成一个无参构造函数/// struct XStruct{public XStruct(string name){Id = 0;Name = name;}public int Id { get; set; }public string Name { get; set; }}/// /// 测试用的类/// class XClass{public XClass(){}public XClass(string name){Id = 0;Name = name;}public int Id { get; set; }public string Name { get; set; }}
}

四、程序运行如图:

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...