🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: alt.pl.comp.lang.csharp
11 messages
11 total messages Started by mk Wed, 17 Nov 2010 12:20
IDispose oraz interfejsy
#21838
Author: mk
Date: Wed, 17 Nov 2010 12:20
56 lines
2161 bytes
Witam,

Nie wiem jak rozwiązać następujący problem:

Mam kilka klas które implementują jakiś tam interfejs. Po stworzeniu 
obiektu którejś klasy odwołuję się do niego poprzez interfejs. Chciałbym 
aby te obiekty zwalniały pewne zasoby w momencie kiedy obiekt nie będzie 
już dłużej potrzebny ale niestety nie bardzo moge używać "using". Może 
najlepszy bedzie przyklad:


public interface AQQ: IDisposable
{
... //deklaracje metod
}

class A : AQQ
{
...//cialo klasy A
}

class B : AQQ
{
...//cialo klasy B
}

class Program
{
    static void Main(string[] args)
    {
     string type = KtoraKlaseAktywowac(); //Zwraca "A" albo "B"
     AQQ aqq;

     switch(type)
     {
        case "A":
         aqq = new A();
         break;
        case "B":
         aqq = new B();
         break;
     }

     //using(aqq) // Nie zalecane
     //{ ... }

     aqq.DoSomething();
     aqq.Dispose();
    }
}

Czy jest jakiś sposób żeby w powyższym przykladzie używać klauzuli 
"using"? Jak się powinno zwalniać zasoby w powyższym przypadku?\

Z góry dzięki za odpowiedzi
Mariusz
Re: IDispose oraz interfejsy
#21839
Author: Łukasz 'Maly' Ostrowski
Date: Wed, 17 Nov 2010 12:52
44 lines
1934 bytes
On Wed, 17 Nov 2010 13:20:43 +0100, mk wrote:
> class Program
> {
>     static void Main(string[] args)
>     {
>      string type = KtoraKlaseAktywowac(); //Zwraca "A" albo "B"
>      AQQ aqq;
> <snip>
>      aqq.DoSomething();
>      aqq.Dispose();
>     }
> }
> 
> Czy jest jakiś sposób żeby w powyższym przykladzie używać klauzuli 
> "using"? Jak się powinno zwalniać zasoby w powyższym przypadku?\

Jak się uprzeć, żeby ominąć samo "using" to:

AQQ aqq;
try
{
  aqq = new AQQ(); // lub new A/B czy cokolwiek ;-).
}
finally
{
  if (aqq != null)
    aqq.Dispose();
  // null
}

http://msdn.microsoft.com/en-us/library/yh598w02.aspx
[do takiej formy i tak zostałby using rozwinięty ;-)]

Niby rzeczywiście using() jest non-recommended w
takim przypadku, ale żeby być szczerym, przeciwwskazań
do zwykłego using nie widzę, tylko trzeba pamiętać żeby
po disposnięciu nie próbować korzystać z aqq, ew. 
po prostu ustawić aqq na null żeby mieć pewność że nie 
spróbujesz go użyć "dalej".


-- 
Pozdrawiam,
Łukasz 'Maly' Ostrowski.      http://l3v.eu/
Re: IDispose oraz interfejsy
#21840
Author: Jakub Owczarski
Date: Thu, 18 Nov 2010 12:10
55 lines
2374 bytes
On Nov 17, 12:20 pm, mk <m...@nospam.com> wrote:

> class Program
> {
>     static void Main(string[] args)
>     {
>      string type = KtoraKlaseAktywowac(); //Zwraca "A" albo "B"
>      AQQ aqq;
>
>      switch(type)
>      {
>         case "A":
>          aqq = new A();
>          break;
>         case "B":
>          aqq = new B();
>          break;
>      }
>
>      //using(aqq) // Nie zalecane
>      //{ ... }
>
>      aqq.DoSomething();
>      aqq.Dispose();
>     }
>
> }
>
> Czy jest jakiś sposób żeby w powyższym przykladzie używać klauzuli
> "using"? Jak się powinno zwalniać zasoby w powyższym przypadku?\

Może źle zrozumiałem problem, ale jeżeli chodzi tylko o to, że aqq
jest widoczne poza zasięgiem using, to możesz przecież zrobić takiego
zawijasa:

publc AQQ InstantiateAQQ()
{
     switch(KtoraKlaseAktywowac())
     {
        case "A":
         return new A();
        case "B":
         return new B();
     }
}

...

using(AQQ aqq = InstantiateAQQ())
{
    aqq.DoSomething();
}


