C# Notizen 5 創(chuàng)建枚舉類型和結構

一、枚舉類型
枚舉類型也成為枚舉倚喂,它是一種創(chuàng)建數值類型的機制,這種值類型的可能取值是預定義的瓣戚,而對于其中的每個可能取值端圈,都有一個有意義的名稱。這看似簡單子库,但實際上枚舉類型功能強大舱权。通過定義一組有效值,而程序員能夠理解表層含義仑嗅。這樣宴倍,代碼的含義將不言自明张症,也不再模糊。
要定義枚舉鸵贬,必須在標識符前面加上關鍵字enum俗他,然后在枚舉體內定義一組有效值,并用逗號分隔它們阔逼。用作值名稱的標識符必須遵循的規(guī)則與變量標識符相同兆衅。

ps:枚舉值
最后一個枚舉值后面的逗號是可選的,但最好不要省略嗜浮,這樣以后添加枚舉值將更容易羡亩。

ps:多名稱值
可以有多個名稱對應于同一個數值,這在有多個名稱表示同一個概念時很有用危融。為讓多個名稱對應于同一個數值畏铆,只需添加新名稱,并將其設置成與另一個名稱相等吉殃,如下所示辞居。

枚舉是一組只能為數值的命名常量,因此最好讓每個名稱對應于不同的數值寨腔。定義枚舉時速侈,編譯器默認將第一個枚舉值設置為整數零,其他值則依次加1迫卢。

ps:零值(zero value)
通常最好在枚舉中包含對應于0的名稱None倚搬。

枚舉支持大多數可用于整數值的運算符,但并非所有這些運算符對枚舉來說都有意義乾蛤。對于枚舉每界,執(zhí)行得最多的操作是相等和不等測試。由于枚舉屬于值類型家卖,因此也可聲明可以為null的枚舉眨层。

ps:枚舉的底層類型
枚舉包含的所有值都必須是同一種數據類型的,這種數據類型稱為底層類型(underlying type)上荡。默認情況下趴樱,枚舉的底層類型為 int,但是也可以使用任何預定義的整數類型:byte酪捡、short叁征、int、long逛薇、sbyte捺疼、ushort、uint和ulong永罚。

1.1 位標志枚舉
通過使用位標志枚舉(flags enumeration)啤呼,可組合其中的值卧秘。使用位標志枚舉時,可使用邏輯運算OR創(chuàng)建新的組合值官扣。
為讓位標志枚舉的值能夠組合翅敌,所有值都必須是2的冪。這是因為組合多個值時醇锚,必須能夠確定結果為哪個離散值哼御。因此,定義位標志枚舉時焊唬,必須指定名稱對應的值恋昼。

ps:Flags特性
常規(guī)枚舉和位標志枚舉之間的另一個差別是,后者需要使用Flags特性赶促,它指定有關枚舉的額外元數據液肌。
Flags特性還改變了組合得到的枚舉值的字符串表示(方法ToString返回的結果)。
雖然并非必須使用Flags特性鸥滨,但是強烈建議這樣做嗦哆,因為向編譯器和其他程序員清晰地表明了你的意圖。
在簡單枚舉中婿滓,可以讓名稱None或最常見的默認名稱對應于0老速,但是位標志枚舉與此不同,它要求0對應于名稱None凸主,這個值意味著所有標志都未設置橘券。

二、結構
在需要簡單的用戶定義的類型時卿吐,可將結構作為類的輕量級替代品旁舰。結構類似于類,可包含的成員類型與類相同嗡官,但是屬于值類型而不是引用類型箭窜。結構與類的不同之處如下:

  • 接口不支持繼承。結構隱式地繼承System.ValueType衍腥,而后者繼承System.Object磺樱。就像類一樣,結構也可繼承接口
  • 結構隱式地被密封婆咸,這意味著您不能繼承結構
  • 結構不能有析構函數竹捉,不能聲明默認構造函數,也不能在結構體內初始化實例字段擅耽。如果結構提供了構造函數,就必須在其中給所有字段賦值

