C#-7 结构和枚举

一 什么是结构

结构是程序员定义的数据类型,有数据成员和函数成员,和类非常类似。

  • 类是引用类型,而结构是值类型;
  • 结构和类一样可以实现接口;
  • 结构是隐式密封的,不能被派生;
  • 结构类型的变量不能为null;
  • 两个结构的变量不能引用同一对象;
  • 在结构中不允许字段初始化语句;
  • 预定义简单类型(如int,long,short 等等. . . ),实际上在.Net中都实现为结构。
class CSimple
{
    public int X;
    public int Y;        
}

struct Simple
{
    public int X;
    public int Y; 
   // public int Z = 10 ; 编译错误,不允许初始化字段 } static void Main() {   CSimple cs = new CSimple();   Simple ss = new Simple(); }


二 构造函数

结构可以有实例构造函数和静态构造函数,但不能有析构函数。

2.1 实例构造函数

结构隐式有一个无参的构造函数。这个构造函数把结构的每个成员设置为该类型的默认值。值成员设置成其默认值,引用成员设置成null。

预定义的无参构造函数对每个结构都存在,可以创建另外的构造函数,只要它们有参数。这一点和类不同,对于类,编译器只在没有其他构造函数存在时才提供隐式的无参构造函数。

struct Simple
{
    public int X;
    public int Y;
    public Simple(int a, int b)
    {
        X = a;
        Y = b;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var s1 = new Simple();
        var s2 = new Simple(5, 10);
        Console.WriteLine($"s1:{s1.X},{s1.Y}");
        Console.WriteLine($"s2:{s2.X},{s2.Y}");
    }
}

2.2 静态构造函数

与类类似,结构的静态构造函数创建并初始化静态数据成员,且不能引用实例成员。

以下任意一种行为发生前,将会调用静态构造函数:

  • 调用显示声明的构造函数;
  • 引用结构的静态成员。

三 结构作为返回值和参数

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

四 什么是枚举

枚举是由程序员定义的类型,与类或结构一样。

  • 与结构一样,枚举是值类型;
  • 枚举只有一种类型的成员:命名的整数常量值;
  • 不能对成员使用修饰符,成员隐式地具有和枚举相同的可访问性;
  • 比较不同枚举类型的成员会导致编译时错误。

每个枚举成员都有一个底层整数类型,默认为int。

  • 每个枚举成员都被赋予一个底层类型的常量值;
  • 默认下,编译器把第一个成员赋值为0,后续成员比前一成员多1。
enum TrafficLight
{
    Green,
    Yellow,
    Red
}
class Program
{
    static void Main(string[] args)
    {
        var t1 = TrafficLight.Green;
        var t2 = TrafficLight.Yellow;
        var t3 = TrafficLight.Red;

        Console.WriteLine($"{t1},{(int)t1}");
        Console.WriteLine($"{t2},{(int)t2}");
        Console.WriteLine($"{t3},{(int)t3}");

        Console.ReadLine();
    }
}
输出:
Green,0
Yellow,1
Red,2

五 设置枚举的底层类型和显示值

enum TrafficLight : byte
{
    Green = 2,
    Yellow,  //未显示设置值,则默认比上一个成员的值多1
    Red = 10
}
class Program
{
    static void Main(string[] args)
    {
        var t1 = TrafficLight.Green;
        var t2 = TrafficLight.Yellow;
        var t3 = TrafficLight.Red;

        Console.WriteLine($"{t1},{(byte)t1}");
        Console.WriteLine($"{t2},{(byte)t2}"); 
        Console.WriteLine($"{t3},{(byte)t3}");

        Console.ReadLine();
    }
}
输出:
Green,2
Yellow,3
Red,10

六 Enum类

6.1 .Net中的Enum类

.Net中的Enum类提供一些静态方法:

  • GetName方法以枚举类型对象和整数作为参数,返回响应的枚举成员的名称;
  • GetNames方法以枚举类型对象为参数,返回该枚举中所有成员的全部名称。
enum TrafficLight
{
    Green,
    Yellow, 
    Red
}
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine($"Second member is {Enum.GetName(typeof(TrafficLight),1)}");

        foreach (var name in Enum.GetNames(typeof(TrafficLight)))
        {
            Console.WriteLine(name);
        }

        Console.Read();
    }
}
输出:
Second member is Yellow
Green
Yellow
Red

6.2 Enum类的扩展方法

有时,项目中需要获取枚举成员的详细描述或中文名称,可以通过Description特性配合自定义的Enum类扩展方法,来方便获取。

public static class EnumHelper
{
   // Enum类的扩展方法 /// <summary> /// 获取枚举值上的Description特性的说明 /// </summary> /// <param name="enumValue">枚举值</param> /// <returns>特性说明</returns> public static string GetEnumDescription(this Enum enumValue) { if (enumValue == null) return string.Empty; var field = enumValue.GetType().GetField(enumValue.ToString()); if (field == null) return string.Empty; return Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is DescriptionAttribute description ? description.Description : field.ToString(); } } enum TrafficLight { [Description("绿色交通灯")] Green, [Description("黄色交通灯")] Yellow, [Description("红色交通灯")] Red } class Program { static void Main(string[] args) { Console.WriteLine(TrafficLight.Green.GetEnumDescription()); Console.Read(); } } 输出: 绿色交通灯
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值