優(yōu)化C#程序的四十七種方法

資源來自交流群

一、用屬性代替可訪問的字段

1、.NET數(shù)據(jù)綁定只支持數(shù)據(jù)綁定姚糊,使用屬性可以獲得數(shù)據(jù)綁定的好處;
2授舟、在屬性的get和set訪問器重可使用lock添加多線程的支持救恨。

二、readonly(運行時常量)和const(編譯時常量)

1岂却、const只可用于基元類型、枚舉裙椭、字符串躏哩,而readonly則可以是任何的類型;
2揉燃、const在編譯時將替換成具體的常量扫尺,這樣如果在引用中同時使用了const和readonly兩種值,則對readonly的再次改變將會改變設(shè)計的初衷炊汤,這是需要重新編譯所更改的程序集正驻,以重新引用新的常量值弊攘。
3、const比readonly效率高姑曙,但失去了應(yīng)用的靈活性襟交。

三、is與as

1伤靠、兩者都是在運行時進行類型的轉(zhuǎn)換捣域,as操作符只能使用在引用類型,而is可以使用值和引用類型宴合;
2焕梅、通常的做法是用is判斷類型,然后選擇使用as或強類型轉(zhuǎn)換操作符(用operater定義的轉(zhuǎn)換)有選擇地進行卦洽。

四贞言、ConditionalAttribute代替#if #endif條件編譯

1、ConditionalAttribute只用于方法級阀蒂,對其他的如類型该窗、屬性等的添加都是無效的;而#if #endif則不受此限制脂新;
2挪捕、ConditionalAttribute可以添加多個編譯條件的或(OR)操作,而#if #endif則可以添加與(AND)[這里可以完全定義為另一個單獨的符號]争便;
3级零、ConditioanlAttribute定義可以放在一個單獨的方法中,使得程序更為靈活滞乙。

五奏纪、提供ToString()方法

1、可以更友好的方式提供用戶詳細的信息斩启;
2序调、使用IFormatter.ToString()方法提供更靈活的定制,如果添加IFormatProvider 和ICustomFormatter接口則更有意義的定制消息輸出兔簇。

六发绢、值和引用類型的區(qū)別

1、值類型不支持多態(tài)垄琐,適合存儲應(yīng)用程序操作的數(shù)據(jù)边酒,而引用則支持多態(tài),適用于定義應(yīng)用程序的行為狸窘;
2墩朦、對于數(shù)組定義為值類型可以顯著提高程序的性能;
3翻擒、值類型具有較少的堆內(nèi)存碎片氓涣、內(nèi)存垃圾和間接訪問時間牛哺,其在方法中的返回是以復(fù)制的方式進行,避免暴露內(nèi)部結(jié)構(gòu)到外界劳吠;
4引润、值類型應(yīng)用在如下的場景中:類型的職責主要是用于數(shù)據(jù)存儲;公共接口完全由一些數(shù)據(jù)成員存取屬性定義赴背;永遠沒有子類椰拒;永遠沒有多態(tài)行為.

七、值類型盡可能實現(xiàn)為常量性和原子性的類型

1凰荚、使我們的代碼更易于編寫和維護燃观;
2、初始化常量的三種策略:在構(gòu)造中便瑟;工廠方法缆毁;構(gòu)造一個可變的輔助類(如StringBuilder)。

八到涂、確保0為值得有效狀態(tài)

1脊框、值類型的默認狀態(tài)應(yīng)為0;
2践啄、枚舉類型的0不應(yīng)為無效的狀態(tài)浇雹;在FlagsAttribute是應(yīng)確保0值為有效地狀態(tài);
3屿讽、在字符串為為空時可以返回一個string.Empty的空字符串昭灵。

九、相等判斷的多種表示關(guān)系

1伐谈、ReferenceEquals()判斷引用相等烂完,需要兩個是引用同一個對象時方可返回true;
2诵棵、靜態(tài)的Equals()方法先進行引用判斷抠蚣,再進行值類型判斷的;
3履澳、對于引用類型的判斷可以在使用值語義時使用重寫Equals()方法嘶窄;
4、重寫Equals()方法時也應(yīng)當重寫GetHashCode()方法距贷,同時提供operater==()操作柄冲。

十、理解GetHashCode()方法的缺陷

