0

这是我想要做的:

using(var bmp = Surface.FromBmp("smile.bmp"))
{
    tex = Texture.FromSurface(ref rend, ref bmp);
}

Surface是一个struct。我想避免复制 struct 只是为了将它传递给Texture.FromSurface,所以我将它作为 a 传递,ref即使它没有被修改。C# 没有 const-refs 的概念,所以我不确定我还能做什么。有什么优雅的解决方案吗?

我找到了Jon Skeet 的答案,但它并没有真正提供解决方案。

4

2 回答 2

1

唯一会出现“结构”问题的类型是bmp; 你是说这是一个结构吗?如果是这样,结构实现非平凡方法似乎是非常不寻常的IDisposable.Dispose(),但该类型有可能实现为“不可变”结构,但封装了一个可变引用并表现得像一个。在这种情况下,我会建议类似:

var bmp = Surface.FromBmp("smile.bmp");
try
{
  tex = Texture.FromSurface(ref rend, ref bmp);
}
bmp.Dispose(); // Or whatever method it exposes for such purpose

如果所讨论的类型确实需要处理,它应该为此目的公开一个方法(某些结构类型,如List<T>.Enumerator实现IDisposable,因为它们需要实现接口,而不是因为实例需要清理)。不要强制转换为IDisposable,因为这将创建结构的新盒装实例;这样做的成本将大大超过创建另一个结构实例的成本。您可能可以使用的另一种模式是:

var bmp = Surface.FromBmp("smile.bmp");
using(bmp)
{
  tex = Texture.FromSurface(ref rend, ref bmp);
}

因为我认为这种形式的using声明创建了它自己的参数的私有副本,并且可以让你对原始文件做你喜欢的事情,但是没有真正的理由为什么必须让代码制作额外的副本bmp,所以我不会'不特别推荐这种形式。如果出于某种原因bmp需要清理但不公开除 via 之外的任何方法IDisposable,您可以执行以下操作:

void CallDisposeOnRef<T>(ref T it) where T:IDisposable { it.Dispose(); }

并将我第一个示例的最后一行替换为CallDisposeOnRef(ref bmp);,这样可以避免以任何bmp方式复制参数也将其参数设置为)Disposerefnull

于 2013-07-09T15:13:09.400 回答
1

您可以手动编写使用 ( / )using的相同代码。就像是:tryfinally

IDisposable toClose = null;
try 
{
    var bmp = Surface.FromBmp("smile.bmp"));
    toClose = bmp;
    tex = Texture.FromSurface(ref rend, ref bmp);
}
finally 
{
    toClose.Dispose();
}
于 2013-07-09T05:36:08.733 回答