gpt4 book ai didi

c# - 为修改所述集合的集合的每个元素调用方法的安全方法?

转载 作者:行者123 更新时间:2023-12-03 21:51:53 24 4
gpt4 key购买 nike

我有一个这样定义的类(显示了相关方法):

class ShaderProgram : IDisposable
{
private HashSet<Shader> _shaders = new HashSet<Shader>();

public void AttachShader(Shader shader)
{
GL.AttachShader(Handle, shader.Handle);
_shaders.Add(shader);
}

public void DetachShader(Shader shader)
{
GL.DetachShader(Handle, shader.Handle);
_shaders.Remove(shader);
}
}

现在我想弄清楚如何编写 Dispose 方法,我想我可以这样做:

    public void Dispose()
{
foreach(var shader in _shaders)
DetachShader(shader);
GL.DeleteProgram(Handle);
}

但现在我怀疑这是不安全的,因为我正在迭代一个集合并同时从中删除...如果它是一个队列或堆栈,Id 只是说“虽然不为空,弹出一个并删除它” ,但因为它是一个 HashSet ......我不确定最好的方法是什么。我该如何处理?

编辑:重点是避免代码重复;我想为每个元素调用 ShaderProgram.DetachShader。我知道我可以重复该函数中的代码,然后在最后清除整个集合——这不是我想要做的。


我现在突然想到,我真的根本不需要清空 HashSet,对吧? ShaderProgram 对象即将被销毁,我需要做的就是清理任何非托管资源,C# GC 可以清理其余的,对吧?

    public void Dispose()
{
foreach (var shader in _shaders)
GL.DetachShader(Handle, shader.Handle);
GL.DeleteProgram(Handle);
}

也就是说,我仍然想要原始问题的答案。我的目标不是解决一个非常简单的问题,而是学习解决此类问题的最佳方法。

最佳答案

这样做没有问题,但也许您应该考虑迭代您的集合,从您的 GL 变量中分离您的着色器,然后只清除您的 HashSet。如果您不想复制您自己的分离方法中的代码,您应该将其拆分并从这 2 个地方调用它。

关于c# - 为修改所述集合的集合的每个元素调用方法的安全方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8639135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com