C#编程利器之二:结构与枚举(Structure and enumeration)【转】
C#编程利器之二:结构与枚举(Structure and enumeration)
在上一篇文章中,介绍了类如何封装程序中的对象.而实际中,出了类可以封装对象外,结构和枚举也可以封装一些对象,本文将着重介绍结构和枚举这两个知识点的相关应用.
一. 结构(Structure)
什么是结构(Structure)?在C#里,Struct是一种值类型,通常用来封装小型相关变量组,和类有很大的相似度.同类一样,它不但可以包含不同数据类型数据。还可以包含复合类型(数组,结构,DateTime等等)除了以名字/值方式出现还可以有属性和方法,所以说结构是一种强大的复合型数据。
1. 使用类封装对象的属性
以图书来作为示例来分析,图书包括图书编号,图书名称,图书作者以及出售价格等.我们平时所通常都是使用类来封装这些信息,如下:

/**//// <summary>2
/// 图书对象3
/// </summary>4
public class Books5


{6
public int bookId;7
public string bookName;8
public string bookAuthor;9
public double bookPrice;
}2. 使用结构封装对象的属性
其实出了使用类来封装,我们还可以使用结构来封装,实现如下:

/**//// <summary>2
/// 使用结构封装图书信息3
/// </summary>4
public struct Book5


{6
public int bookId;7
public string bookName;8
public string bookAuthor;9
public double bookPrice;
}3. 结构可以定义构造方法

/**//// <summary>2
/// 使用结构封装图书信息3
/// </summary>4
public struct Book5


{6

/**//// <summary>7
/// 可定义构造方法8
/// </summary>9
public Book()
{
//

}
public int bookId;
public string bookName;
public string bookAuthor;
public double bookPrice;
}4. 可以使用new进行初始化

/**//// <summary>2
/// 使用结构封装图书信息3
/// </summary>4
public struct Book5


{6

/**////// <summary>7
///// 可定义构造方法8
///// </summary>9
//public Book()
//{
// //这里需要注意,当结构中已有带参数的构造方法时,则不能定义无参数的构造方法
//}
public Book(int id, string name, string author, double price)
{
bookId = id;
bookName = name;
bookAuthor = author;
bookPrice = price;
}
public int bookId;
public string bookName;
public string bookAuthor;
public double bookPrice;
}5. 结构可以实现接口

/**//// <summary>2
/// 接口3
/// </summary>4
public interface IBook5


{6
DataSet QueryAll();7
}8

9

/**//// <summary>
/// 结构实现接口
/// </summary>
public struct BookComponent : IBook

