C#编程利器之二:结构与枚举(Structure and enumeration)【转】
C#编程利器之二:结构与枚举(Structure and enumeration)
在上一篇文章中,介绍了类如何封装程序中的对象.而实际中,出了类可以封装对象外,结构和枚举也可以封装一些对象,本文将着重介绍结构和枚举这两个知识点的相关应用.
一. 结构(Structure)
什么是结构(Structure)?在C#里,Struct是一种值类型,通常用来封装小型相关变量组,和类有很大的相似度.同类一样,它不但可以包含不同数据类型数据。还可以包含复合类型(数组,结构,DateTime等等)除了以名字/值方式出现还可以有属性和方法,所以说结构是一种强大的复合型数据。
1. 使用类封装对象的属性
以图书来作为示例来分析,图书包括图书编号,图书名称,图书作者以及出售价格等.我们平时所通常都是使用类来封装这些信息,如下:
2/// 图书对象
3/// </summary>
4public class Books
5{
6 public int bookId;
7 public string bookName;
8 public string bookAuthor;
9 public double bookPrice;
}
2. 使用结构封装对象的属性
其实出了使用类来封装,我们还可以使用结构来封装,实现如下:
2/// 使用结构封装图书信息
3/// </summary>
4public struct Book
5{
6 public int bookId;
7 public string bookName;
8 public string bookAuthor;
9 public double bookPrice;
}
3. 结构可以定义构造方法
2/// 使用结构封装图书信息
3/// </summary>
4public struct Book
5{
6 /**//// <summary>
7 /// 可定义构造方法
8 /// </summary>
9 public Book()
{
//
}
public int bookId;
public string bookName;
public string bookAuthor;
public double bookPrice;
}
4. 可以使用new进行初始化
2/// 使用结构封装图书信息
3/// </summary>
4public struct Book
5{
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. 结构可以实现接口
2/// 接口
3/// </summary>
4public interface IBook
5{
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
}
如下则为一个完整的枚举定义:
2/// 技术方向
3/// </summary>
4public enum TechnologyDirection
5{
6 CPlusPlus程序员,
7 Java程序员,
8 DotNet程序员,
9 架构设计师,
开发组长,
需求分析师
}
2. 另类枚举定义(可以初始化值)
2/**//// <summary>
3/// 季节
4/// </summary>
5public enum Season
6{
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. 对象的形式实现
何为对象的形式实现呢? 其实这个很简单,也就是将需要枚举的标识定义在对象里,通过对象的特性将其封装.详细如下代码:
2{
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)对象来实现了.定义一成员属性,通过构造方法初始化,在类里定义需要枚举的只读成员,通常不建议使用此方式来实现. 我们可以这样来测试:
{
static void Main(string[] args)
{
Console.WriteLine(SeasonOne.AUTUMN.Name);
//运行结果:秋天
}
}
4. Java中的枚举
在与C#语言一样流行的JAVA中,枚举还存在着另类故事,作为一个面向对象的开发者或是既将成为面向对象的开发者的你,我想了解下另类语言的某些特性是有必要的.在JAVA中,枚举除了上面所介绍的相关功能外,还有其他的一些功能,下面将简单的介绍下这些功能的应用.
枚举里定义抽象方法,标识符实现抽象方法
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);
}
枚举里定义属性字段和构造方法
2 COREJAVA("zhangsan"), //zhangsan学CoreJava
3 WEB("lisi"), //lisi学Web
4 EJB ("wangwu"); //wangwu学EJB
5
6 String name;
7 Course(String name){
8 this.name=name;
9 }
public String getName(){
return this.name;
}
}
属性字段,构造方法及抽象方法并存
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]
4public enum FontStyle
5{}{
6 // 摘要:
7 // 普通文本。
8 Regular = 0,
9 //
// 摘要:
// 加粗文本。
Bold = 1,
//
// 摘要:
// 倾斜文本。
Italic = 2,
//
// 摘要:
// 带下划线的文本。
Underline = 4,
//
// 摘要:
// 中间有直线通过的文本。
Strikeout = 8,
}
要实现上图示的简单文本编辑器很简单,基本思路就是通过点击上面字体样式设置功能键,设置编辑区域的文本字体样式,这实现很简单.在此,我就直接把代码贴出来,有不清楚之处可从下面我提供的示例代码下载连接下载本文示例代码查看.
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 作者:毛星云(浅墨) ...
随机推荐
- HDU4609 3-idiots(母函数 + FFT)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4609 Description King OMeGa catched three men wh ...
- BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)
题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...
- React版本修改内容
React新版本(0.12.2)在2014年12月18日发布,对比了我之前用的v0.11.2版本改动很大,基本的写法被扩展,让我顿时感觉自己又要重新开始.坑啊~ 事已至此,必须重新适应,首先我们来看看 ...
- java中 == 与 equal 的区别
http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html String str1 = new String("s ...
- 解决iPhone中overflow:scroll;滑动速度慢或者卡的问题
在移动端html中经常出现横向/纵向滚动的效果,但是在iPhone中滚动速度很慢,感觉不流畅,有种卡卡的感觉,但是在安卓设备上没有这种感觉; 要解决这个问题很简单: 一行代码搞定 -webkit-ov ...
- Codeforces Round #242 (Div. 2) B. Megacity
按照半径排序,然后累加人数直到超过百万 #include <iostream> #include <algorithm> #include <cmath> #inc ...
- 洛谷 P1031 均分纸牌 Label:续命模拟QAQ
题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...
- C#文字样式
[字体] 中文名称 英文名称宋体 SimSun黑体 SimHei微软雅黑 Microsoft YaHei微软正黑体 Microsoft JhengHei新宋体 NSimSun新细明体 PMin ...
- Redis_master-slave模式
类似mysql的master-slave模式一样,redis的master-slave可以提升系统的可用性,master节点写入cache后,会自动同步到slave上. 环境: master node ...
- 20145330第九周《Java学习笔记》
20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...