در این مقاله به 10 اشتباه مهلک در C# که حتی برنامه‌نویسان حرفه‌ای نیز ممکن است مرتکب شوند، اشاره و هر یک را به اختصار توضیح می‌دهم.
کینگتو - آموزش برنامه نویسی تخصصصی - دات نت - سی شارپ - بانک اطلاعاتی و امنیت

10 اشتباه مهلک برنامه نویسان در #C

3 بازدید 0 نظر ۱۴۰۴/۰۵/۲۱

1. عدم استفاده صحیح از using برای منابع یکبار مصرف

بسیاری از توسعه‌دهندگان فراموش می‌کنند که از using statement برای اشیائی که منابع سیستمی مانند فایل‌ها، اتصالات دیتابیس یا سوکت‌ها را در اختیار دارند، استفاده کنند. این اشیاء باید به درستی و به موقع دور ریخته شوند (Disposed) تا منابع آزاد شوند. استفاده از using تضمین می‌کند که حتی در صورت بروز خطا، متد Dispose فراخوانی خواهد شد و از نشت منابع جلوگیری می‌شود.

public void WriteToFileBad(string filePath, string content)
{
    // این کد به درستی منابع را آزاد نمی‌کند،
    // به خصوص اگر خطایی در حین نوشتن فایل رخ دهد.
    StreamWriter writer = new StreamWriter(filePath);
    writer.Write(content);
    writer.Close(); // ممکن است این خط اجرا نشود
}

کد صحیح:

public void WriteToFileGood(string filePath, string content)
{
    // استفاده از using تضمین می‌کند که متد Dispose() فراخوانی می‌شود
    // حتی در صورت بروز خطا.
    using (StreamWriter writer = new StreamWriter(filePath))
    {
        writer.Write(content);
    } // اینجا Dispose() به صورت خودکار فراخوانی می‌شود
}

 

2. استفاده از کلاس‌های قابل تغییر به جای کلاس‌های غیر قابل تغییر

کلاس‌های قابل تغییر (Mutable) می‌توانند باعث مشکلات بزرگی در برنامه‌های چندنخی (Multithreaded) و همچنین در برنامه‌هایی که نیاز به امنیت بالا دارند، شوند. با استفاده از کلاس‌های غیر قابل تغییر (Immutable)، که پس از ایجاد دیگر قابل تغییر نیستند، می‌توان از بسیاری از این مشکلات جلوگیری کرد. برای مثال، به جای تغییر یک رشته، باید یک رشته جدید ایجاد کرد.

 

3. عدم درک درست از تفاوت struct و class

توسعه‌دهندگان گاهی اوقات بدون در نظر گرفتن تفاوت‌های کلیدی، از struct یا class استفاده می‌کنند. struct یک نوع مقداری (Value Type) و class یک نوع ارجاعی (Reference Type) است. استفاده نادرست از struct برای اشیاء بزرگ می‌تواند به کپی‌های غیرضروری و کاهش عملکرد منجر شود، در حالی که استفاده از class برای اشیاء کوچک ممکن است سربار (overhead) اضافی ایجاد کند.

 

4. نادیده گرفتن مدیریت استثناها (Exceptions)

برخی برنامه‌نویسان استثنائات را به درستی مدیریت نمی‌کنند و از بلاک‌های try-catch بدون دلیل کافی استفاده می‌کنند یا استثناها را نادیده می‌گیرند. این کار می‌تواند منجر به پنهان ماندن خطاها و مشکلات غیرمنتظره در برنامه شود. مدیریت صحیح استثناها به معنای گرفتن استثنای مشخص و رسیدگی به آن به شیوه‌ای معقول است.

 

5. عدم استفاده از async و await به صورت صحیح

async و await برای برنامه‌نویسی ناهمزمان (Asynchronous) بسیار قدرتمند هستند. اما استفاده نادرست از آن‌ها، مانند استفاده از .Result یا .Wait() برای بلوک کردن threadها، می‌تواند به بن‌بست (deadlock) و کاهش عملکرد منجر شود. استفاده صحیح از این دو کلمه کلیدی، عملکرد برنامه را به شکل قابل توجهی بهبود می‌بخشد.

 

6. استفاده نادرست از Linq

Linq (Language-Integrated Query) ابزاری عالی است، اما استفاده نادرست از آن می‌تواند به مشکلات عملکردی منجر شود. برای مثال، فراخوانی مکرر یک کوئری Linq در یک حلقه، به جای ذخیره نتیجه آن، می‌تواند باعث اجرای تکراری کوئری و کاهش سرعت برنامه شود. همچنین، استفاده از .ToList() در جاهایی که نیازی نیست، باعث تخصیص حافظه اضافی می‌شود.

 

7. عدم درک و استفاده صحیح از ICollection و IEnumerable

بسیاری از توسعه‌دهندگان تفاوت بین ICollection و IEnumerable را درک نمی‌کنند. ICollection مجموعه‌ای از آیتم‌ها را نمایش می‌دهد و امکاناتی مانند شمارش تعداد آیتم‌ها و افزودن آیتم را فراهم می‌کند، در حالی که IEnumerable فقط امکان تکرار بر روی یک مجموعه را می‌دهد. استفاده از IEnumerable به عنوان نوع بازگشتی، انعطاف‌پذیری بیشتری به متدهای شما می‌دهد و سربار کمتری دارد.

 

8. استفاده از string برای مقادیر حساس

استفاده از string برای ذخیره اطلاعات حساس مانند رمز عبور، یک اشتباه امنیتی است. string یک نوع غیر قابل تغییر (immutable) است که تا زمانی که جمع‌آوری زباله (Garbage Collection) آن را از حافظه پاک کند، در حافظه باقی می‌ماند. این امر می‌تواند امنیت برنامه را به خطر بیندازد. در عوض، باید از SecureString یا char[] استفاده کرد که امکان پاک‌سازی سریع‌تر از حافظه را فراهم می‌کنند.

 

9. عدم استفاده از Dependency Injection به صورت صحیح

Dependency Injection (DI) یک الگوی طراحی قدرتمند است که به کاهش وابستگی‌ها و افزایش قابلیت تست‌پذیری کد کمک می‌کند. اما استفاده نادرست از آن، مانند تزریق مستقیم Service Locator یا استفاده از DI container به عنوان یک منبع ثابت (static resource)، می‌تواند به مشکلات معماری منجر شود و هدف اصلی DI را تضعیف کند.

 

10. نادیده گرفتن NullReferenceException

یکی از شایع‌ترین خطاها در C#، NullReferenceException است که در صورت تلاش برای دسترسی به یک شیء که به null اشاره دارد، رخ می‌دهد. برنامه‌نویسان حرفه‌ای باید همیشه فرض کنند که یک ارجاع ممکن است null باشد و قبل از استفاده از آن، بررسی‌های لازم را انجام دهند. استفاده از عملگرهای بررسی ? و ?? می‌تواند به جلوگیری از این خطا کمک کند.

 
لینک استاندارد شده: tZQ4H5

0 نظر

    هنوز نظری برای این مقاله ثبت نشده است.