cast vs new?

0

Cześć, jaka jest różnica między tymi "sposobami" na przekonwertowanie?

Bitmap test = Input.Image; ///  cannot convert from 'System.Drawing.Image' to 'System.Drawing.Bitmap'	

Bitmap test= new Bitmap(Input.Image); /// ok

Bitmap test= (Bitmap) Input.Image; /// ok

Czym się różnią dwa ostatnie zapisy i dlaczego niby cast (Bitmap) jest tutaj niekoniecznie poprawne?

0

Różnią się tym, że w pierwszym przypadku tworzysz celowo nową bitmapę, podając jej przy tym image, z którego ma zostać wygenerowana, a w drugim robisz chamskiego casta.
Różnica efektywna jest taka, że pierwszy sposób gwarantuje utworzenie poprawnej mapy bitowej z podanego obrazu, a drugi sposób ma potencjał na spapranie się czegoś, bo omijasz w ten sposób mechanizmy konwersji i kontroli jej poprawności.

Żeby powiedzieć coś dokładniej musiałbym zajrzeć do implementacji Bitmap, żeby widzieć co dokładnie się tam dzieje, ale jw. zamyka się to w zestandaryzowanym, spójnym sposobie konwersji.

2

co więcej w pierwszym przypadku test to NOWY obiekt a w drugim test to "wskaźnik" na Input.Image. Czyli najważniejsza i zasadnicza różnica jest, że new tworzy nową instancję danej klasy a rzutowanie nie (w wyniku rzutowania dostajesz wskaźnik "nowego" typu na ISTNIEJĄCĄ instancje obiektu "starego" typu)

2
Klojtex napisał(a):

Różnią się tym, że w pierwszym przypadku tworzysz celowo nową bitmapę, podając jej przy tym image, z którego ma zostać wygenerowana, a w drugim robisz chamskiego casta.

Casty w C# nie są „chamskie”. Teoretycznie nie zadziałać może tylko z tego powodu, że Bitmap dziedziczy po Image, więc teoretycznie ten Image niekoniecznie jest typu Bitmap.
Tylko teoretycznie, bo w praktyce nie spotyka się obiektów typu Image które nie byłyby jednocześnie typu Bitmap (a gdyby się spotkało, to nasz kod miałby dużą szansę wywalić się z innego powodu).

Różnica między new a downcastem jest przede wszystkim taka, że w pierwszym przypadku tworzysz nową bitmapę, co trwa i zajmuje dodatkową pamięć, bo obrazek musi być skopiowany. W drugim masz tylko skopiowanie referencji.

Pytanie więc, czy potrzebujesz kopii obrazka, czy wystarczy ci tylko pozbycie się problemu niezgodności typu Image a Bitmap.

1 użytkowników online, w tym zalogowanych: 0, gości: 1