1储耐、GetHashCode()僅應(yīng)用在基于散列的**定義鍵的散列值羊初,如HashTable或Dictionary滨溉;
2什湘、GetHashCode()應(yīng)當遵循相應(yīng)的三條規(guī)則:兩個相等對象應(yīng)當返回相同的散列碼长赞;應(yīng)當是一個實例不變式;散列函數(shù)應(yīng)該在所有的整數(shù)中產(chǎn)生一個隨機的分布闽撤。

十一得哆、優(yōu)先使用foreach循環(huán)語句

1、foreach可以消除編譯器對for循環(huán)對數(shù)組邊界的檢查哟旗;
2贩据、foreach的循環(huán)變量是只讀的,且存在一個顯式的轉(zhuǎn)換闸餐,在對象的對象類型不正確時拋出異常饱亮;
3、foreach使用的
需要有:具備公有的GetEnumberator()方法舍沙;顯式實現(xiàn)了IEnumberable接口近上;實現(xiàn)了IEnumerator接口;
4拂铡、foreach可以帶來資源管理的好處壹无,因為如果編譯器可以確定IDisposable接口時,可以使用優(yōu)化的try…finally塊感帅;

十二斗锭、默認字段的初始化優(yōu)于賦值語句

1、字段生命默認會將值類型初始化為0失球,引用類型初始化為null岖是;
2、對同一個對象進行多次初始化會降低代碼的執(zhí)行效率她倘;
3璧微、將字段的初始化放到構(gòu)造器中有利于進行異常處理。

十三硬梁、使用靜態(tài)構(gòu)造器初始化靜態(tài)成員

1前硫、靜態(tài)構(gòu)造器會在一個類的任何方法、變量或者屬性訪問之前執(zhí)行荧止;
2屹电、靜態(tài)字段同樣會在靜態(tài)構(gòu)造器之前運行,同時靜態(tài)構(gòu)造器有利于異常處理跃巡。

十四危号、利用構(gòu)造器鏈(在.NET 4.0已經(jīng)用可選參數(shù)解決了這個問題)

1、用this將初始化工作交給另一個構(gòu)造器素邪,用base調(diào)用基類的構(gòu)造器外莲;
2、類型實例的操作順序是:將所有的靜態(tài)字段都設(shè)置為0;執(zhí)行靜態(tài)字段初始化器偷线;執(zhí)行基類的靜態(tài)構(gòu)造器磨确;執(zhí)行當前類型的靜態(tài)構(gòu)造器;
將所有的實例字段設(shè)置為0声邦;執(zhí)行實例字段初始化器乏奥;執(zhí)行合適的基類實例構(gòu)造器;執(zhí)行當前類型的實例構(gòu)造器亥曹。

十五邓了、利用using和try/finally語句來清理資源

在IDisposable接口的Dispose()方法中用GC.SuppressFinalize()可通知垃圾收集器不再執(zhí)行終結(jié)操作。

十六媳瞪、盡量減少內(nèi)存垃圾

1骗炉、分配和銷毀一個堆上的對象都要花費額外的處理器時間;
2蛇受、減少分配對象數(shù)量的技巧:經(jīng)常使用的局部變量提升為字段痕鳍;提供一個類,用于存儲Singleton對象來表達特定類型的常用實例龙巨。
3笼呆、用StringBuilder進行復(fù)雜的字符串操作。

十七旨别、盡量減少裝箱和拆箱

1诗赌、關(guān)注一個類型到System.Object的隱式轉(zhuǎn)換,同時值類型不應(yīng)該被替換為System.Object類型秸弛;
2铭若、使用接口而不是使用類型可以避免裝箱,即將值類型從接口實現(xiàn)递览,然后通過接口調(diào)用成員叼屠。

十八、實現(xiàn)標準Dispose模式

1绞铃、使用非內(nèi)存資源镜雨,它必須有一個終結(jié)器,垃圾收集器在完成沒有終結(jié)其的內(nèi)存對象后儿捧,會將實現(xiàn)了終結(jié)器對象的添加到終結(jié)隊列中荚坞,然后垃圾收集器會啟動一個新的線程來運行這些對象上的終結(jié)器,這種防御性的變成方式是因為如果用戶忘記了調(diào)用Dispose()方法菲盾,垃圾回收器總是會調(diào)用終結(jié)器方法的颓影,這樣可以避免出現(xiàn)非托管的內(nèi)存資源不被釋放引起內(nèi)存泄漏的問題;
2懒鉴、使用IDisposable.Dispose()方法需要做四個方面的工作:釋放所有的非托管資源诡挂;釋放所有的托管資源;設(shè)置一個狀態(tài)標記來表示是否已經(jīng)執(zhí)行了Dispose();調(diào)用GC.SuppressFinalize(this)取消對象的終結(jié)操作璃俗;
3南捂、為需要多態(tài)的類型添加一個受保護的虛方法Dispose(),派生類通過重寫這個方法來釋放自己的任務(wù)旧找;
4、在需要IDisoposable接口的類型中麦牺,即使我們不需要一個終結(jié)器也應(yīng)該實現(xiàn)一個終結(jié)器钮蛛。

十九、定義并實現(xiàn)接口優(yōu)于繼承類型

1剖膳、不相關(guān)的類型可以共同實現(xiàn)一個共同的接口魏颓,而且實現(xiàn)接口比繼承更容易;
2吱晒、接口比較穩(wěn)定甸饱,他將一組功能封裝在一個接口中,作為其他類型的實現(xiàn)合同仑濒,而基類則可以隨著時間的推移進行擴展叹话。

二十、明辨接口實現(xiàn)和虛方法重寫

1墩瞳、在基類中實現(xiàn)一個接口時驼壶,派生類需要使用new來隱藏對基類方法的使用;
2喉酌、可以將基類接口的方法申明為虛方法热凹,然后再派生類中實現(xiàn)。

二十一泪电、使用委托表達回調(diào)

1般妙、委托對象本身不提供任何異常捕獲,所以任何的多播委托調(diào)用都會結(jié)束整個調(diào)用鏈相速;
2碟渺、通過顯示調(diào)用委托鏈上的每個委托目標可以避免多播委托僅返回最后一個委托的輸出。

二十二突诬、使用事件定義外部接口

1止状、應(yīng)當聲明為共有的事件,讓編譯器為我們創(chuàng)建add和renmove方法攒霹;
2怯疤、使用System.ComponentModel.EventHandlerList容器來存儲各個事件處理器,在類型中包含大量事件時可以使用他來隱藏所有事件的復(fù)雜性催束。

二十三集峦、避免返回內(nèi)部類對象的引用

1、由于值類型對象的訪問會創(chuàng)建一個該對象的副本,所以定義一個值類型的的屬性完全不會改變類型對象內(nèi)部的狀態(tài)塔淤;
2摘昌、常量類型可以避免改變對象的狀態(tài);
3高蜂、定義接口將訪問限制在一個子集中從而最小化對對象內(nèi)部狀態(tài)的破壞聪黎;
4、定義一個包裝器對象來限制另一個對象的訪問备恤;
5稿饰、希望客戶代碼更改內(nèi)部數(shù)據(jù)元素時可以實現(xiàn)Observer模式,以使對象可以對更改進行校驗或相應(yīng)露泊。

二十四喉镰、聲明式編程優(yōu)于命令式編程

可以避免在多個類似的手工編寫的算法中犯錯誤的可能性,并提供清晰和可讀的代碼惭笑。

二十五侣姆、盡可能將類型實現(xiàn)為可序列化的類型

1、類型表示的不是UI控件沉噩、窗口或者表單捺宗,都應(yīng)使類型支持序列化;
2川蒙、在添加了NonSerializedAttribute的反序列化的屬性時可以通過實現(xiàn)IDeserializationCallback的OnDeserialization()方法裝入默認值偿凭;
3、在版本控制中可以使用ISerializable接口來進行靈活的控制派歌,同時提供一個序列化的構(gòu)造器來根據(jù)流中的數(shù)據(jù)初始化對象弯囊,在實現(xiàn)時還要求SerializationFormatter異常的許可;
4胶果、如果需要創(chuàng)建派生類則需要提供一個掛鉤方法供派生類使用匾嘱。

二十六、使用IComparable和IComparer接口實現(xiàn)排序關(guān)系