{
public DataSet QueryAll()
{
return null;
}
}6. 类和结构的区别
从上面可以看出,无论是使用类还是结构,都可以用来封装对象的属性.当然出了相同点外,两者之间还是有很大的不同,大体如下:
类型:类是引用类型,结构是值类型.
继承:类可继承,结构不能继承.结构不能继承其他的结构和类,或是被用作其他结构或类的基类.
构造方法与析够函数:结构可以定义构造方法,但不能定义析够函数.类既可以定义构造方法,也可定义析够函数.
对象创建:可以使用new进行初始化,或进行手工初始化.类和结构都可以.
结构与接口:结构可以实现一个或多个接口. 如上:public struct BookComponent:IBook{ //....}.
多态: 结构与接口之间是支持多态的.如上面的结构实现接口为例,多态:IBook book = new BookComponent();
二. 枚举(Enumeration)
什么是枚举(Enumeration)?枚举可以理解为通过预定义列出所有值的标识符来定义一个有序集合,这些值的次序和枚举说明中的标识符的次序一致的. 通常用于定义一些不变的序列,如一年四个季节,一礼拜为七天等等. 可以通过enum来定义(这里主要是针对C#语言的实现,其实在JAVA语言里也是通过enum来定义).
1. 枚举的定义形式
修饰符 enum 枚举名
{
标识符1,
标识符2,
..........,
标识符n
}
如下则为一个完整的枚举定义:

/**//// <summary>2
/// 技术方向3
/// </summary>4
public enum TechnologyDirection5


{6
CPlusPlus程序员,7
Java程序员,8
DotNet程序员,9
架构设计师,
开发组长,
需求分析师
}2. 另类枚举定义(可以初始化值)
==============以下为第一种定义方法==============2

/**//// <summary>3
/// 季节4
/// </summary>5
public enum Season6


{7
SPRING, //春天8
SUMMER, //夏天9
AUTUMN, //秋天
WINTER //冬天
}
==============以下为第二种定义方法==============
/**//// <summary>
/// 季节
/// </summary>
public enum SeasonTwo

{, //春天
, //夏天
, //秋天
//冬天
}
=================TEST===================
class Program

{
static void Main(string[] args)
{
//以上两种定义方法效果都一样
Console.WriteLine(Season.AUTUMN);
Console.WriteLine(SeasonTwo.AUTUMN);
//运行结果都为:AUTUMN
}
}如果不初始化值则从0开始,实际上面两种定义方式定义得到的都是一个效果.
3. 对象的形式实现
何为对象的形式实现呢? 其实这个很简单,也就是将需要枚举的标识定义在对象里,通过对象的特性将其封装.详细如下代码:
public class SeasonOne2


{3
public static readonly SeasonOne SPRING = new SeasonOne("春天");4
public static readonly SeasonOne SUMMER = new SeasonOne("夏天");5
public static readonly SeasonOne AUTUMN = new SeasonOne("秋天");6
public static readonly SeasonOne WINTER = new SeasonOne("冬天");7

8
public SeasonOne(string name)9

{
this.name = name;
}
//成员
private string name;
public string Name
{
get
{ return name; }
set
{ name = value; }
}
}以上的形式实现很简单, 不过好象已经偏离了"枚举(enum)",因为实现已经由枚举转向为了类(class)对象来实现了.定义一成员属性,通过构造方法初始化,在类里定义需要枚举的只读成员,通常不建议使用此方式来实现. 我们可以这样来测试:
class Program

{
static void Main(string[] args)
{
Console.WriteLine(SeasonOne.AUTUMN.Name);
//运行结果:秋天
}
}4. Java中的枚举
在与C#语言一样流行的JAVA中,枚举还存在着另类故事,作为一个面向对象的开发者或是既将成为面向对象的开发者的你,我想了解下另类语言的某些特性是有必要的.在JAVA中,枚举除了上面所介绍的相关功能外,还有其他的一些功能,下面将简单的介绍下这些功能的应用.
枚举里定义抽象方法,标识符实现抽象方法

enum Operator
{2

ADD
{3

public double calculate(double a,double b)
{4
return a+b;5
}6
},7

SUBSTRACT
{8

public double calculate(double a,double b)
{9
return a-b;
}
},
MULTIPLY
{
public double calculate(double a,double b)
{
return a*b;
}
},
DIVIDE
{
public double calculate(double a,double b)
{
return a/b;
}
};
public abstract double calculate(double a,double b);
}
枚举里定义属性字段和构造方法

enum Course
{2
COREJAVA("zhangsan"), //zhangsan学CoreJava3
WEB("lisi"), //lisi学Web4
EJB ("wangwu"); //wangwu学EJB5

6
String name;7

Course(String name)
{8
this.name=name;9
}
public String getName()
{
return this.name;
}
}
属性字段,构造方法及抽象方法并存

enum Course
{
COREJAVA("zhangsan")
{
public void study()
{
System.out.println("Study Corejava");
}
},
WEB("lisi")
{
public void study()
{
System.out.println("Study Web");
}
},
EJB ("wangwu")
{
public void study()
{
System.out.println("Study EJB");
}
};
String teachName;
Course(String name)
{
this.teachName=name;
}
public String getName()
{
return this.teachName;
}
public abstract void study();
}三. .NET Framework中的枚举基类
在.NET Framework中枚举基类(Enum)是一抽象类,位于System命名空间下,继承了ValueType类和IComparable, IFormattable, IConvertible接口,这里以一个简单的文本编辑作为示例介绍下枚举在实际中的应用.
简单文本编辑器示例运行图如下:

从上图很容易看出,此文本编辑器主要是用于设置字体样式,其实在实现这个简单文本编辑器的时候就是使用的字体样式枚举(FontStyle),FontStyle的源代码定义如下:
// 摘要:2
// 指定应用到文本的字形信息。3
[Flags]4
public enum FontStyle5

{
}{6
// 摘要:7
// 普通文本。8
Regular = 0,9
//
// 摘要:
// 加粗文本。
Bold = 1,
//
// 摘要:
// 倾斜文本。
Italic = 2,
//
// 摘要:
// 带下划线的文本。
Underline = 4,
//
// 摘要:
// 中间有直线通过的文本。
Strikeout = 8,
}要实现上图示的简单文本编辑器很简单,基本思路就是通过点击上面字体样式设置功能键,设置编辑区域的文本字体样式,这实现很简单.在此,我就直接把代码贴出来,有不清楚之处可从下面我提供的示例代码下载连接下载本文示例代码查看.
private void SetStyle(object sender,EventArgs e)2

{
}{ 3
ToolStripButton btn = sender as ToolStripButton;4
FontStyle fontStyleContent = this.rchTxtContent.SelectionFont.Style;5
FontStyle BtnFont = ( FontStyle)(Enum.Parse(typeof(FontStyle),btn.Tag.ToString()));6
if ((fontStyleContent | BtnFont) == fontStyleContent)7
{8
fontStyleContent = ~BtnFont & fontStyleContent;9
}
else
{
}{
fontStyleContent = fontStyleContent | BtnFont;
}
this.rchTxtContent.SelectionFont = new Font(this.rchTxtContent.SelectionFont.FontFamily,
this.rchTxtContent.SelectionFont.Size,
fontStyleContent,
this.rchTxtContent.SelectionFont.Unit);
}注: 文章转载自: http://beniao.cnblogs.com/ 或 http://www.cnblogs.com/ 作者 : Beniao
C#编程利器之二:结构与枚举(Structure and enumeration)【转】的更多相关文章
- Java高并发编程基础三大利器之CountDownLatch
引言 上一篇文章我们介绍了AQS的信号量Semaphore<Java高并发编程基础三大利器之Semaphore>,接下来应该轮到CountDownLatch了. 什么是CountDownL ...
- 大数据并行计算利器之MPI/OpenMP
大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...
- C#多线程编程系列(二)- 线程基础
目录 C#多线程编程系列(二)- 线程基础 1.1 简介 1.2 创建线程 1.3 暂停线程 1.4 线程等待 1.5 终止线程 1.6 检测线程状态 1.7 线程优先级 1.8 前台线程和后台线程 ...
- C# 8.0和.NET Core 3.0高级编程 分享笔记二:编程基础第一部分
基础部分被我分为了2篇,因为实在太多了,但是每一个知识点我都不舍得删除,所以越写越多,这一篇博客整理了4个夜晚,内容有点多建议慢慢看.本章涵盖以下主题: 介绍C# 理解C#的基础知识 使用变量 处理空 ...
- .NET 基础一步步一幕幕[方法、结构、枚举]
方法.结构.枚举 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值,写void 方法名:P ...
- Win下必备利器之Cmder
诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...
- OC基础--结构体 枚举做类成员属性
结构体 枚举作类的成员属性: 定义一个学生类 性别 -- 枚举 生日 入学日期 毕业日期 -- 结构体 代码示例: 声明文件 Student.h: #import <Foundation ...
- C#编程总结(二)多线程基础
C#编程总结(二)多线程基础 无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他工作.要使应用程序能够快速响应 ...
- 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...
随机推荐
- linux内存分配
在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序.或是读取刚存取过 ...
- ural 1250. Sea Burial
1250. Sea Burial Time limit: 1.0 secondMemory limit: 64 MB There is Archipelago in the middle of a s ...
- 【原】iOS学习41之多线程
1. 多线程概述 1> 程序.进程和进程的概念 程序:由源代码生成的可执行应用.(例如:QQ.app) 进程:一个正在运行的程序可以看做一个进程.(例如:正在运行的QQ就是一个进程),进程拥有独 ...
- Pick-up sticks[HDU1147]
Pick-up sticksTime Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- Coder-Strike 2014 - Round 1 D. Giving Awards
题目的意思是 老板给n个人发工资,x欠y的工资,the joy of person x from his brand new money reward will be much less, 老板想避免 ...
- Xcode UIView 中的Button 控件的属性和基本用法
//第一种创建UIButton的方法 //initWhitFrame: UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(1 ...
- js正则表达式校验非负整数:^\d+$ 或 ^[1-9]\d*|0$ 【转载】
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- nodejs入门(一)
1.nodejs简介 Nodejs不是一个js应用.而是一个js运行平台. Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效 2. 1).Nodejs内置了一个HTTP模块 var ...
- POI Word 模板 文字 图片 替换
实验环境:POI3.7+Word2007 Word模板: 替换后效果: 代码: 1.入口文件 public class Test { public static void main(String[] ...
- linux shell 获取进程pid
1.通过可执行程序的程序名称 a.运行程序 b.获取进程id号 c.pidof相关知识:http://www.cnblogs.com/yunsicai/p/3675938.html 2.有些程序需要在 ...