Прочитал статью Александреску по поводу безопасной реализации транзакционного поведения
Все основано на RAII.
Возник вопрос, как тоже самое поведение может быть реализовано в управляемой среде (например С#), насколько я знаю в .Net нет деструкторов, есть что-то вроде IDispose (возможно я что-то путаю), но этого явно недостаточно.
Здравствуйте, RailRoadMan, Вы писали:
RRM>Возник вопрос, как тоже самое поведение может быть реализовано в управляемой среде (например С#), насколько я знаю в .Net нет деструкторов, есть что-то вроде IDispose (возможно я что-то путаю), но этого явно недостаточно.
Почему недостаточно? А конструкция using для кого?
Здравствуйте, RailRoadMan, Вы писали:
RRM>Возник вопрос, как тоже самое поведение может быть реализовано в управляемой среде (например С#), насколько я знаю в .Net нет деструкторов, есть что-то вроде IDispose (возможно я что-то путаю), но этого явно недостаточно.
Вполне достаточно. Для этого есть using и finally.
И вообще, если говорить о транзакционности, то существует даже АPI для поддержки транзакцийздесь.
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, RailRoadMan, Вы писали:
RRM>>Возник вопрос, как тоже самое поведение может быть реализовано в управляемой среде (например С#), насколько я знаю в .Net нет деструкторов, есть что-то вроде IDispose (возможно я что-то путаю), но этого явно недостаточно. GZ>Вполне достаточно. Для этого есть using и finally.
Я не специалист в С#, поэтому буду благодарен если ты приведешь пример кода, как это выглядит.
RRM>Я не специалист в С#, поэтому буду благодарен если ты приведешь пример кода, как это выглядит.
public class TransactionScope:IDisposable
{
//bla-blapublic void Dispose(){...}
//bla-bla
}
using (TransactionScope trans=new TransactionScope())
{
// bla-bla
}//при выходе за пределы (независимо exception или return) вызывается Dispose
RailRoadMan,
> Прочитал статью Александреску по поводу безопасной реализации транзакционного поведения > Все основано на RAII. > > Возник вопрос, как тоже самое поведение может быть реализовано в управляемой среде (например С#)
См. C++/CLI -- там и деструкторы, и шаблоны есть.
Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Воронков Василий, Вы писали:
ПК>>См. C++/CLI -- там и деструкторы, и шаблоны есть.
ВВ>Нету там деструктуров в ref классов Не надо на эту утку вестись
Там есть автодиспоз.
... << RSDN@Home 1.2.0 alpha rev. 629 on Windows XP 5.1.2600.131072>>
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Ты уверен, что он авто? Я вот не вижу особо разницы между:
Курите FM.
C# implementation of a disposable class hierarchy
class R1 : IDisposable
{
public void Dispose() { }
public void F() { }
}
class R2 : IDisposable
{
public void Dispose() { }
public void F() { }
}
class R : IDisposable
{
R1 m_r1 = new R1();
R2 m_r2 = new R2();
public void Dispose()
{
m_r1.Dispose();
m_r2.Dispose();
}
public void F()
{
m_r1.F();
m_r2.F();
}
public static void CallR()
{
using(R r = new R())
{
r.F();
}
}
}
Okay — straightaway we notice a few things — the IDisposable interface has to be manually implemented for each disposable class, and for class R which has R1 and R2 members, the Dispose method needs to invoke Dispose on the member classes too. Now let's see the C++ implementation of the above set of classes. The equivalent C++ implementation
ref class R1
{
public:
~R1(){}
void F(){}
};
ref class R2
{
public:
~R2(){}
void F(){}
};
ref class R
{
R1 m_r1;
R2 m_r2;
public:
~R(){}
void F()
{
m_r1.F();
m_r2.F();
}
static void CallR()
{
R r;
r.F();
}
}
... << RSDN@Home 1.2.0 alpha rev. 629 on Windows XP 5.1.2600.131072>>
Offtopic, но может ты знаешь. Зачем ref классы имеют copy-constructors? Поясню примером:
ref class A
{
// uncomment to compile
// A(A const ^) {}
~A() {} // free resource
};
A ^ create_resource()
{
return gcnew A(); // error - no copy-constructor
}
int main()
{
A a = create_resource();
}
Здравствуйте, Павел Кузнецов, Вы писали:
>> — за передергивание
ПК>А можно пояснить, в чем именно оно заключается?
1) Объявлять и грохать IDisposable в конструкторе приходится крайне редко (на вскидку ничего не вспомнил).
2) try..finally вместо using это вобще ни в какие ворота не лезет.
... << RSDN@Home 1.2.0 alpha rev. 629 on Windows XP 5.1.2600.131072>>
Здравствуйте, AndrewVK, Вы писали:
AVK>1) Объявлять и грохать IDisposable в конструкторе приходится крайне редко (на вскидку ничего не вспомнил).
+1.
AVK>2) try..finally вместо using это вобще ни в какие ворота не лезет.
-1
Однако VBэшников это никогда не останавливало.
Здравствуйте, GlebZ, Вы писали:
AVK>>2) try..finally вместо using это вобще ни в какие ворота не лезет. GZ>-1 GZ>Однако VBэшников это никогда не останавливало.
Во-первых речь о C#, а во-вторых в новом VB using присутствует.
... << RSDN@Home 1.2.0 alpha rev. 629 on Windows XP 5.1.2600.131072>>
Hello, "GlebZ" > > AVK>1) Объявлять и грохать IDisposable в конструкторе приходится крайне редко (на вскидку ничего не вспомнил). > +1. >
Вы как маленькие Ситуация элементарная. Есть объект в которым содержится несколько IDisposable ресурсов. В конструкторе объекта эти ресурсы инициализируются, а потом вылетает Exception. А дальше вопрос, какой using будет делать Dispose данных объектов?
Для простоты простейший пример кода на C#:
public class DisposableObject
{
private FileStream _fileStream;
public DisposableObject(string filePath)
{
_fileStream = new FileStream(filePath);
// do additional initializationthrow new InvalidOperationException();
}
}
В данном случае есть дефект — FileStream теряется до сборки мусора. Кандидатам предлагается переписать данный на using-ах
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, AndrewVK, Вы писали:
GZ>>Однако VBэшников это никогда не останавливало. AVK>Во-первых речь о C#, а во-вторых в новом VB using присутствует.
Вообще-то о сях. А во вторых, еще с VB6 программисты не слезли, а ты уже о свежеиспеченном говоришь.
Вообще же using является синт. сахаром. Мало-того, try-finally с диспозом или подобным Close иногда необходимы. http://www.rsdn.ru/Forum/Message.aspx?mid=1403639&only=1