А как такое же сделать в управляемом коде
От: RailRoadMan  
Дата: 27.01.06 11:05
Оценка:
Прочитал статью Александреску по поводу безопасной реализации транзакционного поведения
Все основано на RAII.

Возник вопрос, как тоже самое поведение может быть реализовано в управляемой среде (например С#), насколько я знаю в .Net нет деструкторов, есть что-то вроде IDispose (возможно я что-то путаю), но этого явно недостаточно.
Re: А как такое же сделать в управляемом коде
От: Максим Зелинский  
Дата: 27.01.06 11:14
Оценка:
Здравствуйте, RailRoadMan, Вы писали:

RRM>Возник вопрос, как тоже самое поведение может быть реализовано в управляемой среде (например С#), насколько я знаю в .Net нет деструкторов, есть что-то вроде IDispose (возможно я что-то путаю), но этого явно недостаточно.

Почему недостаточно? А конструкция using для кого?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re: А как такое же сделать в управляемом коде
От: GlebZ Россия  
Дата: 27.01.06 11:21
Оценка: 11 (1)
Здравствуйте, RailRoadMan, Вы писали:

RRM>Возник вопрос, как тоже самое поведение может быть реализовано в управляемой среде (например С#), насколько я знаю в .Net нет деструкторов, есть что-то вроде IDispose (возможно я что-то путаю), но этого явно недостаточно.

Вполне достаточно. Для этого есть using и finally.
И вообще, если говорить о транзакционности, то существует даже АPI для поддержки транзакцийздесь.
Re[2]: А как такое же сделать в управляемом коде
От: RailRoadMan  
Дата: 27.01.06 11:30
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, RailRoadMan, Вы писали:


RRM>>Возник вопрос, как тоже самое поведение может быть реализовано в управляемой среде (например С#), насколько я знаю в .Net нет деструкторов, есть что-то вроде IDispose (возможно я что-то путаю), но этого явно недостаточно.

GZ>Вполне достаточно. Для этого есть using и finally.

Я не специалист в С#, поэтому буду благодарен если ты приведешь пример кода, как это выглядит.
Re[3]: А как такое же сделать в управляемом коде
От: GlebZ Россия  
Дата: 27.01.06 11:35
Оценка:
Здравствуйте, RailRoadMan, Вы писали:


RRM>Я не специалист в С#, поэтому буду благодарен если ты приведешь пример кода, как это выглядит.



public class TransactionScope:IDisposable
{
//bla-bla
public void Dispose(){...}
//bla-bla

}

using (TransactionScope trans=new TransactionScope())
{
// bla-bla
}//при выходе за пределы (независимо exception или return) вызывается Dispose
Re[3]: А как такое же сделать в управляемом коде
От: Mika Soukhov Stock#
Дата: 27.01.06 11:48
Оценка:
Здравствуйте, RailRoadMan, Вы писали:

RRM>Я не специалист в С#, поэтому буду благодарен если ты приведешь пример кода, как это выглядит.


http://blogs.gotdotnet.ru/personal/tk/PermaLink.aspx?guid=c91e35df-03dd-4b3f-9801-a8b1062664e9
Re: А как такое же сделать в управляемом коде
От: Павел Кузнецов  
Дата: 27.01.06 13:42
Оценка:
RailRoadMan,

> Прочитал статью Александреску по поводу безопасной реализации транзакционного поведения

> Все основано на RAII.
>
> Возник вопрос, как тоже самое поведение может быть реализовано в управляемой среде (например С#)

См. C++/CLI -- там и деструкторы, и шаблоны есть.
Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: А как такое же сделать в управляемом коде
От: Воронков Василий Россия  
Дата: 27.01.06 16:20
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>См. C++/CLI -- там и деструкторы, и шаблоны есть.


Нету там деструктуров в ref классов Не надо на эту утку вестись
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: А как такое же сделать в управляемом коде
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.01.06 21:02
Оценка: +1
Здравствуйте, Воронков Василий, Вы писали:

ПК>>См. C++/CLI -- там и деструкторы, и шаблоны есть.


ВВ>Нету там деструктуров в ref классов Не надо на эту утку вестись


Там есть автодиспоз.
... << RSDN@Home 1.2.0 alpha rev. 629 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[4]: А как такое же сделать в управляемом коде
От: Воронков Василий Россия  
Дата: 27.01.06 21:12
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Там есть автодиспоз.


Ты уверен, что он авто? Я вот не вижу особо разницы между:

using (DisposableObject obj = new DisposableObject)
    //some code

и

DisposableObject^ obj = gcnew DisposableObject();
delete object;

и даже

Dim obj As DisposableObject

Try
    obj = New DisposableObject()
Finally
    If Not obj Is Nothing Then
        obj.Dispose()
    End If
End Try
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: А как такое же сделать в управляемом коде
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.01.06 21:27
Оценка: 5 (1)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ты уверен, что он авто? Я вот не вижу особо разницы между:


Курите 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>>
AVK Blog
Re[5]: А как такое же сделать в управляемом коде
От: Павел Кузнецов  
Дата: 28.01.06 19:50
Оценка: 2 (2) -3 :))
Воронков Василий,

> Ты уверен, что он авто? Я вот не вижу особо разницы между:

>
> using (DisposableObject obj = new DisposableObject)
>     //some code
>

> и
>
> DisposableObject^ obj = gcnew DisposableObject();
> delete object;
>


А так?
DisposableObject obj;


Пожалуй, для наглядности, даже так:
public ref class D              public class D : IDisposable
{                               {
public:                             public D()
     D()                             {
         : a(10)                         this.a = new A(10);
         , b(20)                         try
         , c(30)                         {
                                             this.b = new B(20);
     {                                       try
         . . .                               {
     }                                           this.c = new C(30);
                                                 try
private:                                        {
     A a;                                            . . .;
     B b;                                        }
     C c;                                        finally
     . . .                                       {
};                                                  this.c.Dispose();
                                                 }
                                             }
                                             finally
                                             {
                                                 this.b.Dispose();
                                             }
                                         }
                                         finally
                                         {
                                             this.a.Dispose();
                                         }
                                     }

                                     public sealed override void Dispose()
                                     {
                                         this.Dispose(true);
                                         GC.SuppressFinalize(this);
                                     }

                                     protected virtual void Dispose(bool dispose)
                                     {
                                         if (dispose)
                                         {
                                             try
                                             {
                                                 . . .;
                                             }
                                             finally
                                             {
                                                 try
                                                 {
                                                     this.c.Dispose();
                                                 }
                                                 finally
                                                 {
                                                     try
                                                     {
                                                         this.b.Dispose();
                                                     }
                                                     finally
                                                     {
                                                         this.a.Dispose();
                                                     }
                                                 }
                                             }
                                         }
                                     }

                                     private A a;
                                     private B b;
                                     private C c;
                                     . . .
                                 }
Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: А как такое же сделать в управляемом коде
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.01.06 21:45
Оценка: -1
Здравствуйте, Павел Кузнецов, Вы писали:

— за передергивание
... << RSDN@Home 1.2.0 alpha rev. 629 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[7]: А как такое же сделать в управляемом коде
От: Павел Кузнецов  
Дата: 29.01.06 04:11
Оценка: :)
AndrewVK,

> — за передергивание


А можно пояснить, в чем именно оно заключается?
Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: А как такое же сделать в управляемом коде
От: alexeiz  
Дата: 29.01.06 05:19
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

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();
}
Re[8]: А как такое же сделать в управляемом коде
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.01.06 07:58
Оценка: 27 (1) +1
Здравствуйте, Павел Кузнецов, Вы писали:

>> — за передергивание


ПК>А можно пояснить, в чем именно оно заключается?


1) Объявлять и грохать IDisposable в конструкторе приходится крайне редко (на вскидку ничего не вспомнил).
2) try..finally вместо using это вобще ни в какие ворота не лезет.
... << RSDN@Home 1.2.0 alpha rev. 629 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[9]: А как такое же сделать в управляемом коде
От: GlebZ Россия  
Дата: 29.01.06 13:58
Оценка: +1 -1
Здравствуйте, AndrewVK, Вы писали:

AVK>1) Объявлять и грохать IDisposable в конструкторе приходится крайне редко (на вскидку ничего не вспомнил).

+1.

AVK>2) try..finally вместо using это вобще ни в какие ворота не лезет.

-1
Однако VBэшников это никогда не останавливало.
Re[10]: А как такое же сделать в управляемом коде
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.01.06 14:43
Оценка: +1
Здравствуйте, 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>>
AVK Blog
Re[10]: А как такое же сделать в управляемом коде
От: TK Лес кывт.рф
Дата: 29.01.06 14:55
Оценка: 6 (1) +1
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 initialization
        throw new InvalidOperationException();
    }
}


В данном случае есть дефект — FileStream теряется до сборки мусора. Кандидатам предлагается переписать данный на using-ах
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[11]: А как такое же сделать в управляемом коде
От: GlebZ Россия  
Дата: 29.01.06 16:33
Оценка:
Здравствуйте, AndrewVK, Вы писали:

GZ>>Однако VBэшников это никогда не останавливало.

AVK>Во-первых речь о C#, а во-вторых в новом VB using присутствует.
Вообще-то о сях. А во вторых, еще с VB6 программисты не слезли, а ты уже о свежеиспеченном говоришь.
Вообще же using является синт. сахаром. Мало-того, try-finally с диспозом или подобным Close иногда необходимы. http://www.rsdn.ru/Forum/Message.aspx?mid=1403639&amp;only=1
Автор: VladD2
Дата: 27.09.05
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.