C#编程利器之二:结构与枚举(Structure and enumeration)

在上一篇文章中,介绍了类如何封装程序中的对象.而实际中,出了类可以封装对象外,结构和枚举也可以封装一些对象,本文将着重介绍结构和枚举这两个知识点的相关应用.

一. 结构(Structure)

什么是结构(Structure)?在C#里,Struct是一种值类型,通常用来封装小型相关变量组,和类有很大的相似度.同类一样,它不但可以包含不同数据类型数据。还可以包含复合类型(数组,结构,DateTime等等)除了以名字/值方式出现还可以有属性和方法,所以说结构是一种强大的复合型数据。

1. 使用类封装对象的属性

以图书来作为示例来分析,图书包括图书编号,图书名称,图书作者以及出售价格等.我们平时所通常都是使用类来封装这些信息,如下:

 1/**//// <summary>
 2/// 图书对象
 3/// </summary>
 4public class Books
 5{
 6    public int bookId;
 7    public string bookName;
 8    public string bookAuthor;
 9    public double bookPrice;
}

2. 使用结构封装对象的属性

其实出了使用类来封装,我们还可以使用结构来封装,实现如下:

 1/**//// <summary>
 2/// 使用结构封装图书信息
 3/// </summary>
 4public struct Book
 5{
 6    public int bookId;
 7    public string bookName;
 8    public string bookAuthor;
 9    public double bookPrice;
}

3. 结构可以定义构造方法

 1/**//// <summary>
 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进行初始化

 1/**//// <summary>
 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. 结构可以实现接口

 1/**//// <summary>
 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

}

如下则为一个完整的枚举定义:

 1/**//// <summary>
 2/// 技术方向
 3/// </summary>
 4public enum TechnologyDirection
 5{
 6    CPlusPlus程序员,
 7    Java程序员,
 8    DotNet程序员,
 9    架构设计师,
    开发组长,
    需求分析师
}

2. 另类枚举定义(可以初始化值)

 1==============以下为第一种定义方法==============
 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. 对象的形式实现

何为对象的形式实现呢? 其实这个很简单,也就是将需要枚举的标识定义在对象里,通过对象的特性将其封装.详细如下代码:

 1public class SeasonOne
 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)对象来实现了.定义一成员属性,通过构造方法初始化,在类里定义需要枚举的只读成员,通常不建议使用此方式来实现.  我们可以这样来测试:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(SeasonOne.AUTUMN.Name);
        //运行结果:秋天
    }
}

4. Java中的枚举

在与C#语言一样流行的JAVA中,枚举还存在着另类故事,作为一个面向对象的开发者或是既将成为面向对象的开发者的你,我想了解下另类语言的某些特性是有必要的.在JAVA中,枚举除了上面所介绍的相关功能外,还有其他的一些功能,下面将简单的介绍下这些功能的应用.

     枚举里定义抽象方法,标识符实现抽象方法

 1enum 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);
}

     枚举里定义属性字段和构造方法

 1enum Course{
 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;
    }
}

     属性字段,构造方法及抽象方法并存

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的源代码定义如下:

 1// 摘要:
 2//     指定应用到文本的字形信息。
 3[Flags]
 4public enum FontStyle
 5{}{
 6    // 摘要:
 7    //     普通文本。
 8    Regular = 0,
 9    //
    // 摘要:
    //     加粗文本。
    Bold = 1,
    //
    // 摘要:
    //     倾斜文本。
    Italic = 2,
    //
    // 摘要:
    //     带下划线的文本。
    Underline = 4,
    //
    // 摘要:
    //     中间有直线通过的文本。
    Strikeout = 8,
}

要实现上图示的简单文本编辑器很简单,基本思路就是通过点击上面字体样式设置功能键,设置编辑区域的文本字体样式,这实现很简单.在此,我就直接把代码贴出来,有不清楚之处可从下面我提供的示例代码下载连接下载本文示例代码查看.

 1private 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)【转】的更多相关文章

  1. Java高并发编程基础三大利器之CountDownLatch

    引言 上一篇文章我们介绍了AQS的信号量Semaphore<Java高并发编程基础三大利器之Semaphore>,接下来应该轮到CountDownLatch了. 什么是CountDownL ...

  2. 大数据并行计算利器之MPI/OpenMP

    大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...

  3. C#多线程编程系列(二)- 线程基础

    目录 C#多线程编程系列(二)- 线程基础 1.1 简介 1.2 创建线程 1.3 暂停线程 1.4 线程等待 1.5 终止线程 1.6 检测线程状态 1.7 线程优先级 1.8 前台线程和后台线程 ...

  4. C# 8.0和.NET Core 3.0高级编程 分享笔记二:编程基础第一部分

    基础部分被我分为了2篇,因为实在太多了,但是每一个知识点我都不舍得删除,所以越写越多,这一篇博客整理了4个夜晚,内容有点多建议慢慢看.本章涵盖以下主题: 介绍C# 理解C#的基础知识 使用变量 处理空 ...

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

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

  6. Win下必备利器之Cmder

    诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...

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

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

  8. C#编程总结(二)多线程基础

    C#编程总结(二)多线程基础 无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他工作.要使应用程序能够快速响应 ...

  9. 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&amp;颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)  ...

随机推荐

  1. ural 1249. Ancient Necropolis

    1249. Ancient Necropolis Time limit: 5.0 secondMemory limit: 4 MB Aerophotography data provide a bit ...

  2. CF#335 Intergalaxy Trips

     Intergalaxy Trips time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. XIII Open Cup named after E.V. Pankratiev. GP of SPb

    A. Graph Coloring 答案为$1$很好判,为$2$只需要二分图染色,对于$3$,首先爆搜哪些边要染成第$3$种颜色,然后二分图染色判定即可. B. Decimal Fraction 枚举 ...

  4. 163源报错Hash Sum mismatch 解决方法

    Ubuntu server 用的163的源,报错: W: Failed to fetch http://mirrors.163.com/ubuntu/dists/precise-updates/mai ...

  5. Java 日期格式化工具类

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  6. ACM D的小L

    D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2   描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...

  7. codeforces round #234B(DIV2) C Inna and Huge Candy Matrix

    #include <iostream> #include <vector> #include <algorithm> #include <utility> ...

  8. [BZOJ2799][Poi2012]Salaries

    2799: [Poi2012]Salaries Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 91  Solved: 54[Submit][Statu ...

  9. 【noiOJ】p7914(..)

    08:不重复地输出数 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 输入n个数,从小到大将它们输出,重复的数只输出一次.保证不同的数不超过500个. 输入 ...

  10. Bootstrap_让Bootstrap轮播插件carousel支持左右滑动手势的三种方法

    Bootstrap 的 carousel.js 插件并没有支持手势. 3种解决方案 : jQuery Mobile (http://jquerymobile.com/download/) $(&quo ...