ps:基類庫中的結構
除 string 和 object 外物遇,所有基本數據類型都被實現為結構乖仇。.NET Framework提供了200多個公有結構憾儒,下面是一些常用的結構:
System.DateTime
System.DateTimeOffset
System.Guid
System.TimeSpan
System.Drawing.Color
System.Drawing.Point
System.Drawing.Rectangle
System.Drawing.Size

在C#中,結構的聲明方法與類相同乃沙,只是需要使用關鍵字struct代替關鍵字class

2.1 方法
就像類可以定義方法一樣起趾,結構也可以。這些方法要么是靜態(tài)方法警儒,要么是實例方法训裆,但是結構較常使用靜態(tài)共有方法和私有實例方法

運算符重載
由于結構是用戶定義的值類型,因此如果變量的類型為您定義的結構蜀铲,就不能將大多數常見的運算符用于它边琉。這是一種重大缺陷,所幸的是记劝,C #通過運算符重載提供了一種解決這個問題的方式变姨。
如果將運算符視為名稱特殊的方法,那么運算符重載就是一種特殊的方法重載厌丑。要聲明重載的運算符鞍恢,可定義一個public static方法莺匠,其名稱為關鍵字operator和要重載的運算符的符號。另外,至少要有一個參數的類型與重載運算符所屬的類型相同污秆。下表列出了可重載的運算符。

類別 運算符
單目 + - ! ~ ++ true false
乘除 * / %
加減 + -
移位 << >>
關系 < > <= >=
邏輯 & 丨 ^
相等性 == !=

ps:語言互操作性
并非所有.NET 語言都支持運算符重載痰驱,因此如果創(chuàng)建的類要在其他語言中使用既鞠,它們應符合CLS,并提供與定義的重載運算符對應的替代品耍属。
通常托嚣,應成組地重載運算符。例如厚骗,如果重載了相等運算符示启,也應重載不等運算符。對于這個指導原則领舰,唯一的例外是求補運算符(~)和邏輯非運算符(!)夫嗓。下表列出了應同時重載的成組運算符。

Paste_Image.png

轉換運算符
在用戶定義的結構中冲秽,可重載運算符以便能夠對定義的數據執(zhí)行常見的運算舍咖,同樣,也可創(chuàng)建重載的轉換運算符锉桑,以影響強制轉換和轉換過程排霉。同樣,如果將轉換和強制轉換視為名稱特殊的函數民轴,則轉換重載也是一種特殊的方法重載攻柠。

ps:顯示轉換和隱式轉換
隱式轉換是屬于擴大(widening)轉換球订,因為原始值不會因轉換而丟失數據。顯式轉換屬于縮泄迮ァ(Narrowing)轉換冒滩,因為原始值可能因轉換而丟失數據。
定義自己的轉換運算符時浪谴,應牢記這些行為开睡。如果定義的轉換可能丟失數據,應將其定義為顯式轉換苟耻;如果定義的轉換是安全的篇恒,即不會丟失數據,就應將其定義為隱式轉換梁呈。
內置數據類型支持隱式轉換和顯式轉換婚度,其中隱式轉換不需要特殊語法,但顯式轉換需要官卡。對于自己定義的類型蝗茁,可重載這些顯式轉換和隱式轉換,方法是聲明自己的轉換運算符寻咒,其規(guī)則與聲明運算符重載類似哮翘。
要聲明轉換運算符,可定義一個 public static方法毛秘,其名稱為關鍵字 operator饭寺,返回類型為要轉換到的類型。轉換運算符只接受一個參數叫挟,那就是要轉換的類型艰匙。
如果要聲明隱式轉換,就可在關鍵字operator前面加上implicit抹恳;否則员凝,加上關鍵字explicit。有時結合使用轉換運算符和運算符重載奋献,以減少要定義的運算符重載健霹。

