Как правильный способ выпустить частично созданные объекты в фабричном методе?C#

Место общения программистов C#
Ответить
Anonymous
 Как правильный способ выпустить частично созданные объекты в фабричном методе?

Сообщение Anonymous »

У меня есть класс myclass , который требует экземпляров , b и c для создания для инициализации.
Все три класса наследуют Idisposable . У меня нет доступа к исходному коду , b и c , но их конструкторы могут добавить исключение для определенных комбинаций параметров.
Я знаю, что бросает исключение В конструкторе плохая практика, потому что он может оставить класс в непоследовательном состоянии в памяти (инвариантное нарушение). Таким образом, вместо использования прямого конструктора я использую заводский метод myclass.create () , который инициализирует , b и c внутри. Функция Create бросает исключение, если какая -либо из , b и c бросает исключение. Я знаю, что если я не смогу создать b , я должен хотя бы освободить и поднять исключение. Также я знаю, что если я не смогу создать класс C , я должен, по крайней мере, бесплатно, ранее создав и b , а затем поднять исключение в функции Create .
, пожалуйста, скажите мне, есть ли хороший пример образа или кода, как я могу очистить ранее инициализированные части на случай, когда я не могу создать класс myclass < /code>?
Что если там более трех частей? Я думаю об использовании стека стека для очистки деталей.
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);
}
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... ory-method
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»