zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C# (初入江湖)-结构&枚举(原来这么写是这个意思)

c#amp 结构 这个 意思 这么 枚举 原来
2023-09-11 14:14:49 时间

C# (初入江湖) -结构&枚举

结构(struct)

结构类型

  • 是一种可封装数据和相关功能的值类型
    • 结构不能包含无参构造方法
    • 每个字段在定义时,不能给初始值
    • 构造方法中,必须对每个字段进行赋值
  • 使用 struct 关键字定义结构类型
public struct Point
{
    // 多个相同类型的变量声明中间用 逗号  隔开
    public double x,y;
    public Point(double x, double y)
    {
        this.X = x;
        this.Y = y;
    }

    public override string ToString() => $"({X}, {Y})";
}

  • struct实例化时,使用new关键字 ,但与引型变量不同的是,值类型变量在赋值的时候,本质上是字段的copy
// 声明结构实例
Point point = new Point(1,2);

// 结构的赋值
Point p1,p2;
p1=p2;   // 注:此处不是将 p2的引用赋值给p1,而是在p1中将p2中的字段都copy了一份到P1里面
  • struct是sealed的,不能被继承
  • 由于结构类型具有值语义,因此建议定义不可变的结构类型

readonly结构-

  • 可以使用 readonly 修饰符来声明结构类型为不可变
  • readonly 结构的所有数据成员都必须是只读的
    • 这样可以保证 readonly 结构的成员不会修改该结构的状态。这意味着除构造函数外的其他实例成员是隐式 readonly
    • 注:在 readonly 结构中,可变引用类型的数据成员仍可改变其自身的状态,如List,仍然可以入list 中添加内容。
  • 定义方式,以系统提供的 Int32 类型为例:

public readonly struct Int32 : IComparable, IComparable<int>, IConvertible, IEquatable<int>, ISpanFormattable, IFormattable
{
    private readonly int _dummyPrimitive;
    ... 
}

注:通常,可以使用结构类型来设计以数据为中心的较小类型,这些类型只有很少的行为或没有行为。例如,.NET 使用结构类型来表示数字(整数和实数)、布尔值、Unicode 字符以及时间实例。如果侧重于类型的行为,请考虑定义一个类。



枚举(enum)

枚举类型(enum)

  • 是由基础整型数值类型的一组命名常量定义的值类型
  • 使用 enum 关键字定义并指定枚举成员
enum ColorEnum
{
    Red,
    Blue,
    Green,
    Yellow
}
  • 默认情况下,枚举成员的关联常数值为类型 int;它们从零开始,并按定义文本顺序递增 1。可以显式指定任何其他整数数值类型作为枚举类型的基础类型。还可以显式指定关联的常数值
enum ColorEnum
{
    Red =1,
    Blue =2,
    Green = 3,
    Yellow =4
}
  • 枚举的使用
// 赋值
ColorEnum colorEnum = ColorEnum.Green;

//比较
if(colorEnum == ColorEnum.Red)
{
    Console.WriteLine("符合逻辑....");
}

// 也可以用 swicth 语句
switch (colorEnum)
{
    case ColorEnum.Green:
        Console.WriteLine("green");
        break;
    case ColorEnum.Red:
        Console.WriteLine("red");
        break;
    case ColorEnum.Yellow:
        Console.WriteLine("yellow");
        break;
    default: Console.WriteLine();
}

枚举的转换

  • 对于任何枚举类型,枚举类型与其基础整型类型之间存在显式转换
var b = (ColorEnum)1;
Console.WriteLine(b);  // output: red

var c = (ColorEnum)4;
Console.WriteLine(c);  // output: yellow
// 如果枚举中没有,则输出原值
var d = (ColorEnum)5;
Console.WriteLine(d);  // output: 5
  • 与字符串的转换
ColorEnum colorEnum = ColorEnum.Green;
Console.WriteLine(colorEnum.ToString());  // output: Green
// 将 Red字符串 转换成枚举
var ee= Enum.Parse(typeof(ColorEnum), "Red"); 
Console.WriteLine(ee);      // output: red
Console.WriteLing("微信公众号同名")