Tôi đã bắt đầu sử dụng các lớp triển khai IDisposable để viết các khối trong luồng, với câu lệnh sử dụng. Điều này rất hữu ích để giữ cho lồng ghép chính xác và tránh các bộ phận bắt đầu/kết thúc bị thiếu hoặc bị đặt sai.sử dụng (IDisposable obj = new ...) trong C# để viết các khối mã trong luồng (ví dụ: XML)
Về cơ bản, hàm tạo ghi khởi đầu của một khối (ví dụ: mở thẻ XML), Vứt bỏ() kết thúc (ví dụ: đóng thẻ XML). Ví dụ là UsableXmlElement dưới đây (nó dành cho các XML lớn, vì vậy LINQ to XML hoặc XmlDocument trong bộ nhớ không có tùy chọn).
Tuy nhiên, IDisposable này không triển khai mẫu phức tạp do Microsoft đề xuất, với Trình phá hủy/Trình kết thúc, phương thức Vứt bỏ (bool) riêng biệt và GC.SuppressFinalize(). Vứt bỏ chỉ đơn giản là viết các yếu tố kết thúc, và đó là nó.
Có bất kỳ khía cạnh nào dưới đây hay đây là cách tốt để duy trì việc lồng ghép đúng các yếu tố?
class UsableXmlElement : IDisposable
{
private XmlWriter _xwriter;
public UsableXmlElement(string name, XmlWriter xmlWriter)
{
_xwriter = xmlWriter;
_xwriter.WriteStartElement(name);
}
public void WriteAttribute<T>(string name, T value)
{
_xwriter.WriteStartAttribute(name);
_xwriter.WriteValue(value);
_xwriter.WriteEndAttribute();
}
public void WriteValue<T>(T value)
{
_xwriter.WriteValue(value);
}
public void Dispose()
{
_xwriter.WriteEndElement();
}
}
Cách sử dụng như sau:
var xWriter = new XmlWriter(...)
using(var rootElement = new UsableXmlElement("RootElement", xWriter)
{
rootElement.WriteAttribute("DocVersion", 123)
using(var innerElement = new UsableXmlElement("InnerElement", xwriter)
{
// write anything inside Inner element
}
}
Hệ quả là:
<RootElement DocVersion="123">
<InnerElement>
<!-- anything -->
</InnerElement>
</RootElement>
Tại sao nó lại là một vấn đề? Bạn không có bất kỳ tài nguyên không được quản lý trong UsableXmlElement của bạn, vì vậy bạn không cần bất kỳ finalizers, tôi nghĩ rằng ... – user1096188
Oh, và bạn không cần WriteValue và WriteAttribute là chung chung. Nó không làm bất cứ điều gì, như _xwriter.WriteValue sẽ luôn được gọi với một tham số đối tượng. – user1096188
Hummmmmm ........ – code4life