У меня определен класс, подобный этому (показаны соответствующие методы):
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);
}
Но теперь я подозреваю, что это небезопасно, потому что я перебираю набор и одновременно удаляю из него ... если бы это была очередь или стек, я бы просто сказал "пока нетпусто, вытолкнуть один и удалить его ", но так как это HashSet ... Я не уверен, что лучший подход.Как мне справиться с этим?
Редактировать: Дело в том, чтобы избежать дублирования кода;Я хочу позвонить ShaderProgram.DetachShader
для каждого элемента.Я знаю, что могу повторить код внутри этой функции, а затем очистить весь набор в конце - это не то, что я хочу сделать.
Теперь происходит со мной, чтоЯ действительно не должен очищать HashSet вообще, не так ли?В любом случае объект ShaderProgram
собирается уничтожить, все, что мне нужно сделать, это очистить все неуправляемые ресурсы, а C # GC может очистить все остальное, верно?
public void Dispose()
{
foreach (var shader in _shaders)
GL.DetachShader(Handle, shader.Handle);
GL.DeleteProgram(Handle);
}
Тем не менее, я до сих порхочу ответы на оригинальный вопрос.Моя цель здесь состоит не в том, чтобы решить очень простую задачу, а в том, чтобы изучить наилучший подход к этому классу задач.