PDA

View Full Version : تفاوت , CType,DirectCast



hossein-khoshseyar
چهارشنبه 10 آذر 1389, 21:13 عصر
دوستان اگه ممکنه یکی توضیح بده که این دوتا چه فرقی با هم میکنن , ممنون میشم

Mani_rf
پنج شنبه 11 آذر 1389, 10:05 صبح
از Ctype زمانی استفاده میشه که بخواهیم انواع داده ها را به هم تبدیل کنیم. مثلا Double به Ineteger. البته تو VB این کار زمانی نیاز است که Option Strict در حالت On باشد.

اما Direct برای شما یک آبجکت را مستقیما به یک آبجک دیگه تبدیل میکنه و پروپرتی های اون را در اختیارتون قرار میده. مثلا :

شما آرایه ای از باتن ایجاد میکنید و کلیکی همه را به یک تابع ارجاع میدین.
حالا میخوای وقتی رو هر باتن کلیک شد رنگ اون قرمز بشه.


Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
DirectCast(sender, Button).BackColor = Color.Red
End Sub


تو این کد Sender گرفته میشه و به شی Button تبدیل میشه. حالا شما یک باتن داری که میتونی همه خواصش را تغییر بدی.

hossein-khoshseyar
پنج شنبه 11 آذر 1389, 10:42 صبح
از Ctype زمانی استفاده میشه که بخواهیم انواع داده ها را به هم تبدیل کنیم. مثلا Double به Ineteger. البته تو VB این کار زمانی نیاز است که Option Strict در حالت On باشد.

اما Direct برای شما یک آبجکت را مستقیما به یک آبجک دیگه تبدیل میکنه و پروپرتی های اون را در اختیارتون قرار میده. مثلا :

شما آرایه ای از باتن ایجاد میکنید و کلیکی همه را به یک تابع ارجاع میدین.
حالا میخوای وقتی رو هر باتن کلیک شد رنگ اون قرمز بشه.


Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
DirectCast(sender, Button).BackColor = Color.Red
End Sub


تو این کد Sender گرفته میشه و به شی Button تبدیل میشه. حالا شما یک باتن داری که میتونی همه خواصش را تغییر بدی.


سلام
ممنون از پاسختون
حرف شما درسته اما این کار رو با ctype هم میشه انجام داد یعنی دستور زیر هم بدون اینکه براش مشکلی پیش بیاد کار می کنه


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button3.Click, Button2.Click
CType(sender, Button).BackColor = Color.Beige
End Sub


این مگه مشکلی داره؟

Felony
پنج شنبه 11 آذر 1389, 12:41 عصر
از Ctype زمانی استفاده میشه که بخواهیم انواع داده ها را به هم تبدیل کنیم. مثلا Double به Ineteger. البته تو VB این کار زمانی نیاز است که Option Strict در حالت On باشد.

اما Direct برای شما یک آبجکت را مستقیما به یک آبجک دیگه تبدیل میکنه و پروپرتی های اون را در اختیارتون قرار میده. مثلا :

شما آرایه ای از باتن ایجاد میکنید و کلیکی همه را به یک تابع ارجاع میدین.
حالا میخوای وقتی رو هر باتن کلیک شد رنگ اون قرمز بشه.


Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
DirectCast(sender, Button).BackColor = Color.Red
End Sub


تو این کد Sender گرفته میشه و به شی Button تبدیل میشه. حالا شما یک باتن داری که میتونی همه خواصش را تغییر بدی.

خیر DirectCast و CType هر دو شئ مورد نظر رو Type Cast میکنن ، تفاوت در اونی که شما گفتی نیست ، تفاوت در این هست که DirectCast امن هست ولی CType نه .

از DirectCast زمانی استفاده میشه که ما از نوع شئ ارسالی مطمئن باشیم ، مثلا تو همون کد بالا وقتی ما مطمئن باشیم که شئ Sender یک Button هست از DirectCast استفاده میکنیم ، ولی گاهی مواقع پیش میاد که ما از یکسان بودن نوع شئ ارسالی اطمینان نداریم مثلا امکان داره کد بالا که نوشتید به رویداد کلیک یک ListBox هم اختصاص داده شده باشه و وقتی ListBox اون رو صدا بزنه شئ Sender دیگه از نوع Button نیست بلکه ListBox هست ، در این صورت از CType استفاده میکنیم ، با استفاده از DirectCast شما به کامپایلر اطمینان میدی که شئ ارسالی یک Button یا ... هست و کامپایلر خودش رو درگیر جزئیات نمیکنه و به همین دلیل سرعت و کارایی DirectCast بیشتر هست و مستقیما عملیات TypeCasting رو انجام میده ولی اگر از DirectCast استفاده کنیم و شئ ارسالی اونی نباشه که کامپایلر انتظارش رو داره معلوم نیست چی بلایی سر برنامتون بیاد ... !

وقتی از CType استفاده میکنید به کامپایلر میگید من انتظار دارم شیئی که ارسال میشه مثلا از نوع Button باشه ولی مطمئن نیستم ، کامپایلر وقتی شئ رو گرفت و خواست عملیات TypeCasting رو روش انجام بده درخت ثوارث رو بررسی میکنه ببینه شیئی که ارسال شده همون هست که شما انتظارش رو داشتید یا نه ، اگر بود که عملیات رو انجام میده در غیر این صورت یه Exception تولید میکنه که میتونید اون Exception رو مدیریت کنید تا برنامتون با مشکل خاصی مواجه نشه ، به دلیل بررسی درخت ثوارث توسط CType هم هست که سرعت و کاراییش پائین تر از DirectCast هست .

البته این Performance در کدهای ساده خودش رو نشون نمیده ، با روش هایی میشه یه DirectCast امن هم پیاده کرد ، قبل از اینکه شئ رو TypeCast کنید با is چک کنید اگر شئ ارسالی از نوع شئ مورد نظرتون بود بعد اون رو TypeCast کنید ، اگر این کار رو انجام بدید نه از CType که Performance کمتری داره استفاده کردید و نه تبدیل نا امنی انجام دادید ، در حقیقت DirectCast نا امن رو به DirectCast امن تبدیل کردید :


if sender is Button then
DirectCast(sender, Button).BackColor = Color.Red;

Mani_rf
پنج شنبه 11 آذر 1389, 13:38 عصر
خیلی جالب و مفید بود.
من اطلاعاتم در این زمینه کم بود؛ ممنونم از توضیحاتتون.
این جمله "از Ctype زمانی استفاده میشه که بخواهیم انواع داده ها را به هم تبدیل کنیم" در پاسخ اول را من از تو MSDN استخراج کردم و گفتم.

فقط از TryCast هم برای Cast کردن استفاده می شود؛ لطفا اگر اطلاعاتی درباره این هم دارید بفرمایید.

Felony
پنج شنبه 11 آذر 1389, 14:28 عصر
فقط از TryCast هم برای Cast کردن استفاده می شود؛ لطفا اگر اطلاعاتی درباره این هم دارید بفرمایید.
TryCast سعی میکنه یک شئ رو به نوع مورد نظر شما TypeCast کنه ، اگر مشکلی در این حین به وجود اومد ( شئ ارسالی با شئ مورد نظر یکسان نبود ) اون وقت TryCast مقدار Null بر میگردونه و شما به وسیله اون میتونید روند این خطا رو کنترل کنید ولی وقتی از DirectCast استفاده کنید و نوع ارسالی با نوع مورد نظر یکی نباشه Exception رخ میده ، با استفاده از TryCast انگار شما به وسیله Try Cache دارید Exception برنامتون رو کنترل میکنید ولی کدنویسی کمتر و ساده تر میشه .

hossein-khoshseyar
پنج شنبه 11 آذر 1389, 14:37 عصر
فقط از TryCast هم برای Cast کردن استفاده می شود؛ لطفا اگر اطلاعاتی درباره این هم دارید بفرمایید.TryCast سعی میکنه یک شئ رو به نوع مورد نظر شما TypeCast کنه ، اگر مشکلی در این حین به وجود اومد ( شئ ارسالی با شئ مورد نظر یکسان نبود ) اون وقت TryCast مقدار Null بر میگردونه و شما به وسیله اون میتونید روند این خطا رو کنترل کنید ولی وقتی از DirectCast استفاده کنید و نوع ارسالی با نوع مورد نظر یکی نباشه Exception رخ میده ، با استفاده از TryCast انگار شما به وسیله Try Cache دارید Exception برنامتون رو کنترل میکنید ولی کدنویسی کمتر و ساده تر میشه .

ممنون از پاسخ های کاملتون
اگه ممکنه پاسخ این سئوال رو هم بدید که بی ارتباط با این تاپیک هم نیست


این سه خط همه خروجیشون یه چیز هست



ctype(x,double)
convert.todouble(x)
cdbl(x)
z




می خوام بدونم اینا چه فرقی با هم دارن (از لحاظ سرعت و...)
ممنون