2.2 構造和初始化
就像必須給對象指定初始狀態(tài)一樣,結構也如此瓶蚂。對于對象糖埋,這是通過構造函數完成的,但結構是值類型窃这,無需調用構造函數就可以創(chuàng)建結構變量瞳别。例如,可像下面這樣創(chuàng)建一個NumberStruct變量:
NumberStruct ns1;
上述代碼創(chuàng)建了一個新變量,但是字段處于未初始化狀態(tài)祟敛;如果此時試圖訪問字段倍奢,將發(fā)生編譯錯誤。通過調用構造函數垒棋,可確保字段被初始化了。
結構初始化的另一個方面是痪宰,不能將未完全初始化的結構變量賦給另一個結構變量叼架,即不能將這樣的變量放在賦值運算符右邊。這意味著下面的代碼合法:
NumberStruct ns1 = new NumberStruct();
NumberStruct ns2 = ns1;
但下面的代碼非法:
NumberStruct ns1;
NumberStruct ns2 = ns1;

ps:自定義默認構造函數
不同于類衣撬,結構不能有自定義的默認構造函數乖订,也不能在構造函數外面初始化結構。因此具练,創(chuàng)建結構時乍构,所有字段都被初始化為零值。
可以提供重載的構造函數扛点,并利用構造函數串接哥遮。然而,當提供重載的構造函數時陵究,必須初始化所有字段眠饮,這可在該構造函數中顯式地進行,也可通過串接構造函數隱式地完成铜邮。
有趣的是仪召,如果未顯式初始化的字段都可接受零值,就可串接默認構造函數松蒜。

struct NumberStruct
{
    public int Value;
}

class NumberClass
{
    public int value = 0;
}

class Test
{
    static void Main()
    {
        NumberStruct ns1 = new NumberStruct ();
        NumberStruct ns2 = ns1;
        ns2.Value = 42;

        NumberClass nc1 = new NumberClass ();
        NumberClass nc2 = nc1;
        nc2.value = 42;
        Console.WriteLine ("Struct:{0),{1}", ns1.Value, ns2.Value);
        Console.WriteLine ("Class:{0),{1}", nc1.Value, nc2.Value);
    }
}

由于ns1和ns2都是值類型NumberStruct扔茅,它們有各自的存儲空間,因此給ns2.Number賦值不會影響ns1.Number的值秸苗。然而召娜,由于nc1和nc2都是引用類型,并且指向同一個存儲位置难述,因此給nc2.Number賦值將影響nc1.Number的值萤晴。
ps:使用屬性還是公有字段
對于結構應使用屬性還是公有字段存在一些爭議。有些人認為總是應該使用屬性胁后,即使是在結構這樣的簡單類型中店读;而有些人認為,在結構中使用公有字段是能夠接受的攀芯。
雖然使用公有字段更容易屯断,但是這導致值類型是可以修改的,而通常不希望這樣。定義自己的結構時殖演,別忘了它們是值類型氧秘,應像字符串一樣是不可修改的。為此趴久,應提供可用于設置私有字段的構造函數丸相,并提供只讀屬性用于獲取私有字段的值。

附:C#中一些易混淆概念——構造函數彼棍、this關鍵字灭忠、部分類、枚舉

1.構造函數

我們先創(chuàng)建一個類座硕,如下面的代碼:

class Program
    {
        static void Main(string[] args)
        {
     
        }
    }
  //創(chuàng)建一個Person類
    class Person
    {

    }

然后生成代碼弛作。

我們使用.NET Reflector反編譯該程序集。會發(fā)現該類一被編譯华匾,CLR會自動的為該類創(chuàng)建一個默認的構造函數映琳。如下圖:

Paste_Image.png

所以在創(chuàng)建該對象的時候,會默認的為該類生成一個無參數的空方法體的構造函數蜘拉。如果我們不顯式的寫明構造函數萨西,CLR會為我們調用默認的構造函數。

class Person
    {
        //聲明有實現的構造函數
        public Person()
        {
            Console.WriteLine("我是超人旭旭!");
        }
    }

再次反編譯該程序集原杂,會發(fā)現添加的構造函數覆蓋了C#編譯器默認為該類生成的構造函數,如下圖:

Paste_Image.png

