cast vs new?

WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 2 godziny
  • Postów:5143
0

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

Kopiuj
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?

edytowany 2x, ostatnio: WeiXiao
KL
  • Rejestracja:prawie 8 lat
  • Ostatnio:6 miesięcy
  • Postów:191
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.

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
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)


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:minuta
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.

edytowany 2x, ostatnio: Azarien

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.