C# 谁拥有放置在剪贴板上的MemoryStream对象?(或者应该使用MemoryStream以外的东西?)

C# 谁拥有放置在剪贴板上的MemoryStream对象?(或者应该使用MemoryStream以外的东西?),c#,wpf,clipboard,memorystream,C#,Wpf,Clipboard,Memorystream,我有这样一种方法: public DataObject GetClipboardData() { var result = new DataObject(); result.SetText(this.fallbackText.ToString()); result.SetData(DataFormats.Html, this.GenerateHtml(), false); return result; } 其中GenerateHtml返回MemoryStream

我有这样一种方法:

public DataObject GetClipboardData()
{
    var result = new DataObject();
    result.SetText(this.fallbackText.ToString());
    result.SetData(DataFormats.Html, this.GenerateHtml(), false);
    return result;
}
其中
GenerateHtml
返回
MemoryStream

我是否需要担心关闭
MemoryStream
对象?还是应该使用其他类型的对象将原始字节放在剪贴板上


(我尝试了
byte[]
,但这会将文本
“System.byte[]”
或类似文本放在剪贴板上)

我认为,如果一个对象实现了
IDisposable
,那么在您不再需要它时处理它是一件好事

DataObject
提供了
IDataObject
接口的基本实现,为什么不从中派生:

public sealed class HtmlDataObject : DataObject, IDisposable
{
    protected MemoryStream HtmlMemoryStream { get; set; }

    public HtmlDataObject(MemoryStream memoryStream, string fallBackText)
    {
        HtmlMemoryStream = memoryStream;
        SetText(fallBackText);
        SetData(DataFormats.Html, false, HtmlMemoryStream );
    }
    public void Dispose()
    {
        HtmlMemoryStream .Dispose();
    }
}
因此,可以更改您的方法:

public HtmlDataObject GetClipboardData()
{
    return new HtmlDataObject(this.GenerateHtml(), this.fallbackText.ToString());
}
您可以在使用完后将其放入
using语句
Dispose()

最后一个想法:您不应该担心剪贴板数据,因为退出应用程序时,
DataObject
将被销毁,您的剪贴板将丢失您放在其中的内容。


如果您想在处理流之后和/或当应用程序退出时持久化该流,您必须使用
copy
参数=
true

,您可以将其作为Base64字符串放在剪贴板上,这样您就不必担心MemoryStream的生存期。@Kevin:Base64不符合
DataFormats.Html
标准。()我认为理论上你应该担心,但实际上不是,因为剪贴板将创建指向相同MemoryStream数据的指针副本,但在此之后,它的生存期取决于操作系统中的其他应用程序。因此,即使您通过调用Dispose()可以销毁它,从行为的角度来看,它也不正确。您不需要处理Memorystream:它是一个美化的字节[]。如果您担心内存泄漏,请发送半GB以查看是否正确清理了它。@jdv:有记录吗?我在
MemoryStream
的合同中找不到任何说明可以不关闭它的内容。这只是将问题转移到了
剪贴板上。SetData
:)@BillyONeal我不同意,因为当您处理HtmlData对象时,MemoryStream已被处理。对象通过引用传递。如何知道是否销毁HtmlDataObject?它被传递到剪贴板。剪贴板是复制还是仅引用现有对象?@BillyONeal退出应用程序时,它将被销毁: