青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

Enums and Structs in C#

Introduction

Just about everything is a heap object when you are using C#. Only elementary native types like int are treated as value types. But there are two value types in C# that are pretty much more useful that first glances would tell you. They are the enum and struct types. Very few tutorials even cover these topics, but they have their own uses. And both of them are a lot more efficient than classes and you can use them in place of classes when they meet your requirements to improve performance.

Enums

Enums are basically a set of named constants. They are declared in C# using the enum keyword. Every enum type automatically derives from System.Enum and thus we can use System.Enum methods on our Enums. Enums are value types and are created on the stack and not on the heap. You don't have to use new to create an enum type. Declaring an enum is a little like setting the members of an array as shown below.

enum Rating {Poor, Average, Okay, Good, Excellent}

You can pass enums to member functions just as if they were normal objects. And you can perform arithmetic on enums too. For example we can write two functions, one to increment our  enum and the other to decrement our enum.

Rating IncrementRating(Rating r)
{
    if(r == Rating.Excellent)
        return r;
    else
        return r+1;
}
Rating DecrementRating(Rating r)
{
    if(r == Rating.Poor)
        return r;
    else
        return r-1;
}

Both functions take a Rating object as argument and return back a Rating object. Now we can simply call these functions from elsewhere.

for (Rating r1 = Rating.Poor; 
    r1 < Rating.Excellent ; 
    r1 = IncrementRating(r1))
{           
    Console.WriteLine(r1);
}

Console.WriteLine();

for (Rating r2 = Rating.Excellent; 
    r2 > Rating.Poor; 
    r2 = DecrementRating(r2))
{
    Console.WriteLine(r2);          
}

And here is a sample code snippet showing how you can call System.Enum methods on our Enum object. We call the GetNames method which retrieves an array of the names of the constants in the enumeration.

foreach(string s in Rating.GetNames(typeof(Rating)))
    Console.WriteLine(s);

Where to use enums

Quite often we have situations where a class method takes as an argument a custom option. Let's say we have some kind of file access class and there is a file open method that has a parameter that might be one of read-mode, write-mode, read-write-mode, create-mode and append-mode. Now you might think of adding five static member fields to your class for these modes. Wrong approach! Declare and use an enumeration which is a whole lot more efficient and is better programming practice in my opinion.

Structs

In C++ a struct is just about the same as a class for all purposes except in the default access modifier for methods. In C# a struct are a pale puny version of a class. I am not sure why this was done so, but perhaps they decided to have a clear distinction between structs and classes. Here are some of the drastic areas where classes and structs differ in functionality.

  • structs are stack objects and however much you try you cannot create them on the heap
  • structs cannot inherit from other structs though they can derive from interfaces
  • You cannot declare a default constructor for a struct, your constructors must have parameters
  • The constructor is called only if you create your struct using new, if you simply declare the struct just as in  declaring a native type like int, you must explicitly set each member's value before you can use the struct
struct Student : IGrade
{   
    public int maths;
    public int english;
    public int csharp;

    //public member function
    public int GetTot()
    {
        return maths+english+csharp;
    }

    //We have a constructor that takes an int as argument
    public Student(int y)
    {
        maths = english = csharp = y;
    }

    //This method is implemented because we derive
    //from the IGrade interface
    public string GetGrade()
    {
        if(GetTot() > 240 )
            return "Brilliant";
        if(GetTot() > 140 )
            return "Passed";
        return "Failed";
    }
}

interface IGrade
{
    string GetGrade();
}

Well, now let's take a look at how we can use our struct.

Student s1 = new Student();
Console.WriteLine(s1.GetTot());
Console.WriteLine(s1.GetGrade());

//Output
0
Failed

Here the default constructor gets called. This is automatically implemented for us and we cannot have our own default parameter-less constructor. The default parameter-less constructor simply initializes all values to their zero-equivalents. This is why we get a 0 as the total.

Student s2;
s2.maths = s2.english = s2.csharp = 50;
Console.WriteLine(s2.GetTot());
Console.WriteLine(s2.GetGrade());

//Output
150
Passed

Because we haven't used new, the constructor does not get called. Of all the silly features this one must win the annual contest by a long way. I see no sane reason why this must be so. Anyway you have to initialize all the member fields. If you comment out the line that does the initialization you will get a compiler error :- Use of unassigned local variable 's2'

Student s3 = new Student(90);
Console.WriteLine(s3.GetTot());
Console.WriteLine(s3.GetGrade());

//Output
270
Brilliant

This time we use our custom constructor that takes an int as argument.

When to use structs

Because structs are value types they would be easier to handle and more efficient that classes. When you find that you are using a class mostly for storing a set of values, you must replace those classes with structs. When you declare arrays of structs because they are created on the heap, efficiency again improves. Because if they were classes each class object would need to have memory allocated on the heap and their references would be stored. In fact lots of classes within the .NET framework are actually structs. For example System.Drawing.Point is actually a struct and not a class.

posted on 2006-03-14 11:27 夢在天涯 閱讀(776) 評論(0)  編輯 收藏 引用 所屬分類: C#/.NET

公告

EMail:itech001#126.com

導航

統計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1811735
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲高清一区二区三区| 欧美午夜视频网站| 激情欧美日韩| 欧美91视频| 欧美极品欧美精品欧美视频| 亚洲美女在线看| 亚洲精品美女在线| 欧美日韩精品久久| 香蕉久久一区二区不卡无毒影院| 亚洲欧美一区二区原创| 狠狠久久亚洲欧美| 亚洲人成人77777线观看| 国产精品盗摄一区二区三区| 久久精品99无色码中文字幕| 蜜臀久久久99精品久久久久久 | 欧美日韩在线影院| 欧美一区二粉嫩精品国产一线天| 久久黄色级2电影| 99re热这里只有精品视频| 国产精品99久久久久久久久久久久 | 国产精品成人国产乱一区| 久久黄色影院| 欧美精品二区| 久久久久欧美精品| 欧美专区在线| 免费一区二区三区| 欧美一区二区三区日韩| 欧美a级一区| 久久久久国产精品人| 欧美精品1区2区| 久久这里只有| 国产精品劲爆视频| 亚洲日本理论电影| 韩日在线一区| 亚洲午夜视频| 一区二区三区鲁丝不卡| 久久蜜桃资源一区二区老牛 | 国内欧美视频一区二区| 一区二区精品在线| 亚洲日本成人在线观看| 欧美一区二区三区免费观看 | 亚洲高清久久久| 亚洲一区一卡| 亚洲五月婷婷| 欧美国产日韩a欧美在线观看| 久久精品视频导航| 国产精品看片你懂得| 亚洲精品一区二区三区在线观看| 在线免费一区三区| 欧美一区二区三区在| 午夜国产精品视频| 欧美午夜在线一二页| 亚洲激情图片小说视频| 亚洲激情电影中文字幕| 久久九九免费视频| 美女日韩在线中文字幕| 国内精品嫩模av私拍在线观看 | 久久久久久一区二区| 久久精品国产精品亚洲| 国产精品日本一区二区| 中日韩高清电影网| 亚洲欧美国产高清va在线播| 欧美涩涩视频| 亚洲午夜精品久久| 午夜免费日韩视频| 国产欧美视频在线观看| 午夜欧美电影在线观看| 欧美中文在线观看| 国产一区二区三区直播精品电影| 性伦欧美刺激片在线观看| 久久精品在线播放| 一区二区三区在线免费观看| 久久婷婷影院| 亚洲日本成人女熟在线观看| 在线视频精品| 国产精品永久在线| 久久久久久黄| 亚洲激情成人| 亚洲欧美日本国产有色| 国产日韩欧美一区二区三区四区| 久久久99精品免费观看不卡| 欧美二区在线| 亚洲先锋成人| 黄色成人av网站| 欧美激情视频在线播放| 亚洲一区二区少妇| 久久精品亚洲乱码伦伦中文| 在线播放豆国产99亚洲| 欧美另类高清视频在线| 亚洲线精品一区二区三区八戒| 久久久久久久综合日本| 亚洲精品久久久久中文字幕欢迎你| 欧美日韩中文在线观看| 欧美亚洲一区二区三区| 亚洲国产精品高清久久久| 亚洲欧美www| 亚洲国产91| 国产精品乱码妇女bbbb| 久久久久网站| 亚洲一区二区三区在线看| 欧美成人一区二区三区片免费| 在线亚洲观看| 亚洲第一在线综合网站| 国产精品久久久久久久久久妞妞| 久久天堂国产精品| 亚洲一区久久| 亚洲日本在线观看| 麻豆国产精品va在线观看不卡| 夜夜嗨av一区二区三区网站四季av| 国产日本欧美视频| 欧美日韩免费一区二区三区视频| 欧美在线观看一区二区| 亚洲视频在线观看三级| 狠狠色2019综合网| 国产精品初高中精品久久| 欧美黄色片免费观看| 欧美一区激情| 亚洲一区综合| 一区二区三区四区在线| 亚洲国产日韩在线| 免费观看一级特黄欧美大片| 欧美一区日本一区韩国一区| 亚洲视频在线观看视频| 亚洲精品视频在线观看免费| 激情婷婷亚洲| 国产亚洲一区二区在线观看| 国产精品久在线观看| 欧美日韩在线播放一区| 欧美人与性禽动交情品| 欧美国产日韩一二三区| 老司机成人网| 久久综合久久美利坚合众国| 久久国产精品99久久久久久老狼| 亚洲一区二区三区四区视频| 一区二区三区 在线观看视| 亚洲乱码久久| 亚洲免费观看高清完整版在线观看熊| 欧美黄色网络| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美一区二区三区成人| 亚洲欧美综合网| 欧美一级片一区| 久久av一区二区三区| 久久精品视频导航| 久久综合亚洲社区| 欧美二区不卡| 亚洲精品三级| 一本大道久久精品懂色aⅴ| 99在线视频精品| 亚洲色图综合久久| 午夜亚洲激情| 久久久精彩视频| 麻豆精品视频| 欧美日韩精品久久久| 欧美亚洲成人网| 国产偷久久久精品专区| 永久91嫩草亚洲精品人人| 亚洲激情社区| 亚洲一区免费观看| 久久精品99国产精品| 欧美国产欧美综合 | 久久久久久久久岛国免费| 免费一区二区三区| 欧美午夜激情小视频| 国产一区亚洲一区| 亚洲人成在线播放| 亚洲综合导航| 蜜臀a∨国产成人精品| 最新亚洲电影| 亚洲欧美在线磁力| 欧美大片一区| 国产精品综合久久久| 亚洲国产高清自拍| 亚洲一区三区视频在线观看| 久久精品导航| 亚洲精品小视频在线观看| 香港成人在线视频| 欧美日本在线播放| 韩日精品在线| 亚洲尤物视频网| 奶水喷射视频一区| 亚洲一区二区三| 免费成人黄色av| 国产视频在线一区二区| 一区二区三区日韩欧美| 蜜臀a∨国产成人精品| 亚洲素人在线| 欧美激情中文字幕在线| 国产精品自在在线| 中日韩高清电影网| 美女黄网久久| 午夜免费日韩视频| 国产精品www.| 9色精品在线| 欧美激情久久久| 久久精品国产免费观看| 国产精品丝袜xxxxxxx| 一区二区三区免费观看| 亚洲成人在线视频网站| 麻豆国产精品777777在线|