簡體   English   中英

高效使用TextWriter

[英]Efficient usage of TextWriter

是否有其他方法可以執行該操作:

textWriter.Write(myBigObject.ToString())

這樣:

  • myBigObject被“流化”為文本表示形式,而無需在內存中創建整個字符串對象
  • 除了myBigObjecttextWriter之外,沒有使用其他類或對象

示例:假設myBigObject有50個字符串字段。 如果可以通過某種方式將字符串一個接一個地寫入文件,那么將所有這些字段合並成一個大字符串然后將對象寫入文件是沒有意義的。

如果可以訪問代碼,則可以向MyBigObject添加一個方法,該方法采用TextWriter並寫出每個屬性。 例如:

public class MyBigObject
{
    public void Write(TextWriter writer)
    {
        writer.Write(bigStringField1);
        writer.Write(bigStringField2);
        // etc.
    }
}

如果MyBigObject子類需要編寫自己的表示形式,則使該方法為虛擬方法,然后這些子類在基類中調用實現。

如果您不擁有代碼,並且這些字段通過屬性公開,則可以構建一個適配器類,該適配器類使用MyBigObject並寫出每個屬性。 您還可以構建一些執行相同操作的擴展方法。

如果您無法訪問源代碼,則可以使用反射來檢查對象上的字段,獲取每個字段的值,然后對每個值的ToString()表示形式進行Write() 但是,反射比直接字段訪問要慢,並且涉及更多的中間對象。 我不知道在您的情況下使用反射是否值得。

鑒於您所概述的限制,這是不可能的。 您將不得不想出一種從對象中讀取數據並將其一次寫出到char / byte / line上的方法。

如果您希望能夠遍歷屬性並一次將其寫出,那么可以使用反射來實現。 但是,我懷疑走這條路線會導致比原始解決方案使用更多的內存,並且比對.ToString()的簡單調用要復雜得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM