سلام بر جوانان غیور دات نت کار ایران! اساتید حال و آینده!!!!!! پیشاپیش از حضار و اساتید بزرگ به دلیل طولانی شدن مجدد پاسخم عضر خواهی میکنم!
میدونید! من دیشب رفتم سر کوچه دولیتر گازوئیل گرفتم و ریختم تو مخم و همشو سوزوندم! آخرش به این نتیجه رسیدم:!
" من واقعاً لذت میبرم این جوانان رشید و منصف را میبینیم که هیچ وقت از راه انصاف و مرام دور نمیشوند و تمایلات شخصی شان را قاطی نمیکنند!!! "
آخه انصاف تون و شکر!
هر کجا VB دست برنامه نویس را باز میزاره تا راحت باشه و زیر ساختها را از اون مخفی میکنه این جزو معائب و گناهان کبیره VB.Net محسوب میشه (مثل همین کد کثیف Form1.Show و...) ولی هر جا #C همین کار را انجام میده این جزو امکانات ملکوتی #C حساب میشه (مثل yield و...) حتی VB.Net بیچاره اگر صرفاً دست برنامه نویس را باز بذاره و زیر ساخت خاصی را هم مخفی نکنه و امکان و قدرت فزونی در اختیار اون بذاره باز هم جزء معایب آن حساب میشه (مثل همین نام ها در پیاده سازی های رابط ها که به نظر من برتری VB.Net در این مورد است و...)
ولی دوباره هر کجا #C دست برنامه نویسش را باز میذاره و او را آزاد میذاره و قید و بند را از اون بر میداره این باز هم جزء امکانات بی نظیر اون حساب میشه (مثل همین حلقه For بی حساب و کتاب! و...) حتی وقتی VB.Net برنامه نویس را محدود میکند و مثلاً او را مجاب میکند که در حلقه های For صرفاً یک ایندکس داشته باشیم تا از اشتباه جلوگیری شود بازهم آن را چزء معایبش حساب میکنید نه سردتان میسازد نه گرمتان!
به بیان غیر پوشیده میتوان گفت هر چیزی را که رفتاری شبیه #C نداشته باشد جزء معایب میدانید، شما رأی خود را صادر کرده اید و اینجا صرفاً VB را با معیارهای خودتان محاکمه میکنید و بررسی واقعی مزیت و عیب در کار نیست (هر چه #C دارد حسن است و هرچه ندارد اگر زبانی داشته باشد عیب آن زبان است! تفکر جالبی است! هر که طبق #C رفتار میکند شما قبول دارید و هر که نیست در پیت است!!!!!!!!)
با برسی در پستهای قبلی بیشتر ایرادها و معایبی را که دوستان مطرح کردند من چیزی جز غالب فوق الذکر ندیدم.
متاسفانه این قسمت رو متوجه نشدم.
علمای دات نت کار (#C یا VB.Net و...) بهتر از هر کسی میدانند که نام متد در کلاسسی تضمینی بر اجرای متد همنام با رابطی نیست و برای اجرا و دسترسی بی نقص و کامل به اعضای یک رابط باید اشاره گر رابط به دست بیاید و برای اجرای و دسترسی به اعضا باید از نام های مصوب استفاده شود و این در ذات اولیه اصول طراحی رابطها است و هیچ زبان برنامه نویسی توانایی نقض آن را ندارد، در خیلی از موارد هم اعضای موجود در کلاسس دسترسی protected دارند که برای دسترسی به رابط از خارج باید اشاره گرش بدست آید، حتی اساتید بهتر میدانند که بسیاری از رابطهای پیشرفته و قدرتمند دات نت با رابط System.IServiceProvider عرضه میشود که عملاً اشاره گر رابط را پس میدهد.
بگذریم! به کد زیر دقت کنید!
Public Interface ISample
Sub SampleSub()
ReadOnly Property SampleProperty() As Integer
End Interface
Public Class SampleClass
Implements ISample
Private ReadOnly Property ISample_SampleProperty() As Integer Implements ISample.SampleProperty
Get
Return 123
End Get
End Property
Private Sub ISample_SampleSub() Implements ISample.SampleSub
System.Windows.Forms.MessageBox.Show("OK!" & vbCrLf & "run ISample.SampleSub")
End Sub
End Class
Dim X As New SampleClass()
'Syntax error: 'ISample_SampleSub' Sub in not accessible in this context because it is 'Private'
X.ISample_SampleSub()
'Syntax error: 'SampleSub' is not a member of 'SampleClass'
X.SampleSub()
Dim I As ISample = X
I.SampleSub()
'Or
'With DirectCast(X, ISample)
Dim value As Integer = I.SampleProperty
راه اصلی استفاده از یک رابط چیزی شبیه دستورات فوق است (در #C نیز همین است، باور ندارید، اساتید و مراجع #C حضور دارند) وقتی شما اشاره گر رابط را بدست آورید دیگر نام پیاده سازی شده و حتی سطح دسترسی مهم اصلاً نیست و شما میتوانید با خیال راحت اعضای رابط را استفاده کنید، باز هم تاکید میکنم که علمای حاضر در همینجا بهتر میدانند که مخصوصاً در حالات پیشرفته مثل دسترسی از طریق رابط قدرتمند System.IServiceProvider راه فوق تنها راه است.
البته باز هم تاکید میکنم که یک قابلیت بسیار خوب است و اگر دوستان ناراحت نشوند من آن را برتری میدانم، در این مورد VB با قدرت دست برنامه نویسش را باز گذاشته ولی قوانین OOP را نقض نکرده (در اصل اگر میخواست هم نمیتوانست فقض کند!)
راستی من #C بلد نیستم، (چشم بسته غیب گفتم!) ولی میشه شما لطف کنید و بگید وقتی دو رابط با یک متد هم نام در کلاسسی در #C پیاده سازی میشود، چطور میتوان به آن متد از خارج دسترسی داشت؟؟؟ و اینکه اگر بخواهیم بدون به دست اوردن اشاره گر رابط مورد نظر (همانطور که خودتان انجام میدهید) بخواهیم آن متد را صرفاً به وسیله اشاره گر کلاسس اصلی اجرا کنیم، چه کدی باید نوشت؟؟؟ (اگر به همان روشی باشد که من الآن حدس میزنم، مزیت جالب و قوی VB.Net در این مورد خاص مشخص میشود و شما هم در صورت منصف بودن به مثبت بودن وجود این امکان در VB.Net معترف میشوید و آن را با بی انصافی تمام جزء معایب حساب نمیکنید)
در بالای کدهاتون بنویسید :
using System.Drawing;
بعدش :
Point p = new Point();
ها! ببخشید! من هواسم به این Using نبود ! در فکر آن Using بودم!!!
آخه جدا از این مباحث من در جاهای دیگر هم اشاره کرده ام که اصلاً از دستور فوق و معال VB آن یعنی Implement خوشم نمی آید! و از آنها استفاده نمیکنم، (و این را با دقت در اکثر کدهایم متوجه میشوید که اغلب مسیرها کامل هستند) بحرحال حق با شماست و روش فوق کدنویسی را کاهش میدهد ولی توجه داشته باشید که کد VB هم باز کاهش می یابد و باز کمتر میشود!
البته تاکید میکنم که بحث بر سر سینتکس اصلاً اصولی نیست ولی باز هم در مورد ان for توجه داشته باشید VB هم در مواردی کدی کمتر از #C تولید میکند (مثل همان رویدادها)
(با تاکید مجدد بر عدم بث بر سر سینتکس! لطفاً ابهامات این تیپی مطرح نکنید که مجبور به پاسخ شویم!)
فکر کنم بهتر بود میگفتم که، قوائد سی# زیر پا گذاشته نمیشه ! ( چون قوائد بیسیک.نت چیز دیگه است )
VB.Net به هیج وجه اجازه کوچکترین تخطی از قوانین OOP و وراثتی را نمیدهید، اگر میتوانید مثالی بزنید وگرنه اینطور تخریب چهره نکنید!!!!!!!!!!!
در سی# هر دستور کار خودش رو میکنه. برای این منظور از if استفاده میکنم. ( باز هم همون پایبندی !)
همان مسئله اول که گفتم! چون #C قابلیت When را ندارد پس باید توجیهی آورده شود! آیا استفاده از for به جای while مصداق حرف شماست؟ و...
+ استفاده از عملگرهای checked و unchecked برای کنترل استثنای سرریز - Overflow exception control
در VB.Net میتوان تا حدودی این کار را انجام داد! و گزینه مورد نظر را برای کل پروژه تایین کرد. (که خطای سرریز را بگیرد یا نه! البته در کل پروژه)

نوشته شده توسط
PC2st.ir
ببخشید، یک مورد رو یادم رفته بود اضافه کنم! اونهم تعریف کردن یک متغیر از نوع استاتیک در بدنه یک متد در بیسیک.نت بود ! :) ( این رو هم اضافه کردم )
فکر کنم این کار رو انجام ندیم بهتره...
چرا؟ برای اینکه #C این قابلیت را ندارد بزهم نتیجه گرفتید که این قابلیت بدی است؟؟؟؟؟؟؟ (همان تفکر که در اول گفتم)
بعدا شاید یه روز مجبور شدم توی Notepad بنویسم!!
توجه تان را به مسئله حساسیت به حروف بزرک و کوچک جلب میکنم، این مسئله در جای غیر از ادیتور مخصوص میتواند منشاء خطاهای بسیار شود! تازه میتوانید درج پرانتز در انتهای متدهای بدون پارامتر را هم در نظر بگیرید، با کمی بی دقتی دچار مشکلات بسیار میشوید.
تازه من همیشه در دستورات پیچیده SQL با پرانتزهای باز شده و تعداد بسته شده ها مشکل پیدا میکنم، شما اطمینان دارید که در پروژه بزرگ با گیومه باز و بسته شده مشکل پیدا نمیکنید؟
گرچه همچنان تاکید میکنم این یک مورد سینتکسی است و صحبت در مورد آن غیر علمی است ولی وقتی دوستان ابهامی مطرح میکنند ناچار به پاسخ هستیم.
اگر هم بحث را به ادیتور ها بکشانیم میتوالن گفت:
عزیز دل برادر ، قدرت ادیتور VB.Net را دست کم گرفته اید! شما خط اول را بنویسید و Enter را بزنید مابقی را ادیتور دات نت تایپ میکند!
مثلاً شما بنویسید Try و Enter کنید، VB.Net با هوشمندی و سخاوت تمام Catch ex As Exception و نیز End Try را تایپ میکند!
از این بحثها اصلاً خوشم نمی آید ولی مجبورم قدرت کم نظیر ادیتور VB.Net را یادآوری کنم، من زبانهای بسیار و ادیتورهایشان را دیده ام ولی به جرأت میگویم تا حالا ادیتوری قوی تر و کامل تر از VB.Net ندیده ام! دلیل دارم! همین درج کدهای قطعی و واضح، کافیست دستوری را بنویسید و آن دستور لزوم کدهایی دیگر را قطعی کند، بعد از زدن Enter کلیه کدهای قطعی به صورت خودکار تایپ میشوند، مثل نمونه فوق یا کافیست شما از کلاسسی وراثت بگیرید که آن کلاسس شامل اعضای MustOverride باشد و کلاسس شما هم برچسب MustInherits را نداشته باشد، فوراً دستورات Overrides اعضای مورد نظر به طور خودکار تایپ میشوند، یا وقتی رابطی را پیاده سازی میکنید، لازم نیست تک تک اعضای رابط را دستی بنویسید، بعد از Enter پیاده سازی رابط مورد نظر فوراً درج میشود و یا امکان ارائه گزارش کامل کلیه خطا ها و هشدارها در هر لحظه و بدون نیاز به کامپایل و یا با یک نک Backspace فوراً لیست لغات مجاز قابل تایپ ظاهر میشود (بله در #C هم وجود دارد ولی اگر لیست بسته شود برای باز شدن مجدد آن باید مدام Backspace زده شود تا به سر بلوکی مشخص برسیم و لیست مجدداً باز شود و یا نگه داری همیشه گی کدها در حالت تمیز و شتری شده صحیح که تخطی از آن غیر ممکن است! و... (برای چندمین بار تاکید میکنم که این بحث ها علمی نیستند، آنها را وسط نکشید که مجبور به پاسخ شویم!)
تازه از این گذشته، آیا کدهای پروژه های بزرگ و تمیز C را ندیده اید؟؟؟؟؟ (بعید میدانم) من بارها در کدهای تمیز و بی نقص بزرگان C خطول این تیپی را دیده ام!
} //end loop
} //end if
etc ...
وقتی بزرگان C به صورت عمدی .... چی بگم آخه؟؟!! واقعاً نمیدانم میتوانم شما را راضی کنم یا نه؟! اگر کمی منصف تر باشید متوجه میشوید که VB8 دیگر آن در پیت غیر قابل قیاس با ++C نیست که حتی مقایسه شان باعث خنده میشد، کمی تعصبتان را کم کنید و چشمانتان را باز کنید (چشم ها را باید شست، جور دیگر باید دید) اونوقت حقیقت را درک میکنید.
علاما و فضلا و فقها (و مراجع #C !) در صورت نیاز و ابهام جدید ما همچنان در خدمت هستیم.
موفق و پیروز و سربلند باشید.