یکی از مواردی که بنده خودم زیاد با اون مواجه بودم اینه که بسیاری از برنامه‌نویسان ایرانی، زبان وی بی دات را زبانی کم قدرت میداند. اگر شما نیز جز آن دسته از دوستان هستید باید به صراحت به شما بگویم که سخت در اشتباه هستید! چراکه هر آنچه که در #C قابل پیاده‌سازی باشد در VB.Net هم قابل پیاده‌سازیست و قدرت این دو زبان به دلیل استفاده از یک Framework مشترک عملاً تفاوتی ندارد.

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

تفکری که اغلب در بین برنامه‌نویسان رواج دارد این است که VB.Net را همان زبان VB کلاسیک میداند و به اشتباه تصور میکنند که قدرت آن همانند VB 6 است. همچنین برخی تصور میکنند زبان #C به این دلیل که عضوی از خانواده C محسوب میشود به اندازه زبان C قدرتمند است. اینبار نیز باید به شما بگویم که این تصور هم کاملاً غلط است!

نه VB.Net همان VB است و نه #C همان قدرت C یا ++C را دارد! پس اجازه دهید مبحث را باز کنیم...

زبان VB زبانی بود که در سال 1991 یعنی 25 سال پیش به عنوان یک زبان Object Base (و نه Object Oriented یا همان شیء گرا) معرفی شد و آخرین نسخه آن که VB 6.0 بود در سال 1998 منتشر شد. در آن زمان VB در دنیا زبان محبوبی بود و تا سال 2003 بیش از 50% نرم‌افزارهای تجاری در دنیا با آن نوشته میشد، گرچه در آن زمان در کشورمان مجبوبیت دلفی بیشتر بود و در شرکت‌ها (حداقل شرکت‌هایی که من در آنها بوده‌ام) از دلفی برای توسعه نرم‌افزارها استفاده میشد.

پس از آن در سال 2001 مایکروسافت VB را بازنشست کرد و VB.Net را به عنوان جایگزین آن معرفی کرد. با اینکه سینتکس‌های VB.Net تا حد زیادی با VB 6 مشابه بود اما تفاوت‌های آن بسیار عمده بود. VB.Net یک زبان کاملاً شیء گرا بود و از مفاهیمی مانند واراثت و چندریختی که در VB 6 وجود نداشت بخوبی پشتیبانی میکرد. VB.Net اکنون به لطف دات نت فریورک همان قدرتی را داشت که سی شارپ از آن برخوردار بود، سینتکس آن به C نزدیکتر شده بود و از اپراتورهایی نظیز =+ و =- پیشتیبانی میکرد. همچنین با فراهم کردن اپراتوهای AndAlso و OrElse به جمع زبان‌هایی که از ارزیابی کمینه یا minimal evaluation پشتیبانی میکنند پیوسته بود. تغییرات VB.Net به حدی بود که یک برنامه‌نویس VB 6.0 نیز برای کارکردن و استفاده از تمام امکانات آن باید اطلاعات خود را بروزر میکرد.

لذا توجه داشته باشید که هرگز قدرت VB.Net را دست کم نگیرید، چرا که همانطور که گفتم هر آنچه که در #C قابل پیاده‌سازی باشد در VB.Net هم قابل پیاده‌سازیست و همچون سی شارپ با ارائه هر نسخه جدیدتر از دات نت فریمورک، کتابخانه‌ها و امکانات بیشتری به آن اضافه میشود.

اکنون که تفاوت VB و VB.Net را فهمیدیم میتوانیم به موضوع اصلی مقاله خود بازگردیم و دو زبان #C و VB.Net را که متوجه شدیم قدرتی برابر دارند را با هم مقایسه کنیم:

