结构struct

C#中的struct与C++中的struct,有很大不同,在C#中class是引用类型,struct却是值类型,在栈上分配实例,struct是密封的,这意味着它们不能被继承,和所有值类型一样,结构类型变量含有自己的数据,因此struct类型的变量不能为null,俩个结构变量不能引用同一对象。

结构体的赋值

把一个结构赋值给另一个结构,就将一个结构的值复制给另一个结构,这和复制类变量不同,复制类变量时只复制引用。

结构体的成员与实例的创建

结构可以有实例构造函数静态构造函数,但不允许有析构函数C#隐式地为每个结构提供一个无参数的构造函数,这个构造函数把结构的每个成员设置为该类型的默认值,值成员设置成它们的默认值,引用成员设置为null,隐式的无参构造函数对每个struct都存在,而且不能删除或重定义即使在重载其他含参的构造函数时,也不需要自实现无参的构造函数,这与C#中的类不同,对于类,编译器只在没有其他构造函数声明时提供隐式的无参构造函数,如果重载了其他构造函数,则需要显示地声明无参构造函数,否则在定义变量时将不能使用无参的构造函数。调用一个struct中的构造函数(包括隐式无参构造函数),要使用new运算符(即使不从堆中分配内存也要使用new运算符)

也可以不使用new运算符创建结构的实例,这样的话就不会调用到构造函数,然而这样做会有一些限制:
(1)只有在显式设置数据成员之后,才能使用它们的值
(2)只有在对所有数据成员赋值之后,才能调用任何函数成员

静态构造函数:与C#中的类相似,结构的静态构造函数创建并初始化静态数据成员,并且不能引用实例成员,与类的静态构造函数规则一样,以下俩种行为,任意一种发生之前,将会调用静态构造函数:
(1)调用显示声明的构造函数
(2)引用结构的静态成员

字段不能在结构体中初始化

在结构中字段初始化语句是不允许的

    struct A
    {
        //public int a=10;  会造成编译错误
        public int a;
    }

结构是密封的

结构总是隐式密封的,因此结构不支持继承,因此不能在结构成员声明时使用protected、internal、abstract、virtual这些修饰符,结构体本身派生自System.ValueType,System.ValueType派生自object,所以可以使用new、override修饰符,当创建一个和基类System.ValueType的成员有相同名称的成员时就可以使用这俩个修饰符。

结构体作为返回值和参数

结构体可以用作返回值和参数
返回值:当结构作为返回值时,将创建它的副本并从函数成员返回
值参数:当结构被用作值参数时,将创建实参结构的副本,该副本用于方法的执行中
ref和out参数:如果把一个结构用作ref、out参数,传入方法的是该结构的一个引用,这样就可以修改其数据成员

C#中结构体与类的区别

(1)类是引用类型,结构是值类型
(2)结构不支持继承
(3)结构不能声明默认的构造函数和析构函数
(4)类只能通过new来实例化,而结构可以不通过new来实例化
(4)正常情况下类的对象是存储在堆空间中,结构存储在栈空间,堆空间大、访问速度慢,栈空间小、访问速度快,故而当我们描述一个轻量级对象的时候,结构可提高效率,成本更低,当然也得从需求出发,假如在传值的时候希望传递的是对象的引用而不是对象的拷贝,就应该使用类了

结构体的其他信息

(1)对结构进行分配比创建类的实例开销小,所以使用结构体代替类有时可以提高性能,但要注意到装箱和拆箱的高代价
(2)预定义简单类型(int、short、long等)尽管在.NET和C#中被视为原始类型,实际上在.NET中都实现为结构
(3)可以使用与声明分部类相同的方法声明分部结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值