MailMessage儲存為eml檔案(C#+SmtpClient)

.NET 自從2.0開始,大大提升了 Mail.SmtpClient 的功能,對於發郵件,可謂遊刃有餘了。但是,美中不足的是沒有提供儲存郵件內容為eml檔案的功能實際上,SmtpClient 和 MailMessage 已經實現了這個功能,只是這個功能是 NonPublic 的,對於空間外,不可見而已。利用 Reflector 反編譯一下 System.Net.Mail.SmtpClient 可以看到:在 Send(MailMessage) 方法中,在MAIL被發送之前,是調用了一個

基於Linux作業系統上的C編程與核心導讀

動態記憶體的使用上一節的方法雖然可以避免溢出的問題,但會導致資料的丟失,下面我們就來學習一種更好的方法-動態記憶體的使用。由於動態記憶體是完全由使用者自行分配使用的,因此需要用到一些系統調用,下面我們就分別學習它們。首先我們需要的是動態記憶體分配的系統調用calloc()函數,其函數原型為:#includevoid *malloc(size_t size);void *calloc(size_t nmemb,size_t

Effective C#原則29:僅在對基類進行強制更新時才使用new修飾符

你可以用new修飾符來重新定義一個從基類中繼承來的非虛成員。你可以這樣 做,但並不意味著需要這樣做。重新定義非虛方法會導致方法含意的混亂。如果 兩個相關的類是繼承關係,那麼很多開發人員可能會立即假設兩段代碼塊是做完 全相同的事情,而且他們也會這麼認為:object c = MakeObject( );// Call through MyClass reference:MyClass cl = c as MyClass;cl.MagicMethod( );// Call through

Effective C#原則28:避免轉換操作

轉換操作是一種等代類型(Substitutability)間操作轉換操作。等代類型就 是指一個類可以取代另一個類。這可能是件好事:一個衍生類別的對象可以被它基 類的一個對象取代,一個經典的例子就是形狀繼承。先有一個形狀類,然後派生 出很多其它的類型:長方形,橢圓形,圓形以及其它。你可以在任何地方用圖形 狀來取代圓形,這就是多態的等代類型。這是正確的,因為圓形就是一個特殊的 形狀。當你建立一個類時,明確的類型轉化是可以自動完成的。正如.Net中類的

Effective C#原則27:避免使用ICloneable

ICloneable看上去是個不錯的主意:為一個類型實現ICloneable介面後就可 以支援拷貝了。如果你不想支援拷貝,就不要實現它。但你的對象並不 是在一個“真空”的環境中運行,但考慮到對衍生類別的些影響,最好 還是對ICloneable支援。一但某個類型支援ICloneable, 那麼所有的衍生類別都必 須保持一致,也就是所有的成員必須支援ICloneable介面或者提供一種機制支援 拷貝。最後,支援深拷貝的對象,在建立設計時如果包含有網路結構的對象,會

Effective C#原則26:用IComparable和IComparer實現對象的循序關聯性

你的類型應該有一個循序關聯性,以便在集合中描述它們如何儲存以及排 序。.Net架構為你提供了兩個介面來描述對象的循序關聯性:IComparable 和 IComparer。IComparable 為你的類定義了自然順序,而實現IComparer介面的類 可以描述其它可選的順序。你可以在實現介面時,定義並實現你自己關係操作符 (<,>,<=,>=),用於避免在運行時預設比較關係的低效問題。這 一原則將討論如何?循序關聯性,以便.Net架構的核心可以通過你定義的介面對

Effective C#原則25 讓你的類型支援序列化

對象的持久是類型的一個核心功能。這是一個在你忽略對它的支援以前,沒 有人會注意到的基本元素之一。 如果你的類型不能恰當的支援序列化,那麼對 於把你類的做為基類或者成員的開發人員來說,你會給他們增加很多的工作量。 當你的類型不支援序列化時,他們不得不圍繞這工作,自己添加實現這個標準的 功能。而對於不能訪問類的私人成員的開發人來說,恰當的實現你的類型的序列 化是不太可能的。如果你的類型不支援序列化,那麼對於你的使用者來說,想再要 實現實它是很困難或者根本就不可能的事。取而代之的是,為你的實際

Effective C#原則24:選擇申明式編程而不是命令式編程

與命令式編程相比,申明式編程可以用更簡單,更清楚的方法來描述軟體的 行為。申明式編程就是說用申明來定義程式的行為,而不是寫一些指令。在C#裡 ,也和其它大多數語言一樣,你的大多數程式都是命令式的:在程式中寫一個方 法來定義行為。在C#中,你在編程時使用特性就是申明式編程。你添加一個特性 到類,屬性,資料成員,或者是方法上,然後.Net運行時就會為你添加一些行為 。這樣申明的目的就是簡單易用,而且易於閱讀和維護。讓我們以一個 你已經使用過的例子開始。當你寫你的第一個ASP.Net

Effective C#原則23:避免返回內部類對象的引用

你已經知道,所謂的唯讀屬性就是指調用者無法修改這個屬性。不幸運的是 ,這並不是一直有效。如果你建立了一個屬性,它返回一個參考型別,那麼調 用者就可以訪問這個對象的公用成員,也包括修改這些屬性的狀態。例如:public class MyBusinessObject{ // Read Only property providing access to a // private data member:  private DataSet _ds; public DataSet Data {  

Effective C#原則22:用事件定義對外介面

可以用事件給你的類型定義一些外部介面。事件是基於委託的,因為委託可 以提供型別安全的函數簽名到事件控制代碼上。加上大多數委託的例子都是使用事件 來說明的,以至於開發人員一開始都認為委託與事件是一回事。在原則21裡,我 已經展示了一些不在事件上使用委託的例子。在你的類型與其它多個客戶進行通 信時,為了完成它們的行為,你必須引發事件。一個簡單的例子,你正 在做一個日誌類,就像一個資訊發布機一樣在應用程式裡發布所有的訊息。它接 受所有從程式源發布的訊息,並且把這些訊息發布到感興趣的聽眾那裡。這些聽

Effective C#原則21:用委託來表示回調

我:“兒子,到院子裡除草去,我要看會書。”斯科特: “爸,我已經打掃過院子了。”斯科特:“爸,我已經 把草放在除草機上了。”斯科特:“爸,除草機不能啟動了 。”我:“讓我來啟動它。”斯科特:“ 爸,我做好了。”這個簡單的互動展示了回調。我給了我兒子一個 任務,並且他可以報告狀態來(重複的)打斷我。而當我在等待他完成任務的每一

Effective C#原則20:明辨介面實現和虛函數重載的區別

粗略的看一下,感覺實現介面和虛函數重載是一樣的。你定義了一些對象, 但是這些對象是在另一個類型裡申明的。你被第一感覺騙了,實現介面與虛函數 重載是完全不同的。在介面裡定義的成員預設情況下,是根本不存在實際內容的 。衍生類別不能重載基類中的介面成員。介面可以隱式的實現,就是把它 們從類的公用介面中隱藏。它們的概念是不同的而且使用也是不同的。但你可以這樣的實現介面:讓你的衍生類別可以修改你的實現。你只用對衍生類別做 一個Hook就行了。(譯註:相信寫過C++程式的人就知道hook是什麼意思,而且我

Effective C# 第三章,用C#表達你的設計

C#語言為你的設計介紹了一種新的文法,你可以選擇這種技術讓你的設計與 其它的開發人員進行交流,這些開發人員可以維護,擴充或者是使用你設計的軟 件。C#的所有類型都是生存在.Net環境下的,這個環境對於所有類型的相容性做 了一些好的假設。但如果你違反了這些假設,你就增加了類型不能正確工作的可 能性。這些原則不是那些已經出版了的軟體設計技術的概要,相反,這 些原則醒目的給出了怎樣用不同的C#語言特性來表達最好的軟體設計意圖。C#語

Effective C#原則19:選擇定義和實現介面而不是繼承

抽象類別在類的繼承中提供了一個常規的“祖先”。一個介面描述 了一個可以被其它類型實現的原子級泛型功能。各有千秋,卻也不盡相同。介面 是一種合約式設計:一個類型實現了某個介面的類型,就必須實現某些期望的方 法。抽象類別則是為一個相關類的集合提供常規的抽象方法。這些都是老套的東西 了:它是這樣的,繼承就是說它是某物(is a,),而介面就是說它有某個功能 (behaves like.)! 這些陳詞濫調已經說了好久了,因為它們提供了說明,同時

Effective C#原則18:實現標準的處理(Dispose)模式

我們已經討論過,處理一個佔用了非託管資來源物件是很重要的。現在是時候 來討論如何寫代碼來管理這些類佔用的非記憶體資源了。一個標準的模式就是利用 .Net架構提供的方法處理非記憶體資源。你的使用者也希望你遵守這個標準的模式。也就是通過實現IDisposable介面來釋放非託管的資源,當然是在使用者記得調用 它的時候,但如果使用者忘記了,解構函式也會被動的執行。它是和記憶體回收行程一 起工作的,確保在一些必要時候,你的對象只會受到因解構函式而造成的效能損

Effective C#原則17:裝箱和拆箱的最小化

實值型別是資料的容器,它們不具備多太性。另一方面就是說,.Net架構被設 計成單一繼承的參考型別,System.Object,在整個繼承關係中做為根對象存在 。設計這兩種類型的目的是截然不同的,.Net架構使用了裝箱與拆箱來連結兩種 不同類型的資料。裝箱是把一個實值型別資料放置在一個無類型的引用對象上,從 而使一個實值型別在須要時可以當成參考型別來使用。拆箱則是額外的從“ 箱”上拷貝一份實值型別資料。裝箱和拆箱可以讓你在須要使用

Effective C#原則16:垃圾最小化

記憶體回收行程對記憶體管理表現的非常出色,並且它以非常高效的方法移除不再 使用的對象。但不管你怎樣看它,申請和釋放一個基於堆記憶體的對象總比申請和 釋放一個不基於堆記憶體的對象要花上更多的處理器時間。你可以給出一些嚴重的 效能問題,例如應用程式在某個方法內分配過量的引用對象。你不應該 讓記憶體回收行程超負荷的工作,為了程式的效率,你可以使用一些簡單的技巧來減 少記憶體回收行程的工作。所有的參考型別,即使是局部變數,都是在堆上分配的。 所有參考型別的局部變數在函數退出後馬上成為垃圾,一個最常見的&

Effective C#原則15:使用using和try/finally來做資源清理

使用非託管資源的類型必須實現IDisposable介面的Dispose()方法來精確的 釋放系統資源。.Net環境的這一規則使得釋放資原始碼的職責是類型的使用者, 而不是類型或系統。因此,任何時候你在使用一個有Dispose()方法的類型時, 你就有責任來調用Dispose()方法來釋放資源。最好的方法來保證Dispose()被調 用的結構是使用using語句或者try/finally塊。所有包含非託管資源的 類型應該實現IDisposable介面,另外,當你忘記恰當的處理這些類型時,它們

Effective C#原則14:使用建構函式鏈

寫建構函式是一個反覆的工作。很多開發人員都是先寫一個建構函式,然後 複製粘貼到其它的建構函式裡,以此來滿足類的一些重載介面。希望你不是這樣 做的,如果是的,就此停止吧。有經驗的C++程式可能會用一個輔助的私人方法 ,把常用的演算法放在裡面來構造對象。也請停止吧。當你發現多重建構函式包含 相同的邏輯時,取而代之的是把這些邏輯放在一個常用的建構函式裡。你可以得 避免代碼的重複的好處,並且建構函式初始化比對象的其它代碼執行起來更高效

Effective C#原則13:用靜態建構函式初始化類的靜態成員

(譯註:initializer在上文中譯為了“初始化器”,實在不好聽 ,本文中全部改譯為:“預置方法”)你應該知道,在一個類 型的任何執行個體初始化以前,你應該初始化它的靜態成員變數。在裡C#你可以使用 靜態預置方法和靜態建構函式來實現這個目的。一個類的靜態建構函式是一個 與眾不同的,它在所有的方法,變數或者屬性訪問前被執行。你可以用這個函數 來初始化靜態成員變數,強制使用單件模式,或者實現其它任何在類型的執行個體可

總頁數: 4314 1 .... 2814 2815 2816 2817 2818 .... 4314 Go to: 前往

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.