ویژگی‌های VB.Net که در #C وجود ندارد:

  1. متغیرها میتوانند با استفاده از کانستراکت WithEvents تعریف شوند. این کانستراکت به برنامه‌نویس اجازه میکند تا با انتخاب یک شیء از لیست کلاس‌ها و سپس انتخاب متد از لیست اعلان‌ها (Declarations) بطور خودکار سیگنچر متد (Method signature) را به کد خود اضافه کند.
  2. اتصال خودکار رویدادها. وی بی دات نت دارای دستورالعمل Handles برای رویدادهای خود است که هندل رویداد را بجای شیء با متغیرهای شیء پیوند میدهد.
  3. فراخوانی یک رویدا با استفاده از کلمه کلیدی RaiseEvent به IDE این امکان را میدهد تا لیستی از رویدادها برای انتخاب نمایش داده شود. (در #C فراخوانی یک رویداد از لحاظ دستوری با فراخوانی یک پراسیجر برابر است)
  4. نیازی به تعریف Delegate برای رویدادها نیست. آنها بطور مفهومی در اعلان رویدادها تعریف شده اند.
  5. اشاره به یک شیء با استفاده از نقطه توسط ساختار With ... End With
  6. پشتیبانی از ادغام XML در کد وی بی (XML Literals)
  7. اعلان درون برنامه‌ای تاریخ
  8. ماژول (همان کلاس‌های استاتیک در سی شارپ اما با سمنتیک‌های اضافی. باید توجه کرد که هر فیلد بصورت جداگانه بصورت استاتیک تعریف شود.)
  9. Namespaceها میتوانند در سطح پروژه Import شوند، بنابراین مانند #C نیازی نیست آنها را در تمام فایل‌های پروژه ایمپورت کنیم.
  10. فیلتر کردن درون برنامه‌ای خطاها با استفاده از عبارات بولین توسط بلاک When <expression>. سی شارپ این قابلیت را با استفاده از بلاک Catch و یک if در ادامه آن شبیه سازی میکند.
  11. تعریف ثابت‌های شرطی کامپایلر.
  12. متدهای Property میتوانند پارامتر دریافت کنند.
  13. در داخل اینترفیس‌ها میتوان Enum تعریف کرد.
  14. دستورات Case میتواند شامل عبارات نامساوی باشد (در #C میتوان این خصوصیات را با استفاده از دستورات Else و if تو در تو تا حدودی شبیه‌سازی کرد).
  15. اپراتور Like میتواند برای مقایسه الگویی رشته‌ها استفاده شود که بسیار ساده‌تر از RegEx خواهد بود.
  16. استفاده از دستور Return الزامی نیست.
  17. VB.Net دارای ثبات‌های نظیر vbCrLf و vbTab است.
  18. استفاده از کلمه کلیدی out به هنگام صدا کردن توابعی که بصورت رفرنس پارامتر دریافت میکنند لازم نیست.
  19. پارامتر متدها یا توابع میتوانند بصورت ByVal یا ByRef تعریف شوند.
  20. کلمه کلیدی MyClass مانند یک متغیر شیی است. این متغیر شیی به نمونه فعلی Implement شده از کلاس اصلی اشاره میکند.
  21. کلمه کلیدی My این قابلیت را دارد تا دسترسی ساده و مستقیمی را به تعدادی از کلاس‌های دات نت فریمورک و همچنین تعامل با کامپیوتر، اپلیکیشن، تنظیمات، ریسورس‌ها و... را فراهم میکند.
  22. متغیرهای محلی بطور خودکار مقداردهی اولیه میشوند.
  23. متغیرهای محلی میتوانند با استفاده از مدیفایر Static تعریف شوند تا مقادیر آنها در بین فراخوانی پراسیجر حفظ شود.
  24. سی شارپ DirectCast ندارد.
  25. سی شارپ فاقد کلمه کلیدی End است. این کلیدواژه باعث پایان یافتن برنامه میشود.

 

ویژگی‌های #C که در VB.Net یافت نمیشوند:

  1. کامنتهای چندخطی و درون خطی (در Visual Studio قابلیت کامنت گذاری چندخطی برای VB.Net وجود دارد)
  2. رشته‌های چندخطی با استفاده از سمبل @
  3. کلاس‌های استاتیک (کلاس‌هایی که نمیتوانند شامل هیچگونه عضو غیر استاتیکی باشند، گرچه ماژول‌های در VB.Net در اصل کلاس‌های استاتیکی با سمنتیک‌های اضافه هستند)
  4. میتوان از کانتکست‌های checked و unchecked برای کنترل دقیق overflow و underflow استفاده کرد.
  5. حلقه‌های for میتوانند شامل چند شزط باشند، بطور مثال: for(int i = 0; i < 10 && somethingTrue; i++)
  6. خاصیت‌های ستر و گتر میتوانند از اینترفیس‌های جداگانه‌ای implement شوند. در VB.Net شما باید اینکار را با دو Property انجام دهید: یک خاصیت فقط خواندنی گرفته شده از یک اینترفیس و یک خاصیت فقط نوشتنی گرفته شده از اینترفیس دیگر.
  7. implement کردن اینترفیس بصورت implicit
  8. استفاده از اپراتور ?? برای بازگرداندن اولین متغیر غیر نال. بطور مثال دستور null ?? null ?? 1 مقدار 1 را بازمیگرداند. اینکار در VB.Net باید با استفاده از if های تودرتو پیاده‌سازی شود.

 

دیگر ویژگی‌های VB.Net که در #C قابل پیاده‌سازی نیست:

  1. مقدار تبدیل شده یک متغیر بولین True به نوع اینتجر میتواند بر اساس تبدیل استفاده شده 1 یا 1- باشد.
  2. در وی بی دات نت برای مقداردهی و مقایسه متغیرها از یک توکن استفاده میشود و آنهم = است. در سی شارپ برای مقایسه از توکن == و برای مقداردهی از توکن = استفاده میگردد.
  3. آی‌دی های وی بی دات نت به بزرگی و کوچکی حروف حساس نیستند.
  4. اگر Option Strict را فعال نکرده باشید و به متغیری مقداری بدهید که از جنس متغیر نباشید، وی بی دات نت در صورت امکان آن را تبدیل میکند. گرچه Option Strict به دلیل پشتیبانی از نسخه‌های پیشین بطور پیشفرض خاموش است، اما مایکروسافت توصیه میکند برای جلوگیری از خطاهای احتمالی و افزایش بازدهی برنامه آنرا روشن کنید.
  5. تابع Val میتواند یک مقدار نال را هم پارس کند. (در سی شارپ Convert.ToDouble در صورتی که مقداری نال به آن داده شود خطا تولید میکند)
  6. توابع تبدیلی CInt, CStr, CDbl, CBool, CDate, CLng, CCur, CObj و انواع گسترده‌ای از توابع تبدیل در این زبان گنجانده شده است.

 

دیگر ویژگی‌های #C که در VB.Net قابل پیاده‌سازی نیست:

  1. بطور پیشفرض عملیات عددی چک نمیشوند. نتیجه اینکار میتواند کمی به سرعت اجرای کد اضافه کند اما خطر  عدم شناسایی overflow شدن اعداد افزایش میابد. در هر صورت برنامه‌نویس میتواند با قرار دادن عملیات حسابی در یک کانتکست checked امکان بررسی overflow شدن آنها را نیز فعال کند. (البته این عمل با فعالسازی گزینه مربوطه در VB.Net نیز امکان پذیر است)
  2. آی‌دی های سی شارپ به حروف کوچک و بزرگ حساس هستند.

نتیجه‌گیری:

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

فارق از لیست‌های بالا و بررسی ویژگی‌های هر زبان، به عقیده شخصی بنده که به هر دو زبان مورد بحث برنامه‌نویسی میکنم، زبان VB.Net دارای خصوصیاتی است که سرعت برنامه‌نویسی را تا حد زیادی بالا میبرد و کار شما را جلو میاندازد، ضمن اینکه سینتکس‌های VB.Net به دلیل اینکه زبانی سطح بالاست بسیار خواناتر بوده و به شما در دیباگ کردن سریعتر و کاهش خطا کمک خواهد کرد. گرچه بجای لیست کردن و نوشتن، بهتر است بصورت عملی این تفاوت‌ها را نشان دهیم. بنابراین این مساله اینجا تمام نمیشود و ما حتماً یک مقاله دیگر نیز در این مورد آماده خواهیم کرد.

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

زبان VB.NET در آمریکا بسیار پرطرفدارتر بوده و طبق نظرسنجی منتشر شده از Forrester Research در حدود 60% از برنامه‌نویسان دات نت فقط از VB.Net جهت توسعه نرم‌افزار خود استفاده میکنند، گرچه توجه کنید که این آمار و ارقام به هیچوجه دلیلی بر برتری یک زبان بر زبان دیگر نیست.

در بین برنامه‌نویسان دات نت ایرانی و در شرکت‌ها بیشتر شاهد این هستیم که برنامه‌های خود را با استفاده از سی شارپ توسعه میدهند که به عقیده شخصی بنده این موضوع نشأت گرفته از عدم تمایل شخص به یادگیری زبان‌های دیگر است و فرد مذکور تنها به دنبال این است که با استفاده از مهارت‌های داشته‌ی خود به کسب درامد بپردازد و علاقه‌ای به گسترش  دانش خود ندارد. شاید همین موضوع یکی از مهمترین دلایلی است که کشورمان در صنعت نرم‌افزار ضعیف بوده و برنامه‌نویسان به دلیل مسائل مالی تمایلی به استارت یک پروژه متن باز یا به اشتراک گذاری سورس‌های خود ندارند.

اگر میخواهید برنامه‌نویس دات نت شوید، به شما پیشنهاد میکنیم هر دو زبان VB.Net و #C را یاد بگیرید و خود را محدود به یادگیری تنها یک زبان نکنید، اجازه دهید ذهنتان بازتر شود و بتوانید در سطح بالاتری از سایر برنامه‌نویسان قرار بگیرید.