1早抠、IComparable接口用于為類型實現(xiàn)最自然的排序關(guān)系霎烙,重載四個比較操作符,可以提供一個重載版的CompareTo()方法蕊连,讓其接受具體類型作為參數(shù)悬垃;
2、IComparer用于提供有別于IComparable的排序關(guān)系甘苍,或者為我們提供類型本身說沒有實現(xiàn)的排序關(guān)系尝蠕。

二十七、避免ICloneable接口

1载庭、對于值類型永遠不需要支持ICloneable接口看彼,使用默認的賦值操作即可廊佩;
2、對于可能需要支持ICloneable接口的基類靖榕,應(yīng)該為其創(chuàng)造一個受保護的復(fù)制構(gòu)造器标锄,并應(yīng)當避免支持IConeable接口。

二十八茁计、避免強制轉(zhuǎn)換操作符

通過使用構(gòu)造器來代替轉(zhuǎn)換操作符可以使轉(zhuǎn)換工作變得更清晰料皇,由于在轉(zhuǎn)換后使用的臨時對象,容易導(dǎo)致一些詭異的BUG星压。

二十九践剂、只有當新版積累導(dǎo)致問題時才考慮使用new修飾符

三十、盡可能實現(xiàn)CLS兼容的程序集
1租幕、創(chuàng)建一個兼容的程序集需要遵循兩條規(guī)則:程序集中所有公有和受保護成員所使用的參數(shù)和返回值類型都必須與CLS兼容;任何與CLS不兼容的公有和受保護成員都必須有一個與CLS兼容的替代品拧簸;
2劲绪、可以通過顯式實現(xiàn)接口來避開CLS兼容類型檢查,及CLSCompliantAttribute不會檢查私有的成員的CLS兼容性盆赤。

三十一贾富、盡可能實現(xiàn)短小簡潔的方法

1、JIT編譯器以方法為單位進行編譯牺六,沒有被調(diào)用的方法不會被JIT編譯颤枪;
2、如果將較長的Switch中的Case語句的代碼替換成一個一個的方法淑际,則JIT編譯器所節(jié)省的時間將成倍增加畏纲;
3、短小精悍的方法并選擇較少的局部變量可以獲得優(yōu)化的寄存器使用春缕;
4盗胀、方法內(nèi)的控制分支越少,JIT編譯器越容易將變量放入寄存器锄贼。

三十二票灰、盡可能實現(xiàn)小尺寸、高內(nèi)聚的程序集

1宅荤、將所有的公有類以及共用的基類放到一些程序集中屑迂,把為公有類提供功能的工具類也放入同樣的程序集中,把相關(guān)的公有接口打包到他們自己的程序集中冯键,最后處理遍布應(yīng)用程序中水平位置的類惹盼;
2、原則上創(chuàng)建兩種組件:一種為小而聚合惫确、具有某項特定功能的程序集逻锐,另一種為大而寬夫晌、包含共用功能的程序集。

三十三昧诱、限制類型的可見性

1晓淀、使用接口來暴露類型的功能,可以使我們更方便地創(chuàng)建內(nèi)部類盏档,同時又不會限制他們在程序集外的可用性凶掰;
2、向外暴露的公有類型越少蜈亩,未來擴展和更改實現(xiàn)所擁有的選擇就越多懦窘。

三十四、創(chuàng)建大粒度的Web API

這是在機器之間的交易的頻率和載荷都降到最低稚配,將大的操作和細粒度的執(zhí)行放到服務(wù)器執(zhí)行畅涂。

三十五、重寫優(yōu)于事件處理器

1道川、一個事件處理器拋出異常午衰,則事件鏈上的其他處理器將不會被調(diào)用,而重寫的虛方法則不會出現(xiàn)這種情況冒萄;
2臊岸、重寫要比關(guān)聯(lián)事件處理器高效得多,事件處理器需要迭代整個請求列表尊流,這樣占用了更多的CPU時間帅戒;
3、事件能在運行時響應(yīng)崖技,具有更多的靈活性逻住,可以對同一個事件關(guān)聯(lián)多個響應(yīng);
4迎献、通行的規(guī)則是處理一個派生類的事件是鄙信,重寫方式較好。

三十六忿晕、合理使用.NET運行時診斷

1装诡、System.Diagnostics.Debug\Trace\EventLog為運行時提供了程序添加診斷信息所需要的所有工具,EventLog提供入口時的應(yīng)用程序能寫到系統(tǒng)事件日志中践盼;
2鸦采、最后不要寫自己的診斷庫,.NET FCL 已經(jīng)擁有了我們需要的核心庫咕幻。

三十七渔伯、使用標準配置機制

1、.NET框架的System.Windows.Application類為我們定義了建立通用配置路徑的屬性肄程;
2锣吼、Application.LocalAppDataPath 和 Application.userDataPath 會生成本地數(shù)據(jù)目錄和用戶數(shù)據(jù)的路徑名选浑;
3、不要在ProgramFiles和Windows系統(tǒng)目錄中寫入數(shù)據(jù)玄叠,這些位置需要更高的安全權(quán)限古徒,不要指望用戶擁有寫入的權(quán)限。

三十八读恃、定制和支持數(shù)據(jù)綁定

1隧膘、BindingMananger和CurrencyManager這兩個對象實現(xiàn)了控件和數(shù)據(jù)源之間的數(shù)據(jù)傳輸;
2寺惫、數(shù)據(jù)綁定的優(yōu)勢:使用數(shù)據(jù)綁定要比編寫自己的代碼簡單得多疹吃;應(yīng)該將它用于文本數(shù)據(jù)項之外的范圍 —— 其他顯示屬性也可以被綁定;對于 Windowos Forms 數(shù)據(jù)綁定能夠處理多個控件同步的檢查相關(guān)數(shù)據(jù)源西雀;
3萨驶、在對象不支持所需的屬性時,可以通過屏蔽當前的對象艇肴,然后添加一個想要的對象來支持數(shù)據(jù)綁定腔呜。

三十九、使用.NET驗證

1豆挽、ASP.NET中有五種控件來驗證有效性育谬,可以用CustomValidator派生一個新類來增加自己的認證器券盅;
2帮哈、Windows驗證需要子System.Windows.Forms.Control.Validating寫一個事件處理器。

四十锰镀、根據(jù)需要選用恰當?shù)?*

1娘侍、數(shù)組有兩個比較明顯的缺陷:不能動態(tài)的調(diào)整大小泳炉;調(diào)整大小非常耗時憾筏;
2、ArrayList混合了一維數(shù)組和鏈表的特征花鹅,Queue和Stack是建立在Array基礎(chǔ)上的特殊數(shù)組氧腰;
3、當程序更加靈活的添加和刪除項時刨肃,可以使更加健壯的類型古拴,當創(chuàng)建一個模擬的類時,應(yīng)當為其實現(xiàn)索引器和IEnumberable接口真友。

四十一黄痪、DataSet優(yōu)于自定義結(jié)構(gòu)

1、DataSet有兩個缺點個:使用XML序列化機制的DataSet與非.NET 代碼之間的交互不是很好盔然;DataSet是一個非常通用的容器桅打;
2是嗜、強類型的DataSet打破了更多的設(shè)計規(guī)則,其獲得的開發(fā)效率要遠遠高于自己編寫的看上去更為優(yōu)雅的設(shè)計挺尾。

四十二鹅搪、利用特性簡化反射

通過設(shè)計和實現(xiàn)特性類,強制開發(fā)人員用他們來聲明可被動態(tài)使用的類型潦嘶、方法和屬性涩嚣,可以減少應(yīng)用程序的運行時錯誤,提高軟件的用戶滿意度掂僵。

四十三航厚、避免過度使用反射

1、Invoke成員使用的參數(shù)和返回值都是System.Object锰蓬,在運行時進行類型的轉(zhuǎn)換幔睬,但出現(xiàn)問題的可能性也變得更多了;
2芹扭、接口使我們可以得到一個更為清晰麻顶、也更具可維護性的系統(tǒng),反射是一個很強大的晚期綁定機制舱卡,.NET框架使用它來實現(xiàn)Windows控件和Web控件的數(shù)據(jù)綁定辅肾。

四十四、為應(yīng)用程序創(chuàng)建特定的異常類