所以您机,當程序員手動添加了任意類型的構造函數穿肄,C#編譯器就不會為該類添加默認的構造函數。

構造函數的特點:

①訪問修飾符一般是Public②沒有返回值际看,方法名與類名稱一致咸产;

2.This關鍵字的作用

①this關鍵字代表當前對象,當前運行在內存中的那一個對象仲闽。我們添加如下的代碼:

private int nAge;

        public int NAge
        {
            get { return nAge; }
            set { nAge = value; }
        }

        //聲明有實現的構造函數
        public Person()
        {
            this.NAge = 100;
            Console.WriteLine("我是超人脑溢!");
        }

這時候我們反編譯該程序集,會看到如下結果:

Paste_Image.png

可以看到this關鍵字代替的就是當前的Person對象赖欣。

②this關鍵字后面跟“:”符號屑彻,可以調用其它的構造函數

我們再添加如下的代碼:

        #region 對象的構造函數
        //聲明有實現的構造函數
        public Person()
        {
            this.NAge = 100;
            Console.WriteLine("我是超人!");
        }

        public Person(int nAge)
        {
            Console.WriteLine("超人的年齡{0}", nAge);
        }
    //使用this關鍵字調用了第二個一個參數的構造函數
        public Person(int nAge, string strName)
            : this(1)
        {
            Console.WriteLine("我是叫{0}的超人顶吮,年齡{1}", strName, nAge);
        }
        #endregion

我們創(chuàng)建該對象看看是否調用成功社牲。在Main函數中添加如下代碼:

Person p = new Person(10,"強子");

我們運行代碼,看到的打印結果如下:

Paste_Image.png

由結果我們可以分析出悴了,當含有兩個默認參數的對象創(chuàng)建的時候應該先調用了一個參數的構造函數對對象進行初始化搏恤,然后有調用了含有兩個參數的構造函數對對象進行初始化违寿。

那么到底是不是這個樣子呢?看下邊的調試過程:

Paste_Image.png

通過上面的調試過程我們會發(fā)現熟空,當構造函數使用this關鍵字調用其它的構造函數時藤巢,首先調用的是該調用的構造函數,在調用被調用的構造函數息罗,先執(zhí)行被調用的構造函數掂咒,在執(zhí)行直接調用的構造函數。

為什么要這個順序執(zhí)行迈喉?因為我們默認的傳值是10俏扩,我們需要打印的超人的年齡是“10”,如果先執(zhí)行直接調用的構造函數弊添,就會被被調用構造函數覆蓋。

3.部分類

在同一命名空間下可以使用partial關鍵字聲明相同名稱的類(同一命名空間下默認不允許出現相同的類名稱)捌木,叫做部分類或者伙伴類油坝。

如下圖,當在同一命名空間下聲明相同名稱的類刨裆,編譯器報錯:

Paste_Image.png

當我們使用Partial關鍵字時澈圈,可以順利編譯通過,如下圖:

Paste_Image.png

分別添加如下的代碼:

partial class  Person
    {
        private string strAddress;

        public string StrAddress
        {
            get { return strAddress; }
            set { strAddress = value; }
        }
        private string strNumber;

        public string StrNumber
        {
            get { return strNumber; }
            set { strNumber = value; }
        }

        public void Run()
        {

        }
    }

   
    partial class  Person
    {

        #region 對象屬性
        private int nAge;

        public int NAge
        {
            get { return nAge; }
            set { nAge = value; }
        }

        private string strName;

        public string StrName
        {
            get { return strName; }
            set { strName = value; }
        }
       
        #endregion

        #region 對象的構造函數
        //聲明有實現的構造函數
        public Person()
        {
            this.NAge = 100;
            Console.WriteLine("我是超人帆啃!");
        }

        public Person(int nAge)
        {
            Console.WriteLine("超人的年齡{0}", nAge);
        }

        public Person(int nAge, string strName)
            : this(1)
        {
            Console.WriteLine("我是叫{0}的超人瞬女,年齡{1}", strName, nAge);
        }
        #endregion

        public void Sing()
        {

        }
    }

