一 什么是结构

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

  • 类是引用类型,而结构是值类型;
  • 结构和类一样可以实现接口;
  • 结构是隐式密封的,不能被派生;
  • 结构类型的变量不能为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();
}
} 输出:
绿色交通灯

C#-7 结构和枚举的更多相关文章

  1. .NET 基础一步步一幕幕[方法、结构、枚举]

    方法.结构.枚举 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值,写void 方法名:P ...

  2. OC基础--结构体 枚举做类成员属性

    结构体  枚举作类的成员属性: 定义一个学生类 性别 -- 枚举 生日 入学日期  毕业日期  --  结构体 代码示例: 声明文件 Student.h: #import <Foundation ...

  3. C#编程利器之二:结构与枚举(Structure and enumeration)【转】

    C#编程利器之二:结构与枚举(Structure and enumeration) 在上一篇文章中,介绍了类如何封装程序中的对象.而实际中,出了类可以封装对象外,结构和枚举也可以封装一些对象,本文将着 ...

  4. C语言的结构体,枚举类型在程序中的作用

    http://www.xue63.com/xueask-1221-12212854.html 结构和枚举类型从程序实现的角度来说,是用更接近自然语言的方式来表达数据.比如说实现2维空间的点,你可以使用 ...

  5. c#中的结构与枚举

    结构 与c++不同的是,结构应该定义在命名空间或者类里面,成员变量叫字段,字段并且有访问控制符,每个字段前要加一个下划线 例子 using System; using System.Collectio ...

  6. C# 结构体 枚举类型

    注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianl ...

  7. C#基础(二)拆箱与装箱,循环与选择结构,枚举

    一.装箱和拆箱 装箱是将值类型转换为引用类型 eg: Int a=5; Object  o=a; 拆箱是将引用类型转换为值类型 eg: Int a=5; Object  o=a; Int b=(int ...

  8. [C语言]进阶|结构类型: 枚举, 结构, 类型定义

    --------------------------------------------------------------------- 枚举: // main.c #include <std ...

  9. C# 类&结构体&枚举

    类: class Lei  //要和static void Main(string[] args)平级: { public int lei_int;  //public是关键字,代表访问权限,这里是公 ...

  10. C 碎片八 结构体&枚举&联合

    一.结构体 1, 结构体定义 结构体类型的定义:任意数据类型变量的集合.用于描述一个具体的事物的信息,在C语言中描述一件事物一般都是用结构体 声明结构体类型的格式: struct  结构体名 {成员列 ...

随机推荐

  1. ETL工具 Flume (一)

    分布式日志采集系统Flume学习 一.Flume架构 1.1 Hadoop业务开发流程 1.2 Flume概述 flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统. 支持在日志系统 ...

  2. Hadoop学习 Hadoop-HA 解释和概念介绍

    一.Hadoop-HA 1.1 Hadoop1.x带来的问题 1.单点故障 a. 每个群集只有一个NameNode,NameNode存在单点故障(SPOF). ​ b. 如果该计算机或进程不可用,则整 ...

  3. 简单使用 MySQL 索引

    MySQL 索引 1 什么是索引 在数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令 MySQL 的查询和 运行更加高效. 如果合理的设计且使用索引的 MySQL 是一辆兰博基 ...

  4. Canal实时解析mysql binlog数据实战

    一.说明 通过canal实时监听mysql binlog日志文件的变化,并将数据解析出来 二.环境准备 1.创建maven项目并修改pom.xml配置文件 <dependencies> & ...

  5. hexo-yilia主题支持twikoo评论系统

    如果图片无法加载,可到 我的博客 中,查看完整文章 yilia-more 已经增加对 twikoo 的支持,可直接使用 代码修改 layout/_partial/post 路径下新建 twikoo.e ...

  6. Vue 状态管理之vuex && {mapState,mapGetters}

    1 # 一.理解vuex 2 1.概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读写),也是一种组件间通信的方式,且适用于任意组件间 ...

  7. Linux 系统时间同步服务器配置

    # Linux 时间同步 # 查看系统时间: date # 查看硬件日期 # ntp 软件 # chrony 软件 chrony比ntp更精确 # 利用ntp手动瞬间同步时间: ntpdate 172 ...

  8. 简单学习一下ibd数据文件解析

    来源:原创投稿 作者:花家舍 简介:数据库技术爱好者. GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 简单学习一下数据文件解析 这是尝试使用Golang语言简单解析My ...

  9. React报错之react component changing uncontrolled input

    正文从这开始~ 总览 当input的值被初始化为undefined,但后来又变更为一个不同的值时,会产生"A component is changing an uncontrolled in ...

  10. 大数据管理系统架构Hadoop

    Hadoop 起源于Google Lab开发的Google File System (GFS)存储系统和MapReduce数据处理框架.2008年,Hadoop成了Apache上的顶级项目,发展到今天 ...