تبلیغات
آکنده
آکنده ،،،،
در اندیشه پرواز هم نباش، پرنده هم مردنی است

[توسعه نرم‏افزار , ]

چند تا نکته کوچک در مورد performance :

قبل از cast کردن از is استفاده نکنید.

احتمالاً گاهی اوقات برای cast یک شی به یک نوع دیگر از is استفاده کرده باشید و بعد از اینکه مطمئن شدید که قابل cast است شی را cast کرده باشید.

مثال فرض کنید یک شی به نام myObject دارید و میخواهید در صورتی که از نوع AClass باشد با آن کار کنید، معمولاً چنین مینویسیم:

if ( myObject is AClass)

{

    AClass aObject = (AClass)myObject;

    // using aObject

}

اما روشی که توصیه میشود اینگونه است:

AClass aObject = myObject as AClass;

if ( aObject != null )

{

   // using aObject

}

مزیت روش دوم در اینست که فقط یکبار شی cast میشود، اما در اولی عملگر is نیز به طور ضمنی(ناآشکار) عمل cast را انجام میدهد، یعنی در تکه کد اولی دوبار عمل cast صورت میگیرد.

البته همانطور که میدانید عمل cast در performance تاثیر منفی میگذارد، پس بطور کلی باید از اضافه cast کردن یک شی صرف نظر کرد. برای مثال بعضیها به جای تعریف یک متغییر جدید برای نسخه cast شده شی، هر بار که نیاز به شی دارند آن را مجدداً cast میکنند:

غلط:

((RequiredType)object).Method1();

((RequiredType)object).Method2();

((RequiredType)object).Method3();

درست:

RequiredType objectAsRequiredType = objectAsRequiredType;

objectAsRequiredType.Method1();

objectAsRequiredType.Method2();

objectAsRequiredType.Method3();

در تکه کد غلط شی چندین بار cast شده است، اما در تکه کد درست، فقط یکبار cast شده است.

همچنین یک اشتباه متداول دیگر:

غلط:

for(int i=0;i<sourceDataList.Count;i++)

{

    ((RequiredType)object).DoJob(sourceDataList[i]);

}

درست:

RequiredType objectAsRequiredType = objectAsRequiredType;

for(int i=0;i<sourceDataList.Count;i++)

{

    objectAsRequiredType.DoJob(sourceDataList[i]);

}

در تکه کد غلط در هر بار اجرای حلقه شی شما cast میشود ولی در تکه کد درست cast کردن شی قبل از ورود به حلقه انجام میشود.

در مورد عملگر as نیز گفتنی است که برای cast کردن بکار میرود منتها با عملگر () این فرق را میکند که در صورتی که شی شما قابل cast نباشد مقدار null را برمیگرداند، اما عملگر () در صورتی که شی شما قابل cast نباشد و بخواهید با آن شی را cast کنید exception در میکند. همچنین as در صورتی که متغییر شما حاوی شی ای نباشد(مقدارش null باشد) باز هم خروجی null است.

 

برای ساختن متن از + استفاده نکنید، StringBuilder اکیداً توصیه میشود.

اگر دو متن را با + به هم متصل کنید در مقایسه با اینکه از StringBuilder استفاده کنید و همچنین عملیات با متن در برنامه شما متدوال باشد، به شدت سرعت برنامه پائین خواهد آمد. برای مثال اگر یک عملیات ساخت متن با StringBuilder به طور مثال 4 ثانیه طول بکشد معادل آن با استفاده از + و String.Concat چندین روز طول خواهد کشید.

 

در مورد اشیا IDisposable حتماً از using استفاده کنید. یک نکته مهم که در مورد using وجود دارد اینست که using یک بلاک try/catch به کد اضافه میکند و حتی در صورتی که در بلاک using شما یک exception رخ دهد، باز هم شی شما Dispose خواهد شد. اما اگر اصرار دارید که متود Dispose را خودتان مستقیم صدا کنید حتماً صدا زدن متود Dispose را در قسمت finally یک بلاک try/catch/finally قرار دهید تا حتماً صدا زده شود.

تاریخ فرستادن:شنبه 29 بهمن 1384، نویسنده: فرشید کزازی (همیشه همینه)
تعداد بازخوردها: ، شما هم دیدگاه خود را ارائه کنید

 

درباره فرشیدکزازی

 
 

هیچ چیز قابل گفتنی درباره خودم وجود نداره.
کاری داشتید به farshidkazazi@gmail.com پیام بفرستید.

 

 

درباره آکنده

 
 

این وبنوشت دربردارنده دیدگاهها و گفتنیها و نوشتینهای من است و من هرچی که دلم بخواهد میام و اینجا مینویسم و چون فعلاً نرم افزار کار میکنم، زمینه تخصصی آن بیشتر به آن گرایش دارد.

** اسم وبنوشت هیچ معنای خاصی ندارد، اولین کلمه ای بود که موقع ثبت نام به ذهنم رسید.

دسته بندی نگاره ها:
عمومی (7)
توسعه نرم‏افزار (13)

 

 

وبنوشتهای دیگر

 
  زیر چتر باران
واژگان مدیریت دانش
 

 

ابزارها

 
 
جستجو در بلاگ


برای دریافت نگاره ها از طریق email با وارد کردن آدرس email نام‏ نویسی کنید:
بایگانی گذشته
مرداد 1385 (2)
تیر 1385 (3)
اردیبهشت 1385 (1)
بهمن 1384 (4)
آذر 1384 (1)
آبان 1384 (4)
مهر 1384 (5)