1轮锥、需要不同的異常類的唯一原因是讓用戶在編寫catch處理器時能夠方便地對不同的錯誤采取不同的做法矫钓;
2、可能有不同的修復(fù)行為時舍杜,我們才應(yīng)該創(chuàng)建多種不同的異常類新娜,通過提供異常基類所支持的所有構(gòu)造器既绩,可以為應(yīng)用程序創(chuàng)建功能完整的異常類概龄,使用InnerException屬性可以保存更低級別錯誤條件所產(chǎn)生的所有錯誤信息。

四十五饲握、優(yōu)先選擇異常安全保證

1私杜、強異常保證在從異常中恢復(fù)和簡化異常處理之間提供了最好的平衡,在操作因為異常而中斷救欧,程序的狀態(tài)保留不變衰粹;
2、對將要修改的數(shù)據(jù)做防御性的復(fù)制颜矿,對這些數(shù)據(jù)的防御性復(fù)制進行修改寄猩,這中間的操作可能會引發(fā)異常,將臨時的副本和原對象進行交換骑疆;
3田篇、終結(jié)器替废、Dispose()方法和委托對象所綁定的目標方法在任何情況下都應(yīng)當確保他們不會拋出異常。

四十六泊柬、最小化互操作

1椎镣、互操作有三個方面的代價:數(shù)據(jù)在托管堆和非托管堆之間的列舉成本,托管代碼和非托管代碼之間切換的成本兽赁,對開發(fā)人員來說與混合環(huán)境打交道的開發(fā)工作状答;
2、在interop中使用blittable類型可以有效地在托管和非托管環(huán)境中來回復(fù)制刀崖,而不受對象內(nèi)部結(jié)構(gòu)的影響惊科;
3、使用In/Out特性來確保最貼切的不必要的多次復(fù)制,通過聲明數(shù)據(jù)如何被列舉來提高性能;
4宵喂、使用COM Interop用最簡單的方式實現(xiàn)和COM組件的互操作,使用P/Invoke調(diào)用Win32 API,或者使用C++編譯器的/CLR開關(guān)來混合托管和非托管的代碼蜡娶;

四十七、優(yōu)先選擇安全代碼

1映穗、盡可能的避免訪問非托管內(nèi)存窖张,隔離存儲不能防止來自托管代碼和受信用戶的訪問;
2蚁滋、程序集在Web上運行時可以考慮使用隔離存儲宿接,當某些算法確實需要更高的安全許可時,應(yīng)該將那些代碼隔離在一個單獨的程序集中枢赔。

四十八澄阳、掌握相關(guān)工具與資源

1拥知、使用NUnit建立自動單元測試(集成在VS2010 中了)踏拜;
2、FXCop工具會獲取程序集中的IL代碼低剔,并將其與異族編碼規(guī)則和最佳實踐對照分析速梗,最后報告違例情況;
3襟齿、ILDasm是一個IL反匯編工具姻锁,可以幫助我們洞察細節(jié);
4猜欺、Shared Source CLI是一個包含.NET框架內(nèi)核和C#編譯器的實現(xiàn)源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末位隶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子开皿,更是在濱河造成了極大的恐慌涧黄,老刑警劉巖篮昧,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笋妥,居然都是意外死亡懊昨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門春宣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酵颁,“玉大人,你說我怎么就攤上這事月帝□锿铮” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵嚷辅,是天一觀的道長其掂。 經(jīng)常有香客問我,道長潦蝇,這世上最難降的妖魔是什么款熬? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮攘乒,結(jié)果婚禮上贤牛,老公的妹妹穿的比我還像新娘。我一直安慰自己则酝,他們只是感情好殉簸,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沽讹,像睡著了一般般卑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爽雄,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天蝠检,我揣著相機與錄音,去河邊找鬼挚瘟。 笑死叹谁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的乘盖。 我是一名探鬼主播焰檩,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼订框!你這毒婦竟也來了析苫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衩侥,沒想到半個月后浪腐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡顿乒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年议街,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片璧榄。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡特漩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骨杂,到底是詐尸還是另有隱情涂身,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布搓蚪,位于F島的核電站蛤售,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏妒潭。R本人自食惡果不足惜悴能,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雳灾。 院中可真熱鬧漠酿,春花似錦、人聲如沸谎亩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匈庭。三九已至夫凸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阱持,已是汗流浹背夭拌。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留紊选,地道東北人啼止。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓道逗,卻偏偏與公主長得像兵罢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子滓窍,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容