У меня есть класс 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
Как правильный способ выпустить частично созданные объекты в фабричном методе? ⇐ C#
Место общения программистов C#
1739714748
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);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79443271/what-is-the-correct-way-to-release-partially-created-objects-in-a-factory-method[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия