Thread View: alt.pl.comp.lang.csharp
11 messages
11 total messages
Started by mk
Wed, 17 Nov 2010 12:20
IDispose oraz interfejsy
Author: mk
Date: Wed, 17 Nov 2010 12:20
Date: Wed, 17 Nov 2010 12:20
56 lines
2161 bytes
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
Author: Łukasz 'Maly' Ostrowski
Date: Wed, 17 Nov 2010 12:52
Date: Wed, 17 Nov 2010 12:52
44 lines
1934 bytes
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
Author: Jakub Owczarski
Date: Thu, 18 Nov 2010 12:10
Date: Thu, 18 Nov 2010 12:10
55 lines
2374 bytes
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
Author: 3P
Date: Thu, 18 Nov 2010 20:15
Date: Thu, 18 Nov 2010 20:15
57 lines
2178 bytes
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
Author: Jakub Owczarski
Date: Thu, 18 Nov 2010 23:01
Date: Thu, 18 Nov 2010 23:01
29 lines
1916 bytes
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
Author: 3P
Date: Fri, 19 Nov 2010 19:44
Date: Fri, 19 Nov 2010 19:44
43 lines
1891 bytes
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
Author: Popey
Date: Sat, 20 Nov 2010 12:46
Date: Sat, 20 Nov 2010 12:46
53 lines
2695 bytes
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
Author: Robert Winkler
Date: Sat, 20 Nov 2010 14:59
Date: Sat, 20 Nov 2010 14:59
34 lines
2056 bytes
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
Author: 3P
Date: Sat, 20 Nov 2010 16:02
Date: Sat, 20 Nov 2010 16:02
24 lines
1522 bytes
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
Author: Jakub Owczarski
Date: Sat, 20 Nov 2010 18:13
Date: Sat, 20 Nov 2010 18:13
12 lines
1768 bytes
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
Author: Popey
Date: Sat, 20 Nov 2010 23:04
Date: Sat, 20 Nov 2010 23:04
13 lines
1828 bytes
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