pzdr
Re: IDispose oraz interfejsy
#21841
Author: 3P
Date: Thu, 18 Nov 2010 20:15
57 lines
2178 bytes
Dnia 17-11-2010 o 13:20:43 mk <mk@nospam.com> napisał(a):

> Witam,
>
> Nie wiem jak rozwiązać następujący problem:
>
> Mam kilka klas które implementują jakiś tam interfejs. Po stworzeniu  
> obiektu którejś klasy odwołuję się do niego poprzez interfejs. Chciałbym  
> aby te obiekty zwalniały pewne zasoby w momencie kiedy obiekt nie będzie  
> już dłużej potrzebny ale niestety nie bardzo moge używać "using". Może  
> najlepszy bedzie przyklad:
>
>
> public interface AQQ: IDisposable
> {
> ... //deklaracje metod
> }
>
> class A : AQQ
> {
> ...//cialo klasy A
> }
>
> class B : AQQ
> {
> ...//cialo klasy B
> }
>
> class Program
> {
>     static void Main(string[] args)
>     {
>      string type = KtoraKlaseAktywowac(); //Zwraca "A" albo "B"
>      AQQ aqq;
>
>      switch(type)
>      {
>         case "A":
>          aqq = new A();
>          break;
>         case "B":
>          aqq = new B();
>          break;
>      }
>
>      //using(aqq) // Nie zalecane
>      //{ ... }
>
>      aqq.DoSomething();
>      aqq.Dispose();
>     }
> }
>
> Czy jest jakiś sposób żeby w powyższym przykladzie używać klauzuli  
> "using"? Jak się powinno zwalniać zasoby w powyższym przypadku?\

Czegoś nie rozumiem. Czemu using powyżej jest nie zalecany?
Re: IDispose oraz interfejsy
#21842
Author: Jakub Owczarski
Date: Thu, 18 Nov 2010 23:01
29 lines
1916 bytes
On Nov 18, 8:15 pm, 3P <nos...@serwer.pl> wrote:

> >      switch(type)
> >      {
> >         case "A":
> >          aqq = new A();
> >          break;
> >         case "B":
> >          aqq = new B();
> >          break;
> >      }
>
> >      //using(aqq) // Nie zalecane
> >      //{ ... }
>
> >      aqq.DoSomething();
> >      aqq.Dispose();
> >     }
> > }
>
> > Czy jest jaki spos b eby w powy szym przykladzie u ywa klauzuli  
> > "using"? Jak si powinno zwalnia zasoby w powy szym przypadku?\
>
> Czego nie rozumiem. Czemu using powy ej jest nie zalecany?

No chyba właśnie dlatego, że jest dalej widoczny poza using. Używanie
disposniętego obiektu jest niefajne :)

pzdr.
Re: IDispose oraz interfejsy
#21843
Author: 3P
Date: Fri, 19 Nov 2010 19:44
43 lines
1891 bytes
Dnia 19-11-2010 o 00:01:27 Jakub Owczarski <jakub.owczarski@gmail.com>  
napisał(a):

> On Nov 18, 8:15 pm, 3P <nos...@serwer.pl> wrote:
>
>> >      switch(type)
>> >      {
>> >         case "A":
>> >          aqq = new A();
>> >          break;
>> >         case "B":
>> >          aqq = new B();
>> >          break;
>> >      }
>>
>> >      //using(aqq) // Nie zalecane
>> >      //{ ... }
>>
>> >      aqq.DoSomething();
>> >      aqq.Dispose();
>> >     }
>> > }
>>
>> > Czy jest jaki spos b eby w powy szym przykladzie u ywa klauzuli >  
>> "using"? Jak si powinno zwalnia zasoby w powy szym przypadku?\
>>
>> Czego nie rozumiem. Czemu using powy ej jest nie zalecany?
>
> No chyba właśnie dlatego, że jest dalej widoczny poza using. Używanie
> disposniętego obiektu jest niefajne :)
>
> pzdr.

No to przecież można napisać

using (aqq)
{
	aqq.DoSomething();
}


-- 
Używam klienta poczty Opera Mail: http://www.opera.com/mail/
Re: IDispose oraz interfejsy
#21844
Author: Popey
Date: Sat, 20 Nov 2010 12:46
53 lines
2695 bytes
Fri, 19 Nov 2010 20:44:23 +0100, na alt.pl.comp.lang.csharp, 3P napisał(a):

> Dnia 19-11-2010 o 00:01:27 Jakub Owczarski <jakub.owczarski@gmail.com>  
> napisał(a):
> 
>> On Nov 18, 8:15 pm, 3P <nos...@serwer.pl> wrote:
>>
>>> >      switch(type)
>>> >      {
>>> >         case "A":
>>> >          aqq = new A();
>>> >          break;
>>> >         case "B":
>>> >          aqq = new B();
>>> >          break;
>>> >      }
>>>
>>> >      //using(aqq) // Nie zalecane
>>> >      //{ ... }
>>>
>>> >      aqq.DoSomething();
>>> >      aqq.Dispose();
>>> >     }
>>> > }
>>>
>>> > Czy jest jaki spos b eby w powy szym przykladzie u ywa klauzuli >  
>>> "using"? Jak si powinno zwalnia zasoby w powy szym przypadku?\
>>>
>>> Czego nie rozumiem. Czemu using powy ej jest nie zalecany?
>>
>> No chyba właśnie dlatego, że jest dalej widoczny poza using. Używanie
>> disposniętego obiektu jest niefajne :)
>>
>> pzdr.
> 
> No to przecież można napisać
> 
> using (aqq)
> {
> 	aqq.DoSomething();
> }

A co będzie, jeżeli napiszesz za ostatnim nawiasem aqq.DoSomethingElse(); ?
Rozwiązaniem byłoby 
using(AQQ aqq = new AQQ())
{
}

Ale na drodze ku pełnemu szczęściu stoi ten piękny switch :) Choć jak znam
magików to zaraz się ktoś znajdzie z obejściem tego problemu.

-- 
gg #288252
Re: IDispose oraz interfejsy
#21845
Author: Robert Winkler
Date: Sat, 20 Nov 2010 14:59
34 lines
2056 bytes
> Ale na drodze ku pełnemu szczęściu stoi ten piękny switch :) Choć jak znam
> magików to zaraz się ktoś znajdzie z obejściem tego problemu.

Abrakadabra:

    class Program
    {
        static void Main(string[] args)
        {
            string type = KtoraKlaseAktywowac(); //Zwraca "A" albo "B"
            using (AQQ aqq = GetAQQPerType(type))
            {
                aqq.DoSomething();
            }
        }

        private static AQQ GetAQQPerType(string type)
        {
            switch (type)
            {
                case "A":
                    return new A();
                case "B":
                    return new B();
                default :
                    throw new InvalidOperationException("nieznany typ dla 
klasy AQQ");
            }
        }
    }

___
Pozdrawiam
Robert 
Re: IDispose oraz interfejsy
#21847
Author: 3P
Date: Sat, 20 Nov 2010 16:02
24 lines
1522 bytes
>>
>> No to przecież można napisać
>>
>> using (aqq)
>> {
>> 	aqq.DoSomething();
>> }
>
> A co będzie, jeżeli napiszesz za ostatnim nawiasem  
> aqq.DoSomethingElse(); ?

No to jak chcesz to robić to sam sobie jesteś winny, jak dostaniesz  
wyjątki. Tak się nie robi i tyle.
Nie rozumiem problemu.

> Rozwiązaniem byłoby
> using(AQQ aqq = new AQQ())
> {
> }
>
> Ale na drodze ku pełnemu szczęściu stoi ten piękny switch :) Choć jak  
> znam
> magików to zaraz się ktoś znajdzie z obejściem tego problemu.
Re: IDispose oraz interfejsy
#21848
Author: Jakub Owczarski
Date: Sat, 20 Nov 2010 18:13
12 lines
1768 bytes
On Nov 20, 4:02 pm, 3P <nos...@serwer.pl> wrote:

> No to jak chcesz to robi to sam sobie jeste winny, jak dostaniesz  
> wyj tki. Tak si nie robi i tyle.
> Nie rozumiem problemu.

Problem jest taki, że lepszy błąd kompilacji niz wyjątek w run time.
Jak obiekt nie jest widoczny poza using, to go nie użyjesz nawet jak
chcesz.
Jak jest widoczny to możesz go użyć niechcący :)

pzdr.
Re: IDispose oraz interfejsy
#21846
Author: Popey
Date: Sat, 20 Nov 2010 23:04
13 lines
1828 bytes
Sat, 20 Nov 2010 15:59:18 +0100, na alt.pl.comp.lang.csharp, Robert Winkler
napisał(a):

>> Ale na drodze ku pełnemu szczęściu stoi ten piękny switch :) Choć jak znam
>> magików to zaraz się ktoś znajdzie z obejściem tego problemu.
> 
> Abrakadabra:
> using (AQQ aqq = GetAQQPerType(type)

True. To nawet ja wiedziałem, tylko zapomniałem :)
Naprawdę wiedziałem. :)
-- 
gg #288252
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads