دوشنبه، فروردین ۲۷، ۱۳۸۶

is و as در C#

۱.
is یک عملگر است که بررسی می‌کند آیا یک متغیر شیءای از یک کلاس هست یا نه. چیزی شبیه به instanceof در جاوا. همان‌طور که از توصیف بر می‌آید این عملگر یک مقدار boolean برمی‌گرداند.

 

۲.
is کل درخت ارث‌بری را بررسی می‌کند. مثلا:

C#
aTextBoxObj is System.Windows.Control == true

 

۳.
در مورد استفاده از
generic ها هم حتما باید آرگومان مربوط به نوع کلاس generic ذکر بشود. مثلا:

C#
class MyClass<T> {}
...
MyClass<int> obj1 = new MyClass<int>();
MyClass<string> obj2 = new MyClass<string>();
...
obj1 is MyClass  // Syntax Error
obj1 is MyClass<int> == true
obj1 is MyClass<string> == false

 

۴.
as یک عملگر است که به شکلی تبدیل نوع در زمان اجرا را انجام می‌دهد. اگر تبدیل نوع قابل انجام باشد شیء تبدیل شده را برمی‌گرداند و در غیر این صورت مقدار null را. as در C# بسیار شبیه است به dynamic_cast در C++.

 

۵.
مزیت
as نسبت به type cast با پرانتز، این است که در آن اگر تبدیل نوع قابل انجام نباشد، دیگر Exception پرتاب نمی‌شود.

 

۶.
کاربرد
as به شکل زیر است:

C#
object someObject;
...
stirng str = someObject as string; 

if (str != null)
{
    // means someObject is a string
}

 

۷.
as را می‌توان به صورت معادل زیر نوشت:

C#
expression is type ? (type)expression : (type)null

 

5 نظر:

ناشناس :

مورد آخر رو خوب اومدی

ناشناس :

اين سوال پيش مياد كه فرق بين دونوع روش كد نويسي زير چيه؟
1-
x = y as foo;
if (x != null)
{
}
else
{
}

2-
try
{
x = (foo)y;
}
catch (InvalidCastException)
{
}

بگذريم از اينكه as فقط براي
reference types
كاربرد داره.

سینا ایروانیان :

فرق اولی اینه که از Exception فرار می‌کنه و کد قابلیت trace بیش‌تری داره. حالا چرا باید از Exception فرار کرد؟ چون Exception throwing and handling زمان بره (زمان بر در مقیاس عملیات ماشین). این کار عواقبی مثل stack unwinding و چیزهای دیگه داره. اما با همه این تفاسیر یه بحث سلیقه‌ایه...

ناشناس :

درست ميگي، تا حدود خيلي زيادي به سليقه بستگي داره.
اما يه نكته ريز وجود داره، درصورتيكه از as استفاده كنيم و فراموش كنيم كه مقدار بازگشتي رو چك كنيم،
ممكنه خطاي برنامه در نقطه ديگه اي خودش رو نشون بده، اما با explicit cast پيداكردن خطا سريعتره.
(بااينحال سليقه من همون as رو ترجيح ميده!)

سینا ایروانیان :

به نکته خوبی اشاره کردی. کلا از بین روش‌های مختلف برای انجام کاری، اون روشی که سریع‌تر و تابلوتر اشتباهی رو نشون می‌ده، قابل اعتمادتره و کمتر به خطاهای ناآشکار در آینده منجر می‌شه. ممنون مهرداد جان.

ارسال یک نظر

جهت نمایش صحیح آدرس سایتتان، حتما قبل از آدرس //:http را درج کنید.