我有一个需要MyClass
实例化A
和初始化的类。所有三个类都继承了。我无法访问这些类的源代码,但是它们的构造函数可能会因某些参数组合而引发异常。我知道在构造函数中抛出异常是一种不好的做法,因为它可能会导致类在内存中处于不一致的状态(不变违反)。因此,我没有使用直接构造函数,而是使用在内部进行初始化的工厂方法,并且。如果至少有一个类,并且已引发异常,则该函数也会引发异常。我知道如果我无法创建,那么我至少应该释放该类并引发异常。我还知道,如果我无法创建该类,我至少应该释放先前创建的和,然后在中引发异常。B
C
IDisposable
A
B
C
MyClass.Create()
A
B
C
Create
A
B
C
B
A
C
A
B
Create
请告诉我是否有一个好的模式或代码示例,如果我无法构建类,我该如何清除以前初始化的部分MyClass
?
如果有多于三个部分怎么办?我正在考虑使用堆栈Stack<IDisposable>
来清理各个部分。
应
@user7860670 的要求添加一个最低限度可重现的示例。看来这段文字太难理解了:
class A: IDisposable
{
private readonly int p_value;
public A(int value)
{
ArgumentOutOfRangeException.ThrowIfNegative(value);
p_value = value;
}
public void Print()
{
Console.WriteLine($"Value is: {p_value}");
}
public void Dispose()
{
Console.WriteLine("A disposed");
}
}
class B : IDisposable
{
private readonly int p_value;
public B(int value)
{
ArgumentOutOfRangeException.ThrowIfLessThan(value, 10);
p_value = value;
}
public void Print()
{
Console.WriteLine($"Value is: {p_value}");
}
public void Dispose()
{
Console.WriteLine("B disposed");
}
}
class C : IDisposable
{
private readonly int p_value;
public C(int value)
{
ArgumentOutOfRangeException.ThrowIfLessThan(value, 20);
p_value = value;
}
public void Print()
{
Console.WriteLine($"Value is: {p_value}");
}
public void Dispose()
{
Console.WriteLine("C disposed");
}
}
class MyClass
{
private readonly A a;
private readonly B b;
private readonly C c;
protected MyClass(A _a, B _b, C _c) { a = _a; b = _b; c = _c;}
public MyClass Create(int _value)
{
// Maybe throw error
A a = new A(_value);
// Maybe throw error
// Need free A
B b = new B(_value);
// Maybe throw error
// Need free A
// Need free B
C c = new C(_value);
return new (a, b, c);
}
}