我們再次反編譯該程序集,會發(fā)現如下的結果:

Paste_Image.png

我們會發(fā)現使用Partial關鍵字的兩個同名類努潘,被編譯成了同一個類诽偷。

所以部分類的特點:

①必須在同一個命名空間下的使用Partial關鍵字的同名類

②部分類其實就是一個類,C#編譯器會把它們編譯成一個類

③在一個伙伴類中定義的變量可以在另一個伙伴類中訪問(因為他們就是一個類)疯坤。

4.Const關鍵字和Readonly關鍵字的區(qū)別

1)const關鍵字

在Main函數中添加如下的代碼:

        const string strName = "強子";
            Console.WriteLine("我的名字叫{0}",strName);

編譯過后报慕,我反編譯該程序集發(fā)現如下結果:

Paste_Image.png

發(fā)現定義的常量并沒有出現在反編譯的代碼中,而且使用Const常量的地方被常量代替了压怠。

2)readonly關鍵字

添加如下代碼:

class cat
    {
        readonly string reOnlyName = "強子";
        public cat()
        {
            Console.WriteLine(reOnlyName);
        }
    }

生成后反編譯該程序集發(fā)現眠冈,如下結果:

Paste_Image.png

我們發(fā)現被readonly修飾的變量并沒有被賦值,這是什么回事呢菌瘫?我們點擊cat類的構造函數時蜗顽,看到如下結果:

Paste_Image.png

我們發(fā)現被readonly修飾的變量是在被調用的時候賦值的。

那么被readonly修飾的變量的是就是不可變的么雨让?當然不是雇盖,由反編譯的結果我們知道,readonly修飾的變量是在被調用的時候在構造函數中被賦值的栖忠,那么我們可以在構造函數中修改readonly的默認值

添加如下代碼:

class cat
    {
        readonly string reOnlyName = "強子";
        public cat()
        {
            this.reOnlyName = "子強";
            Console.WriteLine(reOnlyName);
        }
    }

在Main()函數中添加如下的代碼:

  cat ct = new cat();

運行結果如下:

Paste_Image.png

說明我們成功在構造函數中修改了readonly變量的值刊懈。

readonly和const的區(qū)別:

const常量在聲明的時候就必須賦初始值这弧,這樣聲明變量可以提高程序的運行效率。而readonly變量聲明時可以不賦初始值虚汛,但一定要早構造函數中賦初始值匾浪。

也就是說,const變量在編譯的時候就要確定常量的值卷哩,而readonly是在運行的時候確定該變量的值的蛋辈。

5.解析枚舉

枚舉的級別和類的級別一樣,可以自定義數據類型将谊,可以在枚舉名稱后使用“:”來指明枚舉類型冷溶。看如下代碼:

//定義一個方向的枚舉類型尊浓,枚舉成員使用","分割
    enum Direction:string
    {
        east,
        west,
        south,
        north
    }

編譯會報錯逞频,錯誤信息如下:

Paste_Image.png

由此我們可以知道枚舉的數據類型是值類型。

因為枚舉是數據類型栋齿,所以可以直接聲明訪問苗胀,如下代碼:

class Program
    {
        static void Main(string[] args)
        {
            //枚舉是數據類型可以直接聲明
            Direction dr = Direction.east;

            Console.WriteLine(dr);

            Console.ReadKey();
        }
    }

    //定義一個方向的枚舉類型,枚舉成員使用","分割
    enum Direction
    {
        east,
        west,
        south,
        north
    }

也可以這樣訪問枚舉類型

class Program
    {
        static void Main(string[] args)
        {
            //枚舉是數據類型可以直接聲明
          // Direction dr = Direction.east;

            Person p=new Person();
            //直接調用枚舉變量
            p.dir = Direction.east;
            Console.WriteLine(p.dir);

            Console.ReadKey();
        }
    }

    class Person
    {
        private string strName;
        //直接聲明枚舉變量
        public Direction dir;
    }

每一個枚舉成員都對應了一個整型的數值瓦堵,這個數值默認從0開始遞增基协,可以通過強制轉換獲取該枚舉所代表的值」接茫可以通過如下的代碼訪問:

        Direction dr = Direction.east;
            int i = (int)dr;

我們還可以手動為每一個枚舉成員賦值澜驮,代表的是整型數值,賦值后該枚舉成員所代表的值就是所賦的值惋鸥。如下代碼:

enum Direction
    {
        east=1,
        west=0,
        south=2,
        north=3
    }

將字符串轉換成枚舉

      string strDir = "east";
            //將字符串轉換成枚舉類型
            Direction d1=(Direction)Enum.Parse(typeof(Direction),strDir);
            //轉換的時候忽略大小寫
            Direction d2 = (Direction)Enum.Parse(typeof(Direction), strDir,true);

最后我們再來探究一個空指針異常的問題

首先我們先聲明一個Dog類:

class Dog
    {
        private int nAge;

        public int NAge
        {
            get { return nAge; }
            set { nAge = value; }
        }
        private string strName;

        public string StrName
        {
            get { return strName; }
            set { strName = value; }
        }
    }

在Main()函數中我們這樣調用


      Dog d = null;
            d.StrName = "旺旺";

結果會報錯杂穷,如下圖

Paste_Image.png

我們已經為屬性,封裝字段了卦绣,但是為什么沒有辦法給字段賦值呢亭畜?我們就來探究一下這個問題。

當我們實例化Dog對象迎卤,即

Dog d = new Dog();

.NET Framwork做了什么工作呢拴鸵?如下圖:

Paste_Image.png

那為什么會報錯呢,原因如下圖:

Paste_Image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末蜗搔,一起剝皮案震驚了整個濱河市劲藐,隨后出現的幾起案子,更是在濱河造成了極大的恐慌樟凄,老刑警劉巖聘芜,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異缝龄,居然都是意外死亡汰现,警方通過查閱死者的電腦和手機挂谍,發(fā)現死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞎饲,“玉大人口叙,你說我怎么就攤上這事⌒嵴剑” “怎么了妄田?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驮捍。 經常有香客問我疟呐,道長,這世上最難降的妖魔是什么东且? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任启具,我火速辦了婚禮,結果婚禮上珊泳,老公的妹妹穿的比我還像新娘鲁冯。我一直安慰自己,他們只是感情好旨椒,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堵漱,像睡著了一般综慎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勤庐,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天示惊,我揣著相機與錄音,去河邊找鬼愉镰。 笑死米罚,一個胖子當著我的面吹牛,可吹牛的內容都是我干的丈探。 我是一名探鬼主播录择,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碗降!你這毒婦竟也來了隘竭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤讼渊,失蹤者是張志新(化名)和其女友劉穎动看,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體爪幻,經...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡菱皆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年须误,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仇轻。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡京痢,死狀恐怖,靈堂內的尸體忽然破棺而出拯田,到底是詐尸還是另有隱情历造,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布船庇,位于F島的核電站吭产,受9級特大地震影響,放射性物質發(fā)生泄漏鸭轮。R本人自食惡果不足惜臣淤,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窃爷。 院中可真熱鬧邑蒋,春花似錦、人聲如沸按厘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逮京。三九已至卿堂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懒棉,已是汗流浹背草描。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留策严,地道東北人穗慕。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像妻导,于是被迫代替她去往敵國和親逛绵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,783評論 1 10
  • 前言 人生苦多倔韭,快來 Kotlin 暑脆,快速學習Kotlin! 什么是Kotlin狐肢? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,161評論 9 118
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評論 1 51
  • Hello Word 在屏幕上打印“Hello, world”添吗,可以用一行代碼實現: 你不需要為了輸入輸出或者字符...
    restkuan閱讀 3,169評論 0 6
  • 人們都說,高中生活好比地獄份名,而大學是天堂碟联,是象牙塔妓美。對于沒有考進理想大學的我來說,這種說法實在荒謬鲤孵。大學更...
    鑲鉆白骨精閱讀 263評論 0 0