翼度科技»论坛 编程开发 .net 查看内容

C#.Net筑基-类型系统②常见类型

11

主题

11

帖子

33

积分

新手上路

Rank: 1

积分
33

01、结构体类型Struct

结构体 struct 是一种用户自定义的值类型,常用于定义一些简单(轻量)的数据结构。对于一些局部使用的数据结构,优先使用结构体,效率要高很多。

  • 可以有构造函数,也可以没有。因此初始化时可以new,也可以用默认default。但当给字段设置了初始值时,则必须有显示的构造函数。
  • 结构体中可以定义字段、属性、方法,不能使用终结器。
  • 结构体可继承接口,并实现接口,但不能继承其他类、结构体。
  • 结构体是值类型,被分配在栈上面,因此在参数传递时为值传递。
⁉️结构体始终都是分配在栈上吗?—— 不一定,当结构体是类的成员时,则会随对象一起分配在堆上。同时当结构体上有引用类型字段时,该字段只存储引用对象的地址,引用对象还是分配在堆上。
  1. void Main()
  2. {
  3.         Point p1 = default;
  4.         //Point p1 = default(Point);
  5.         Point p2 = new Point(1, 2);
  6.         p1.X = 100;
  7.         p2.X = 100;
  8. }
  9. public struct Point
  10. {
  11.         public int X;
  12.         public int Y;
  13.         public Point(int x, int y)
  14.         {
  15.                 X = x;
  16.                 Y = y;
  17.         }
  18. }
复制代码
1.1、只读结构体与只读函数

readonly struct申明一个只读的结构体,其所有字段、属性都必须是只读的。
  1. public readonly struct Point
  2. {
  3.         public readonly int X,Y;
  4. }
复制代码
用在方法上,该方法中不可修改任何字段值。这只能用在结构体中,结构体不能继承,不知道这个特性有什么用?
  1. public struct Point
  2. {
  3.         public int X;
  4.         public int Y;
  5.         public readonly int GetValue()
  6.         {
  7.                 X--;   //Error:不可修改
  8.                 return X + Y;
  9.         }
  10. }
复制代码
1.2、Ref 结构体

ref 结构类型 用ref struct申明,该结构体只能存储在栈上,因此任何会导致其分配到堆上的行为都不支持,如装箱、拆箱,作为类的成员等都不支持。
Ref 结构体 可用于一些高性能场景,System.SpanReadOnlySpan 都是 readonly ref struct结构体。
  1. public ref struct Point
  2. {
  3.         public int X,Y;
  4. }
复制代码
02、枚举Enum

枚举类型 是由基础值类型(byte、int、long等)组成的一组命名常量的值类型,用enum来申明定义。常用于一些有固定值的类别申明,如性别、方向、数据类型等。

  • 枚举成员默认是int,可以修改为其他整数类型,如byte、short、uint、long等。
  • 枚举项可设置值,也可省略,或者部分设置值。值默认是从0开始,并按顺序依次递增。
  • 枚举变量的默认值始终是0。
  • 枚举本质上就是命名常量,因此可以与值类型进行相互转换(强制转换)。
  • 特性Description常用来定义枚项在UI上的显示内容,使用反射获取。
  1. public enum UserType : int  //常量类型,可以修改为其他整数类型
  2. {
  3.     [Description("普通会员")]
  4.         Default,
  5.         VIP = 10,
  6.         SupperVIP,  //继续前一个,值为11
  7. }
  8. void Main()
  9. {
  10.         var t1 = UserType.Default;
  11.         Console.WriteLine(t1.ToString()); //输出名称:Default
  12.         Console.WriteLine((int)t1);       //输出值:0
  13.     Console.WriteLine($"{t1:F}");     //输出名称:Default
  14.         Console.WriteLine($"{t1:D}");     //输出值:0
  15.         var t2 = (UserType)0;
  16.         int t3 = (int)UserType.Default;
  17.         Console.WriteLine(t1 == t2); //True
  18. }
复制代码
2.1、Enum 类API

System.Enum 类型是所有枚举类型的抽象基类,提供了一些API方法用于枚举的操作,基本都是静态方法。Enum 类型还可以作为泛型约束使用。
[table][tr]<strong>
来源:https://www.cnblogs.com/anding/p/18176136
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具