یادگیری سی شارپ

saalek110

Well-Known Member
نقل از تاپیک : آموزش #c از پایه
http://forum.majidonline.com/showthread.php?t=42967


UNIQUE :
------------------------------
مرجع آموزش :
Sams Teach Yourself Microsoft Visual C Sharp Dot NET In 24 Hours
آدرِس Download :
http://www.forum.majidonline.com/showthread.php?t=42967&page=2

قسمت اول : the Visual Studio .NET Environment
ساعت اول : Jumping in with Both feet : A Visual C# .NET Programmer Tour

============================================
مقدمه :
ياد گرفتن يک زبان برنامه نويسي جديد ممکنه قدري ترسناک باشه!
اگر شما قبلا" هرگز برنامه نويسي نکرديد ممکنه نوشتن يه سري متن و تبديل اون به برنامه هاي کاربردي (نرم افزارهاي) قدرتمند شبيه جادوگري به نظر بياد.Visual C#.NET ترکيبي از زبان قدرتمند ++C همراه با سادگي VisualBasic است.
قبل از اينکه نوشتن برنامه اي رو در #C شروع کنيم بايد با مطالب زير آشنا باشيم :
- آخرين جزء از برنامه که توزيع ميشود , نسخه compile شده برنامه است. اين اجزاء ميتوانند بدون اينکه براي اجرا نيازي به Visual C#ِ باشد (البته اونها زمان اجرا به net. نياز دارند) بين مردم و کامپيوترهاي ديگه توزيع شوند.اين اجزاء توزيع شده اغلب برنامه ناميده مي شوند.
[براي اطلاعات بيشتر راجع به net. و (CLR(Common Language Runtime به تاپيک
http://www.forum.majidonline.com/showthread.php?t=38956&page=8
http://www.forum.majidonline.com/showthread.php?t=38956&page=9
مراجعه کنيد]
Visual C#.NET قسمتي از خانواده VisualStudio است . VisualStudio يک محيط توسعه يافته کامل است که IDE(مخفف Integrated Development Language - زبان توسعه يافته يکپارچه-) ناميده مي شود.IDE چارچوب طراحي در جايي است که شما برنامه هاي خود را ميسازيد . هر ابزاري که شما براي ساختن پروژه هاي #C خود نياز داريد در داخل Visual Studio IDE قابل دسترسي است . يک نکته مهم اين که Visual Studio.net استفاده تعداد زيادي از زبان هاي مختلف مثل #C و Visual Basic.net را پشتيباني ميکند.اين محيط توسعه يافته خودشVisualC#.net نيست-آن زباني که شما با VisualStudio.net استفاده ميکنيد #C است.براي کار کردن با پروژه هاي Visual C#.net شما اول بايد Visual Studio IDE رو شروع کنيد.حالا بعد از نصب Microsot Visual Studio .NET 2003 با انتخاب گزينه Microsot Visual Studio .NET 2003 از آدرس:
start --> All Programs --> Microsot Visual Studio .NET 2003
نوشتن اولين برنامه رو شروع ميکنيم.

ساختن يک پروژه جديد :

موقعي که شما Visual Studio .NET را شروع ميکنيد TabPage با نام StartPage در IDE خود مشاهده ميکنيد. در اينجا شما ميتوانيد يک پروژه جديد ايجاد کرده يا پروژه هاي قديمي خود را باز کنيد.همانطور که در شکل زير مشاهده ميکنيد با فشردن گزينه NewProject در سمت چپ پايين صفحه يک WindowsApplication جديد ميسازيد(در پنجره اي که با فشردن NewProject باز ميشود شما ميتوانيد انواع زيادي از پروژه هاي NET. را بسازيد. در اينجا ProjectType از چپ صفحه باز شده Visual C# Project و Templates را از سمت راست همين صفحه Windows Application انتخاب کنيد)
-به Picture1 و Picture2 در پایین صفحه مراجعه کنید-
اگر شما Visual Studio StartPage رو نمي بينيد بايد يه سري جزئيات پيش فرض را تغيير داد (مراحل انجام اينکار در قسمتهاي بعدي آموزش بررسي خواهيم کرد). براي ايجاد کردن پروژه جديد در اين زمان شما ميتوانيد از منوي File --> New --> Project را انتخاب کنيد تا يک WindowsApplication جديد براي شما ايجاد شود. موقعی که شما newProject میسازید
#Visual C یک فولدر با نامیکه شما در textBox جلوی Name واردکرده اید و در آدرسی که در textBox جلوی Location وارد کرده اید میسازد.مثلا" اگر Name را PictureViewer و آدرس را C:\temp بذارید پروژه شما در آدرس C:\temp\PictureViewer ساخته می شود.اگر شما CheckBox کنار Create Directory for Solution را تیکدار کنید VisualC# علاوه بر فولدری که در آن آدرس برای فایلهای اصلی پروژه ساخته یک فولدر دیگر در همان آدرس خواهد ساخت که مجموعه ای از فایلهای چند پروژه را میتوانیم در آن قرار میگیرد(برای مواردی که چندین پروژه با هم یک Solution را ارئه میدهند) یک نکته اینکه بهتر است نام و آدرس مناسبی را برای پروژه خود در همان اول کار انتخاب کنید چون تغیر نام یا محل پروژه بعدا" کار شما را سخت تر و زیادتر خواهد کرد.
حالا با هم پروژهای با نام Picture Viewer (ای نام را در textBox جلوی name بنویسید) و در آدرس پیش فرض (آدرس که احتمالا" MyDocument شما خواهد بود را تغییر ندهید)بسازید. ضمنا" برای فولدرهای مجزا برای فایلهای Solution خود نگران نباشید زیرا این Solution شما تنها شامل یک پروژه (همان Picture Viewer ) خواهد بود.پس CheckBox مربوط به Create Directory for Solution را اگر در حالت انتخاب است تیک آنرا بردارید تا از حالت انتخاب خارج شود.حالا ok بزنید محیط طراحی یک پروژه جدید برای شما باز میشود این فرم که دارید در زمان طراحی میبینید همان فرمی است که بعد از اتمام برنامه به کاربر نهایی نشان داده میشود.محیط VisualStudio.net که در شکل زیر نشان داده شده ممکن است با چیزی که شما استفاده میکنید اندکی متفاوت باشد.
-به Picture3 در پایین صفحه مراجعه کنید-
این مسئله به resolution monitor شما و فاکتورهای دیگری از این قبیل بستگی دارد .همه element هایی که راجع به آن صحبت شده یا خواهد شد در همه ویرایشهای VisualStudio.net وجود دارد(اگر پنجره هایی که در شکل نشان داده شده در IDE شما وجود ندارد میتوانید از منوی View در بالای صفحه برای نمایش آن استفاده کنید). یک نکته شما شروع میکنید یک پروژه میسازید برای اینکه برنامه ای که نوشته اید بتوان آنرا در کامپیوتر دیگری هم اجرا کرد باید آن پروژه را به صورت یک Component همانند یک فایل اجرایی (برنامه ای که توسط کاربر قابل اجرا باشد) یا یک DLL (یک component که توسط یک component دیگر یا برنامه های دیگر قابل اجراست )کامپایل کنید. فرآیند کامپایل در قسمتهای بعدی آموزش بحث خواهد شد

درک کردن محیط VisualStudio :

اولین باری که شما VisualStudio را اجرا میکنید متوجه میشید که IDE شامل تعداد زیادی پنجره است همانند پنجره Properties درسمت راست صفحه (که برای دیدن و تنظیم کردن خصوصیات Object ها استفاده میشود) علاوه بر تعداد زیادی پنجره IDE شامل چندین tab میباشد همانند tab ToolBox در سمت چپ IDE .حالا tab ToolBox را برای نشان دادن پنجره ToolBox کلیک کنید. شما میتوانید Mouse را برای چند لحظه ثابت روی این tab نگه دارید تا پنجره مربوطه به خوبی نمایش داده شود وبرای hide شدن آن هم Mouse را از روی آن tab بردارید .برای بستن پنجره هم (X) را در بالای همان پنجره مورد نظر بفشارید. شما میتوانید اندازه و موقعیت پنجره ها را خودتان تنظیم کنید و پنجره ها را هر زمان که نیاز داشتید نمایش دهید ویا پنهان کنید .برای تخصصی کردن این محیط در قسمتهای بعدی اموزش صحبت خواهیم کرد.هر چیزی را در محیط VisualStudio خود DoubleClick نکنید در این محیط عملکرد doubleClick با SingleClick متفاوت میباشد اگر object که روی فرم قرار داده شده را doubleClick کنید به محیط کد نویسی و Event پیش فرض مربوط به این object میرود .اگر اشتباها" این کار راانجام دادید با انتخاب tab FormDesign میتوانید به محیط طراحی برگردید و محیط کد نویسی پنهان میشود. پنجره Properties در گوشه سمت راست محیط IDE شاید خیلی مهم باشد و آن یکی از قسمتهایی است که شما زمان کار خیلی به آن نیاز خواهید داشت. اگر resolution کامپیوتر شما در 640x480 تنظیم شده احتمالا" فقط تعداد کمی از property ها را همزمان میتوانید ببینید .به شما پیشنهاد میکنم resolution رو افزایش داده و در 800x600 تنظیم کنید و من شخصا" آن را در 1280x1024 تنظیم میکنم زیرا در این حالت مقدار زیادی از فضای کار نشان داده میشه. شما هم میتوانید با righClick روی desktop وانتخاب Propeties جزئیات صفحه نمایش خود را تغیر دهید
موفق باشید.
http://forum.majidonline.com/attachment.php?attachmentid=3564&d=1133098042
=================================================
سالک: در لینک آخر متن 3 عکس از محیط برنامه موجود است.
 
آخرین ویرایش:

saalek110

Well-Known Member
سالک: در پست قبلی دو لینک بود که مطالب لینکها را نقل می کنم:

سالک: منظورم اينه كه وقتي برنامه هايي را با كامپايلرهاي سي ، مثل توربو سي ، ويژوال سي ، يا سي شارپ مي سازيم، آيا برنامه يا اپليكيشن ما مستقل مي تونه روي ويندوز يا داس زندگي كنه ؟ يا بايد با فايل هايي حمايت بشه؟

UNIQUE :
سیستم net. میشه گفت هم مبتنی بر Windows است هم مبتنی بر Proccessor . بر روی Proccessor های x86 کار میکنه البته Proccessor 80486 که خیلی ضعیف برای این کار اما از 80586 به بعد net. روشون کار میکنه و CLR برای windows های 32 بیتی داده شد .
در VisualStudio6 ما اگر از یه dll استفاده میکردیم باید بر روی سیستمی که میخواستیم برنامه اجرا بشه اون dll رو Register میکردیم و همه این dll ها (اگر اشتباه نکنم) در شاخه Windows/System32 قرار میگرفتند و اگر میخواستیم Version دیگه ای از اون dll رو یا dll دیگه ای با همون نام رو روی سیستم Register کنیم با مشکل و خطا مواجه میشدیم چون نمیشد دو تا فایل با یک نام توی این شاخه قرار بگیره اما درVisualStudio.net تغییرات زیادی در فریم ورک ایجاد شده و ما دو نوع dll داریم یا private
هستند یا StronglyNamed که بهش Public یا Global هم میگن در اینجا اگر شما شاخه برنامت رو مثلا" َApplcation1 را کل شاخه اش رو کپی کرده و ببری روی کامپیوتر شخص دیگه ای پیست کنی و فایل exe اون رو اجرا کنی بدون هیچ مشکلی اجرا میشه(البته به شرطی که net FrameWork. روی سیستم اون شخص نصب باشه البته در ویندوزهای XP و 2003 net FrameWork. همزمان با ویندوز نصب میشه اما در نسخه های قبلی windows باید نصب بشه) و دیگه احتیاجی به register شدن dll Private شما نیست همین که dll های مورد استفاده در برنامت رو در شاخه یا زیر شاخه Application1 قرار داده باشی کافیه چون برنامه وقتی اجرا میشه و به CLR میگه من به این dll نیاز دارم ابتدا در شاخه و زیر شاخه های این Application رو دنبال این dll میگرده و اگر این dll در اونجا بود (البته یه سری چیزهای دیگرو هم بررسی میکنه) و بعد میگه این dll Private است اگر نبود میره در شاخه Windows/Assembly (در net. وقتی نصب میشه همه dll های StronglyNamed در زیر شاخه ای به نام assembly در شاخه Windows قرارمیگیرند )و اونجا دنبال این dll میگرده اگر اونجا بود (با بررسی یه سری شاخص های دیگه میکه این dll Public است) و استفاده میکنه اگر اونجا هم نبود دراینترنت دنبالش میگرده اگر اونجا هم نبود اونوقت error میده.
dll های stronrlyNamed به این صورت نامگذاری میشوند که در شاخه Assembly یک دایرکتوری به اسم system.data ایجاد میشه و تمام ورژنهای dll System.data داخل این directory قرار میگیرند و نامگذاریشون شامل 4 قسمت است Version (نسخه dll )و public Key Token (یک عدد 64 بیتی که 16 حرف ان به صورت تصادفی برای نامگذاری انتخاب میشود ) و Name (نام)و Calture (کشور و زبان) وجود داره و به دلیل نامگذاری قوی که گفته شد دیگه در register شدن dll Public خطا بروز نمیکنه و اگه dll ها هم نام هم باشند مشکل بوجود نمییاد و نامگذاری dll های Private هم به همین صورت است اما وارد کردن همه این موارد الزامی نیست و اگر شما یه dll رو Public تعریف کنی و اون رو در زیر شاخه برنامت قرار بدی CLR از همونجا اون رو به عنوان یه dll Private خودش در نظر میگیره و استفاده میکنه اما بالعکس این قضیه صادق نیست و نمیشه یه dll Private رو به عنوان public استفاده کرد.
dll های Private فقط توسط همون برنامه ای که در زیر شاخش قرار دارن میتونن استفاده بشن اما dll های Public توسط برنام های دیگه هم همزمان میتوننن استفاده بشن .
امیدورام مطلب رو خوب بیان کرده باشم
فکر میکنم برای بازتر شدن این موضوع مقاله ای که گذاشتم بتونه کمک کنه.
موفق باشید

http://www.forum.majidonline.com/attachment.php?attachmentid=3178&d=1130594114
http://www.forum.majidonline.com/attachment.php?attachmentid=3179&d=1130594313
http://www.forum.majidonline.com/attachment.php?attachmentid=3180&d=1130594518
http://www.forum.majidonline.com/attachment.php?attachmentid=3181&d=1130594639

این فایلها را ماهها قبل من دو بار خوانده بودم. الان هم دانلود کردم. در این تاپیک یا تاپیک مناسب استفاده خواهم کرد.
 
آخرین ویرایش:

saalek110

Well-Known Member
باز هم از تاپیک:آموزش #c از پایه

UNIQUE :

تغير دادن ويژگيهاي Object ها :
بيشتر چيزهايي که شما در Visual C#.NET استفاده ميکنيد يک Object هستند.براي نمونه فرم ها Object هستند همينطور همه item هايي که شما ميتوانيد روي فرم خود قرار دهيد تا يک Interface (صفحه گرافيکي رابط بين کاربر و برنامه)رو بسازيد مثل ListBox ها يا button ها همه انواع زيادي از Object ها هستند و همه object ها بر اساس نوع خود طبقه بندي ميشوند براي مثال item هايي که شما روي يک فرم ميتوانيد قرار بديد object هاي کنترلي يا کنترلها ناميده ميشوند.(اگر بخواهيم object رو در يک مثال کوتاه معرفي کنيم شايد بشه مفهومش رو با اين مثال درک کرد که ما يه موجوديتي به نام بشر داريم و همه انسانها نمونه هايي از اون بشر هستند که تمام مشخصات يک بشر رو دارند ولي ممکن خصوصيات رفتارها يا ظاهر اونها با هم تفاوت داشته باشه در اينجا هم به همين صورت است رابطه اي که بين Calss و object برقرار است مشابه رابطه اي است که بين موجوديت بشر و يک انسان برقرار است مثلا" ما يک class به اسم Form داريم که يکسري Property ها و event هايي براي خودش داره شما وقتي يه Project جديد ايجاد ميکنيد يک نمونه از Class Form به اسم form1 به شما داده ميشه شما ميتوانيد Property هاي اون رو تغير بديد و يا Event هايي رو بهش اضافه کنيد و يا control هايي را (از پنجره toolBox )به اون اضافه کنيد). همه Object ها ممکن است ظاهر گرافيکي نداشته باشند يعني مثل يک button يا يک form قابل ديدن نباشند اما توي code نويسي موجود باشند .درک کردن کامل object ها و توضيحات کاملتري راجع به آن در قسمتهاي بعدي آموزش مطرح خواهد شد.
هر object براي خودش يکسري خصوصيات ويژه همانند Property ها دارد(بجز Object هايي که قابل ديدن نيستند و ظاهر فيزيکي ندارند).شما براي خودتون يکسري Propety هاي خاص داريد مثلا" رنگ موي شما يا قد يا وزن شما اينها همه Property ها و ويژگيهاي شما هستندObject هاي Visual C# هم براي خودشان Property هاي خاصي دارند مثلا" BackColor يا Height. با مشخص کردن و set کردن اون property ها ويژگيهاي آن object را مشخص میکنید.موقعی که شما یک Object جدید میسازید Set کردن Property ها برای اینکه ظاهر Object ها مشخص بشه و اونطور که شما میخواهید تنظیم بشه اولین کاری که شما نیاز دارید انجام بدید(برای نشان دادن Property یک Object , آن Object را در محیط کاری (منظور منطقه کاریتون در IDE میباشد)کلیک کنید)
نامگذاری Objectها :
اولیت Property که شما بایددر مرحله اول برای هر Object جدیدی تعریف کنید , نام آن می باشد.اگر پنجره Property آشکار نیست با فشار دادن F4 می توانید آن را ببینید.به قسمت Design پروژه رفته و در پنجره Property آن Property Form را ببینید , نام پیش فرض برای آن Form1 است. موقعی که شما یک Object می سازید .VisualC#.NET در ابتدا برای آن یک نام واحد متناسب با نوع Object تولید می کند.این نامها به صورت تابعی تولید می شوند و برای یک کاربرد عملی مناسب نیستند.برای نمونه وقتی Project ما چندین فرم داشته باشد VisualC#.NET برای آنها نام های ..., Form1, Form2, Form3 را پیش فرض انتخاب خواهد کرد.اما پروژه ای که فرمهای آن با شماره مشخص شده باشد و از هم قابل تشخیص نباشد مدیریت آن بسیار سخت خواهد بود.برای بهتر مدیریت کردن فرمهاتون شما باید نامهای تشریحی و قابل تشخیص کوتاه به آنها بدهید و نام fileName آنها را هم تغیر دهید .با کلیک کردن بر روی Property Name و تغیر دادن متن فرم از Form1 به fclsViewer نام فرم 1 تغییر داده می شود و برای تغیر دادن fileName در پنجره SolutionExplorer با راست کلیک کردن بر روی Form1.cs و انتخاب Rename نام فرم1 را از Form1.cs به fclsViewer.cs تغیر دهید. در پروژه هایی که انجام خواهد شد در مراحل بعدی دیگر به شما نخواهیم گفت که fileName را تغییر دهید اما سفارش میکنم که در همه پروژه های واقعی fileName ها را به نامهای قابل تشخیص و با معنی تغیر دهید.
جزئیات Property Text از فرم :
Property Text فرم در titleBar فرم شما ظاهر شده و نام Form1 را دارد زیرا VisualStudio.NET نام فرم را به عنوان متن پیش فرض titleBar قرار می دهد ولی موقعی که شما نام فرم را تغیر می دهید NET. متن titleBar را تغیر نمی دهد.متن titleBar به وسیله مقدار Property Text از فرم تعین می شود. فقط با یکبار Click کردن بر روی فرمProperty های مربوط به آن نمایش داده میشود
Property Text را از میان Property ها پیدا کنید (اگر Property های شما بر اساس گروه طبقه بندی شده در گروه Appearance به دنبال آن بگردید - طبقه بندی Property های خود را براساس حروف یا گروه میتوانید در بالای همان پنجره Properties تعین کنید - )و متن آنرا به Picture Viewer تغیر دهید .حالا با فشار دادن Enter یا انتخاب یکProperty دیگر می بینید که متن titleBar فرم تغیر کرده .
- با توجه به شکل زیر با راست کلیک کردن در محدوده آبی بالای پنجره Properties میتوانید حالت قرار گرفتن آن پنجره را برای محیط کاری خود تعین کنید -
http://forum.majidonline.com/attachment.php?attachmentid=3665&stc=1&thumb=1&d=1134021695
 
آخرین ویرایش:

saalek110

Well-Known Member
در مورد کامپایل بیرون محیط ویژوال استودیو طبق عکس زیر عمل کنید. به محل فایل رفته و دستوری که در عکس داریم را بنویسید:

a6.gif


نقل از :
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=975978&SiteID=1
راجع به مکان csc.exe پرسیده شده در این تاپیک که نمی دونم مربوطه به عکس بالا یا نه ولی آدرسش اینه:
C:\windows\microsoft.net\Framework\v2.0.50727\csc.exe
 
آخرین ویرایش:

saalek110

Well-Known Member
آخرین ویرایش:

saalek110

Well-Known Member
http://www.hackerz.ir/forums/showthread.php?t=953
--------------------------------------------------------------------
Name Spaces
کار کردن با کلاس های .net و فضا های نام بستگی به هدف شما از نوشتنه برنامه و طرح شما دارد !

ابتدا در طرح ريزی برنامه ای که ميخواهيد بنويسيد بايد Class ها و Name Space های مورد استفاده رو در نظر بگيريد، بعد از اون ميتونيد به راحتی شروع به نوشتنه برنامه (با طرح قبلی) کنيد ...

برای داشتن آشنايی مقدماتی با Class هاي موجود و Name Space ها بهتر است از فضای نام "System" شروع کنيم ...

توجه : در .نت 2.0 يک فضای نام به نامه "Global" وجود دارم که فضای نام "System" زير مجمويه آن است ...
در کل فضای نام System شامل اکثر "Class" ها، "Name Space" ها، "Interface" ها، "Method" ها و ... است و تقريباً بزرگترين فضای نام در .net است، شما براي نوشتن برنامه مورد نظر ميتونيد از فضا هاي نام موجود در "System" استفاده کنيد ...

براي مثال براي کار با "Text" و "Text Encoding/Decoding" ميتوانيد از فضا های نام "System.Text" و "System.Text.Encoding" استفاده کرد، که در قسمت هاي بعدی به صورت موضوعی فضا های نام مختلف رو مورده برّسی قرار ميدهيم ...

به طور کلی فضا های نام شامل فضا های نام زير مجموعه، متد های مختلف و اينترفيس های زير مجموعه و ... هستد !

در کل کاربرد فضا های نام دسته بندی "Object" ها و "Method" ها و ... مختلف است، پس به طور کلی "Name Space" ها را ميشود به عنوانه يک ابزر دسته بندي اشيأ موجود دانست ...

بعضی از فضا های نام پر کاربرد در .net عبارتند از :
System.Text", "System.IO", "System.XML", "System.Threading", "System.Configuration", "System.Data", "System.Design", "System.DirectoryServices", "System.Drawing", "System.EnterpriseServices", "System.Management", "System.Messaging
System.Runtime", "System.Security", "System.ServiceProcesses", "System.Web"," "System.Windows

سؤالات خود را در همين "Thread" مطرح کنيد ...
--
يا حق ...
فرزاد اسحاقی

===============================

a7.gif

 
آخرین ویرایش:

saalek110

Well-Known Member
نکته ای که هست اینه که وقتی شما یک پروژه می سازید خودش بالای کدها می نویسد
using System;
و دیگه شما لازم نیست کلمه سیستم را جلوی کنسول بنویسید ولی اگر بنویسید هم باعث گزارش خطا نمی شود.
یعنی هر دو نوع زیر درست است:
کد:
Console.WriteLine("Hello, World");
System.Console.WriteLine("Hello, World");

من الان یک تست کردم . آمدم using System بالا را برداشتم. در این حالت وقتی جلوی کنسول کلمه سیستم بود اجرا می شد ولی وقتی کلمه سیستم را برمی داشتیم خطا می داد. چون دیگه بالای کدها هم یوزینگ سیستم وجود نداشت.
نتیجه گیری: وقتی بالای برنامه یوزینگ سیستم باشه می توانیم خلاصه تر و بدون کلمه سیستم بنویسیم. ولی سینتکس کامل همان با کلمه سیستم است. می دانید که کنسول زیرمجموعه سیستم است.

حالا شاید شما بگید نمیشه بالای برنامه بنویسیم:
کد:
using System.Console;
و دیگه جلوی writeline هیچی ننویسیم؟
جواب: نه نمی شود.
ولی این طوری می شود:
کد:
using ThatConsoleClass = System.Console;
using System.Collections.Generic;
using System.Text;

namespace teste_add
{
    class Program
    {
        static void Main(string[] args)
        {

            ThatConsoleClass.WriteLine("Hello, World");
            ThatConsoleClass.ReadLine();
        }
    }
}
ولی دیگه باید همه را همین طوری بنویسیم و خط زیر قابل قبول نیست:
کد:
Console.ReadLine();
این طور هم خطا نداد:
کد:
using ThatConsoleClass = System.Console;
using System;
using System.Collections.Generic;
using System.Text;

namespace teste_add
{
    class Program
    {
        static void Main(string[] args)
        {

            ThatConsoleClass.WriteLine("Hello, World");
            Console.ReadLine();
        }
    }
}
یعنی بالای برنامه هر دو نوع using را نوشتم و داخل برنامه هم دو نوع را استفاده کردم. ولی فکر نکنم کار خوبی باشه با این که خطا نداد.
 
آخرین ویرایش:

saalek110

Well-Known Member
آن 20 درس به شکل pdf شده در پست12 لینک دانلودش قرار داده شد.

===============

یک کتاب فارسی دیگر به منابع فارسی در پست 12 اضافه شد.
حجم : 300 کیلو

-----------------------
لینک به پست 12
-----------------------
 
آخرین ویرایش:

saalek110

Well-Known Member
===================
نکات محیط برنامه IDE
===================

برای اینکه شماره خط کنار کدها بیاید از منوی toos به option بروید و در پنجره option گزینه text editor را برگزینید .
در اینجا میشود با رفتن روی all language و زدن تیک line numbers در همه زبانها شماره خط را روشن کرد.
این قضیه برای اینکه سریع تر خطی را که خطا داده را پیدا کنیم مفید است.

------------------
از منوی view گزینه object browser را بزنید.
در این حال شما می توانید توابعی که در برنامه شما بکار رفته را مطالعه کنید.
همچنین قابلیت سرچ هم دارد.
روی هر متدی که کلیک کنید در یک پنجره کوچک مشخصات تابع شرح داده می شود.

==========================
شما وقتی دارید با یک پروژه کار می کنید اگر از منوی فایل گزینه new project را بزنید پروژه قبلی بسته می شود و پروژه جدید باز می شود. ولی می توانید از منوی فایل گزینه add project را بزنید. یعنی سولوشن می تواند شامل چند پروژه باشد. و در پنجره سولوشن اکسپلورر(من در 2005 کار می کنم اگر این پنجره احیانا باز نبود از منوی view گزینه solution explorer را بزنید) می بینید که پروژه ها زیر هم ردیف می شوند. ولی در اجرا ممکنه مثل من مشکل پیدا کنید که کدام اجرا شود. من برای حل این مشکل در پنجره سولوشن اکسپلورر روی نام پروژه دلخواه راست کلیک کردم و از منوی باز شده روی debug زدم و بعد اجرا را زدم.

b1.gif

همچنین از همین منوی کلیک راست روی پروژه می شود پروژه ای را لود یا آنلود کرد یا remove کرد و بعد به آسانی باز از منوی فایل و گزینه add و بعد existing project به سولوشن افزود.
 
آخرین ویرایش:

saalek110

Well-Known Member

==================
نکات ادیتوری برای راحتی بیشتر:
==================

کد زیر را ببینید:
کد:
# region myname
 # endregion myname
ما آمده ایم یک رجیون قابل زیپ شدن ساخته ایم. در 2005 (2003 هم شاید داشته باشد نمی دانم) وقتی رجیون می سازیم یک منها کنارش می آید که با زدن آن کد داخل این رجیون زیپ می شود و آن منها تبدیل به علامت بعلاوه می شود. که با زدن بعلاوه کد دوباره باز می شود.
بسته بودن رجیون هم هیچ تاثیری بر اجرای آن ندارد. یعنی وقتی اجرا را بزنیم کد داخل آن اجرا می شود.
همچنین وقتی ماوس را روی یک بسته زیپ شده نگه داریم کد داخل آن نمایش داده می شود. و همچنین با کلیک راست روی بسته باز نشده می شود کد داخل آن را کپی گرفت.
در پنجره کد وقتی کلیک راست می کنیم آخرین انتخاب این منو outlining است که با باز و بسته شدن این مجموعه ها مرتبط است.

========================
موضوعی که می خواهم بگویم شاید باید در قسمت مدیریت خطاها گفته بشه ولی چون باعث راحتی هم هست اینجا هم می گویم.
کد:
کد:
            try
            {
                //kari ke bayad anjam shavad vali momkeneh ba khata robero shavad
            }
            catch
            {
                // kari ke dar sorate rokh dadane khata bayad anjam shavad.
            }
در کامنت ها توضیح دادم. کدی در قسمت اول می گذاریم که در زمان اجرا باعث خطا شود. مثلا دسترسی به دیتابیسی که وجود ندارد. اگر خطا بدهد کد قسمت دوم اجرا می شود.

===============================

وقتی در پنجره کدنویسی راست کلیک کنیم. دو گزینه داریم برای افزودن اتوماتیک بعضی کدهای ضروری. من فرق این دو را هنوز نمی دانم. هر دو کدهای آماده را اضافه می کنند.
b2.gif

از منوی tools هم می توانید گزینه code snippets manager را بزنید تا پنجره زیر بیاید:

b3.gif

در عکس بالا مسیر فایل در هارد نشان داده شده. من یکی از این فایلها را با ادیتورم باز کردم . فکر کنم به زبان xml باشه. در این سایت توضیحات بیشتر را بخوانید.
 
آخرین ویرایش:

saalek110

Well-Known Member
==============
ریسورس چیست؟
==============
از :
http://209.85.129.104/search?q=cach...+کامپایل+پروژه+به+فایل+Dll&hl=en&ct=clnk&cd=6
فعلا تعطیله وگرنه:
http://www.iranvig.com/forum/showthread.php?tid=4299&pid=29738&mode=threaded

---------------------------------------------------------------------
سلام دوستان می خواتم بپرسم که داخل بعضی از سورس ها یه چیز هایی به نام res هست من چیزی دربارشون نمی دونم از شما دوستان خواهش دارم که یکمی توضیح بدین که اصلاً اینا چی هستن چیکار می کنن و چطوری میتونیم از اونا استفاده کنیم اگر هم کسی در این باره مقاله ای چیزی داره بزاره که خیلی عالی میشه همه هم استفاده می کنن مرسی

Programmer از ایران ویج:
سلام دوست عزیز!! :cool:
گوش کن که خیلی حرف دارم :

1 - این Res.* اصلاً چی هست؟
res مخفف کلمهء Resources است.
به معنای منابع که اشاره دارد به منابعی غیرِ از کد برنامه که در برنامه استفاده می شوند.
مثلاً فرض بفرمایید که شما تعدادی تصویر JPG را در برنامهء خود استفاده کرده اید و نمی خواهید این تصاویر را همراه فایل Executable برنامه به کسی تحویل دهید.
بلکه در عوض می خواهید این عکس را با فایل Exe برنامه پیوند بزنید.
حتماً متوجه اید که این جوری خیلی حرفه ای تره!!
همین کار را در مورد سایر اطلاعاتی که در برنامه به صورت منابع مورد ارجا واقع می شوند می توان انجام داد - مثلا:
شما می توانید فایل های موسقی، رشته های کاراکتری، عکس یا تصویر، آیکون، اطلاعات مربوط به نگارش و حق کپی رایت(که در ایران زیاد به درد نمی خورد) و همچنین هر منبع دلخواهی را به فایل Exe پیوند بزنید!! (خیلی جالبه نه؟)
res در واقع فایلی است حاوی منابعی که شما می خواهید به برنامه پیوند بزنید که به صورت کامپایل شده در آمده و آماده است که با exe لینک شود.
در اغلب محیط های برنامه نویسی تحت ویندوز نام و مشخصات منابع پیوندی
در فایلی با پسوند rc ذخیره می شود. و نتیجهء کامپایل شدهء آن در فایل Res
محتویات فایل res کامپایل شده است و به صورت خاصی در آمده تا قابل پیوند زدن به فایل exe dll یا obj باشد و قابل درک و تغییر دادن نیست.
برای تعیین محتوای آن باید فایل rc همراه آن را تغییر داد این فایل محتوایش قابل درک است سپس در هنگام ترجمه پیش از کامپایل برنامه ای به نام کامپایلرِ منبع از روی این فایل rc فایل res را می سازد.
سپس بعد از کامپایل برنامه linker این فایل را با فایل ترجمه شده (dcu, obj, ...) را با res پیوند می دهد تا فایل exe یا dll نتیجه ساخته شود.
از منابع خصوصا برای پشتیبانی از چند زبانی هم استفاده می شود.
 
آخرین ویرایش:

saalek110

Well-Known Member
=================
اجرای مرحله به مرحله برنامه
=================

شما در کنار کدهایی که می نویسید در سمت چپ می توانید با کلیک یک بریک پوینت ایجاد کنید.

b4.gif
با کلیک هم می توانید بردارید. حالا اگر اجرا کنید برنامه را می بینید که تا بریک پوینت اجرا می شود و مقدار متغیرها هم در پنجره پایین نمایش داده می شود. این hh که می بینید برنامه از کاربر خواسته و حین اجرا من دادم.

b5.gif
حالا بریک پوینت را برداید و با اینها
b6.gif

کار کنید. هر کدام تا کجا اجرا می کند؟ پنجره پایین هم باز متغیر را نشان می دهد.
 
آخرین ویرایش:

saalek110

Well-Known Member
========
کار کنسولی
========

سلام و تشکر از دوستان.
عرض شود که فکر نکنم منبع فارسی دیگری پیدا بشود یا اگر جایی هست من سراغ ندارم و من می خواهم تمرین خود را شروع کنم. منابع فارسی این تاپیک فعلا این ها بود که در پست های قبلی معرفی شد. امیدوارم خیلی خوب تابحال پیش رفته باشید. من خودم درگیر بودم و زیاد نتوانستم وقت بگذارم. هر نکته ای هم که یاد گرفتید اگر توانستید اینجا بزنید. من هم چند نکته یاد گرفتم که اینجا پست می کنم.

من دیروز کتاب:
Introduction to C# Programming
for the Microsoft® .NET Platform
را که لینک دانلودش در قسمت کتابهای انگلیسی تاپیک هست صد صفحه اولش را خواندم که قسمتی مربوط به کنسول است و کدهای این فصلها را می گذارم. شما هم اگر نکته ای داشتید اضافه کنید.

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

اولین نکته راجع به بیپ :
کد:
Console.Beep(350, 500);
            Console.Beep(70, 100);
            Console.Beep(1000, 200);

            Console.Beep();

در 3 خط اول من آمدم فرکانس و بعد طول مدت ادامه داشتن صدا را داده ام. فرکانس از 32 تا 32 هزار است. اگر عددی خارج این رنج بدهید خودش با یک خطا مقدار دقیق را می دهد. مثلا فرکانس را 3 بدهید و اون میگه رنج صحیح چنده. طول مدت را هم اعداد مختلفی بدهید تا ببینید واحدش چیه.

در خط بعدی به شکل ساده بیپ استفاده شده و بدون فرکانس و طول مدت صدا.

کد بعدی:
کد:
Console.WriteLine("Hello, World");
            Console.Write("s");
            Console.Write("d");

در خط اول hello world چاپ میشه و می رود خط بعدی ولی با استفاده از write به جای writeline بعد چاپ دیگه خط بعدی نمی رود.

کد بعدی :
کد:
Console.WriteLine("The sum of {0} and {1} is {2}", 100, 130,100 + 130);
            Console.WriteLine("Left justified in a field of width 10: {0,-10}", 99);
            Console.WriteLine("Right justified in a field of width 10:{0,10}", 99);
کدهای بالا را اجرا کنید تا شکل چاپ را ببینید .
من خط:
Console.ReadLine();
را بعد این 3 خط اضافه می کنم. چون در 2005 اگر این خط نباشه صفحه سریع می رود و نمیشه نتیجه را دید.
نتیجه اجرا چنین است.
b7.gif

که خودتان علت چنین نمایشی را توجیه کنید.

کد بعدی :
کد:
//  C Display the number as currency, using the local currency symbol and conventions.
            // D Display the number as a decimal integer.
            // E Display the number by using exponential (scientific) notation.
            // F Display the number as a fixed-point value.
            // G Display the number as either fixed point or integer, depending on which
            // format is the most compact.
            // N Display the number with embedded commas.
            // X Display the number by using hexadecimal notation
            Console.WriteLine("Currency formatting - {0:C} {1:C4}", 88.8, -888.8);
            Console.WriteLine("Integer formatting - {0:D5}", 88);
            Console.WriteLine("Exponential formatting - {0:E}", 888.8);
            Console.WriteLine("Fixed-point formatting - {0:F3}", 888.8888);
            Console.WriteLine("General formatting - {0:G}", 888.8888);
            Console.WriteLine("Number formatting - {0:N}", 8888888.8);
            Console.WriteLine("Hexadecimal formatting - {0:X4}", 88);
            Console.ReadLine();
نتیجه اجرا چنین است.
b8.gif

من سعی می کنم بقیه نکات مربوط به کنسول را هم در همین پست بگویم.
.
====================
در همان سورس های msdn که در پست سورسها گذاشتیم در قسمت 2005 آن کدهای کنسولی را بررسی می کنیم.

کد اول:
کد:
Console.WriteLine("The default title of the Console window is the path to this executable");
            Console.Write("Please enter the new Title for the Console Window:");
            Console.Title = Console.ReadLine();
            Console.ReadLine();
در کد بالا اول گفته تایتل دیفالت همان آدرس فایل قابل اجرا است و بعد با write که به خط بعدی نمی رود چیزی نوشته و با readline در همان خط چیزی پرسیده که در تایتل صفحه گذاشته. خط آخر این 4 خط هم که مثل قبل برای این است که برنامه تا دیدن ما خارج نشود.
-------------------
برای تابع پاک کردن برنامه زیر را من ساختم تا اثر این تابع را ببینید.
کد:
            System.Console.WriteLine("Hello, inter for clear");
            Console.ReadLine();
            Console.Clear();
            Console.ReadLine();
که با زدن اینتر تابع عمل می کند و صفحه پاک می شود. با اینتر بعدی برنامه از حالت اجرا خارج می شود.
-------------------
برای تغییر اندازه پنجره کد زیر را msdn داده که خودتان تحلیل کنید.
کد:
Console.WriteLine("You can now change the size of the Window");
            Console.WriteLine();

            int newHeight;
            int newWidth;

            Console.Write("Enter the Height in Pixels(40 is a good value):");
            try
            {
                newHeight = Int32.Parse(Console.ReadLine());
            }
            catch
            {
                Console.WriteLine("You entered an incorrect value. I will set the height to 40 for you");
                newHeight = 40;
            }
            Console.WriteLine();

            Console.Write("Enter the Width in Pixels (100 is a good value):");
            try
            {
                newWidth = Int32.Parse(Console.ReadLine());
            }
            catch
            {
                Console.WriteLine("You entered an incorrect value. I will set the width to 100 for you");
                newWidth = 100;
            }

            // Make sure the window is not set larger than possible
            if (newHeight > Console.LargestWindowHeight)
                newHeight = Console.LargestWindowHeight;

            if (newWidth > Console.LargestWindowWidth)
                newWidth = Console.LargestWindowWidth;

            Console.WindowHeight = newHeight;
            Console.WindowWidth = newWidth;

            Console.Write("New window size is: " + Console.WindowHeight + " x " + Console.WindowWidth);
            Console.WriteLine();
            Console.WriteLine("Press Enter to continue");
            Console.ReadLine();
------------------------------
کد مربوط به رنگ بک گراند و فورگراند:
کد:
            Console.WriteLine("You can also change the Background and Foreground colors of the Console using one of the following color values:");
            Console.WriteLine();

            foreach (string colorName in Enum.GetNames(typeof(ConsoleColor)))
            {
                Console.Write(colorName + ", ");
            }

            Console.WriteLine();

            Console.Write("Enter the new Background Color:");
            try
            {
                string newBackgroundColor = Console.ReadLine();
                Console.BackgroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), newBackgroundColor, true);
            }
            catch
            {
                Console.Write("You entered an incorrect color choice. I will set the background to Green for you");
                Console.BackgroundColor = ConsoleColor.Green;
            }

            Console.Write("Enter the new Foreground Color:");

            try
            {
                string newForegroundColor = Console.ReadLine();
                Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), newForegroundColor, true);
            }
            catch
            {
                Console.Write("You entered an incorrect color choice. I will set the foregound to Yellow for you");
                Console.ForegroundColor = ConsoleColor.Yellow;
            }

            Console.Clear();
            Console.WriteLine("You can see how the new colors are applied");
            Console.WriteLine();
            Console.WriteLine("Press Enter to continue");
            Console.ReadLine();
            Console.BackgroundColor = ConsoleColor.Black;
            Console.ForegroundColor = ConsoleColor.White;
            Console.Clear();
            Console.ReadLine();
-----------------------------
از نکات msdn فقط این چند خط کد مانده که من نفهمیدم کارش چیه:
کد:
static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
		{
			Console.WriteLine("Now CTRL+C is used as the cancel key");
			Console.ReadLine();
			e.Cancel = true;
		}

پایان این دمو از msdn
==================
 
آخرین ویرایش:

saalek110

Well-Known Member
نقل از :
http://www.mau.ac.ir:5000/vb/showthread.php?p=169
---------------------------------------------------------------
انواع داده ای در سی شارپ

سیستم انواع تعریف شده در c# عبارتند از :

نوع مقدار- نوع ارجاع – و نوع اشاره گر

انواع مقدار
شامل نوع های ساده bool,char,sbyte,short,int,long,byte,ushort,uint,ul ong,float,double,decimal

ومجموعه ها (Enums) و ساختارها (Structs) می باشد.

در نوع های مقدار (value types), متغیر شامل مقدار می باشد و بر روی پشته ذخیره می شود – مقدار اولیه این نوع ها شامل false یا 0 یا ’0/’ میباشد

در مثال زیر نحوه تعریف دو متغیر از نوع int و مقدار دهی آن را مشاهده می کنید :
کد:
  int i=17; 
  int j=i;
انواع ارجاع
شامل : کلاس ها و اینترفیس ها و آرایه ها و نماینده ها Delegates می باشد

در نوع های ارجاع , متغیر شامل ارجاع می باشد و بر روی توده heap قرار می گیرد

و مقدار اولیه آن (null) می باشد

به طور مثال:
کد:
string s = “Hello”;    
     string s1=s;
که در آن s1 به hello رجوع می کند


سي شارپ عناصري را كه بكار مي گيرد همانند اعداد و كاراكترها ، به صورت نوع ها (Types) طبقه بندي مي كند.

اين انواع شامل موارد زير مي شوند :
نوع هاي پايه ايي از پيش تعريف شده مانند اعداد و غيره.
نوع هاي تعريف شده توسط كاربر كه شامل STRUCT ها و ENUM ها مي شوند.

----- نویسنده و ارائه دهنده : حمید رضا پرورش ------
 
آخرین ویرایش:

saalek110

Well-Known Member
سالک: 3 ماهی ادامه کار به تاخیر افتاد.
خیلی ها کدنویسی پایه را مسلطند و این قسمت را به کتابهایی که معرفی کردیم رجوع دادیم. چیزهایی مثل متغیر تابع و کلاس. اما من هم تلاش کردم که این قسمت ها را بازگویی کنم . در یک فروم دیگر این کار را کردم. که در پست بعدی لینک می دهم.
اما در ادامه کار به مطالبی می پردازیم که بعد این قسمتها قرار دارد. که قسمتی را از سایتهای فارسی و قسمتهایی از سایتها و فرومهای خارجی. و کتابهای مرجع مختلف.
 

saalek110

Well-Known Member
سالک: مطالب و لینکهای این پست از تاپیک آموزش سی شارپ - لیست مطالب و لینکها می باشد.
=======================
=======================
بنام خدا.
من می خواهم در اینجا از ابتدا به تمرین و آموزش سی شارپ بپردازم.
چون می خواهم با عکس بیشتر توضیح بدهم و حجم مطالب هم خیلی زیاد است در این تاپیک به شکل لینک صحبت می کنم. یعنی آموزشها را در تاپیک های دیگه می گویم و اینجا لینک می گذارم. شما از این تاپیک شروع کنید و به ترتیب جلو بروید.

مستقیما با تمرین شروع می کنیم و مباحث تئوری و فنی تر را بعد مدتی مهارت یافتن بحث می کنیم.

من محیط کارم ویژوال استودیو 2005 است.

نکته:
در تاپیکها وقتی من می گویم در سی پلاس این طور بود... منظورم آن سی پلاس است که با توربو سی من تمرین کرده ام و منظورم سی پلاس دات نت نیست. من فعلا سی پلاس دات نت اصلا کار نکرده ام.

من خیلی سعی کردم تا تاپیک ها به ترتیب درستی چیده شود. ولی باز ممکن است که شما با رفتن به تاپیک های بعدی زودتر به نتیجه برسید. من سعی کردم اول تمرین باشه بعد مفاهیم. شاید شما ترتیب عکس مورد نظر شما باشد. در این مورد خاص حتما خودتان ترتیب خواندن تاپیک ها را انتخاب کنید.

-----------------------------------------------------------------------------

از:
http://www.parsiforums.com/vb/showthread.php?t=3305
------------------------------------------------------------------
Thinker :
آشنایی با #c
مايكروسافت در مصاف با جاوا، بدنبال ارائه يك زبان كامل بود كه سايه جاوا را در ميادين برنامه نويسی كم رنگ تر نمايد. شايد بهمين دليل باشد كه #C را ايجاد كرد. شباهت های بين دو زبان بسيار چشمگير است. مايكروسافت در رابطه با ميزان استفاده و گسترش زبان فوق بسيار خوشبين بوده و اميدوار است بسرعت زبان فوق گستردگی و مقبوليتی به مراتب بيشتر از جاوا را نزد پياده كنندگان نرم افزار پيدا كند.
با توجه به نقش محوری اين زبان، از آن بعنوان مادر زبانهای برنامه نويسی در دات نت نام برده می شود. مورد فوق به تنهائی، می تواند دليل قانع كننده ای برای يادگيری اين زبان باشد، ولی دلايل متعدد ديگری نيز وجود دارد كه در ادامه به برخی از آنها اشاره می گردد.

مطرح شدن بعنوان يك استاندارد صنعتی
انجمن توليدكنندگان كامپيوتر اروپا (ECMA) زبان #C را در سوم اكتبر سال 2001 بعنوان يك استاندارد پذيرفته (ECMA-334) و بدنبال آن تلاش های وسيعی برای كسب گواهی ISO نيز انجام شده است. زبان فوق در ابتدا توسط شركت مايكروسافت و بعنوان بخشی از دات نت پياده سازی و بلافاصله پس از آن توسط شركت های اينتل، هيوليت پاكارد و مايكروسافت مشتركا، جهت استاندارسازی پيشنهاد گرديد.
زبان #C بگونه ای طراحی شده است كه نه تنها وابستگی به يك Platform خاص را ندارد، بلكه در اغلب موارد وابستگی RunTime نيز ندارد. كامپايلر #C می تواند بر روی هر نوع معماری سخت افزاری طراحی و اجرا گردد. در برخی از نسخه های اوليه كامپايلر زبان فوق كه توسط برخی از شركت های جانبی ارائه شده است، كدهای #C را به بايت كدهای جاوا كمپايل می كنند. يكی از چنين كامپايلرهائی را می توان در سايت Halcyonsoft.com مشاهده نمود. بنابراين كدهای #C براحتی قابليت حمل بر روی محيط های متفاوت را دارا خواهند بود.
مشخصات تعريف شده زبان #C با ساير استاندارهای تعريف شده ECMA نظير (ECMA-335) CLI (Common Language Infrastructure) بخوبی مطابقت می نمايند. CLI قلب و روح دات نت و CLR(Common Language Runtime) است. اولين نسخه از كامپايلر زبان #C كه از CLI استفاده می كند، NET Framwork. مايكروسافت است.
با توجه به موارد گفته شده، مشخص می گردد كه اين زبان بسرعت بسمت استاندارد شدن حركت و با تاييد استانداردهای مربوطه از طرف انجمن های معتبر بين المللی و حمايت فراگير شركت های معتبر كامپيوتری در دنيا مسير خود را بسمت جهانی شدن بخوبی طی می نمايد.

#C چيست ؟
طراحان زبان #C با تاكيد و الگوبرداری مناسب از مزايای زبانهائی نظير ++C، C و جاوا و ناديده گرفتن برخی از امكانات تامل برانگيز و كم استفاده شده در هر يك از زبانهای فوق، يك زبان برنامه نويسی مدرن شی گراء را طراحی كرده اند. در مواردی، برخی از ويژگی های استفاده نشده و درست درك نشده در هر يك از زبانهای گفته شده، حذف و يا با اعمال كنترل های لازم بر روی آنها، زمينه ايجاد يك زبان آسان و ايمن برای اغلب پياده كنندگان نرم افزار بوجود آمده است. مثلا C و ++C می توانند مستقيما با استفاده از اشاره گرها عمليات دلخواه خود را در حافظه انجام دهند. وجود توانائی فوق برای نوشتن برنامه های كامپيوتری با كارائی بالا ضرورت اساسی دارد. اما در صورتيكه عملياتی اينچنين بدرستی كنترل و هدايت نگردند، خود می تواند باعث بروز مسائل (Bugs) بيشماری گردد.
طراحان زبان #C، با درك اهميت موضوع فوق، اين ويژگی را كماكان در آن گنجانده ولی بمنظور ممانعت از استفاده نادرست و ايجاد اطمينان های لازم مسئله حفاظت نيز مورد توجه قرار گرفته است. جهت استفاده از ويژگی فوق، برنامه نويسان می بايست با صراحت و به روشنی خواسته خود را از طريق استفاده از Keyword های مربوطهاعلان نمايند( فراخوانی يك توانائی و استفاده از آن).
#C بعنوان يك زبان شی گراء عالی است. اين زبان First-Class را برای مفهوم Property (Data Member) بهمراه ساير خصائص عمومی برنامه نويسی شی گراء حمايت می كند. در C و ++C و جاوا يك متد get/set اغلب برای دستيابی به ويژگی های هر Property استفاده می گردد. CLI همچنان تعريف Property را به متدهای get/ser ترجمه كرده تا بدين طريق بتواند دارای حداكثر ارتباط متقابل با ساير زبانهای برنامه نويسی باشد. #C بصورت فطری Events ، Declared Value، Reference Type ، Operator Overloading را نيز حمايت می كند.

كد مديريت يافته
با استفاده از نسخه پياده سازی شده #C توسط مايكروسافت، می توان همواره كد مديريت يافته ای را توليد كرد. يك برنامه #C پس از كامپايل، بصورت برنامه ای در خواهد آمد كه شامل دستورالعمل های تلفيق شده ( CIL (Common Intermediate Language است (درست بر خلاف دستورالعمل های مختص يك ماشين خاص). CIL (گاها با نام MSIL(Microsoft Intermediate Language) با به اختصار IL نيز ناميده می شود ) ، در مفهوم مشابه بايت كدهای جاوا بوده و شامل مجموعه ای از دستورالعمل های سطح پايين قابل فهم توسط تكنولوژی مبتنی بر CLI نظير CLR مايكروسافت خواهد بود. اين برنامه ها بدين دليل كد مديريت يافته، ناميده می شوند كه CLR مسئوليت تبديل اين دستورالعمل ها به كدهای قابل اجرا برروی ماشين و ارائه اغلب سرويس های اساسی برای كدينگ نظير : Garbage Collection، مديريت Heap و عمر مفيد يك Object و يا Type Verification را فراهم می كند.

روش يادگيری #C
يادگيری اين زبان برای افراديكه دارای سابقه آشنائی با يكی از زبانهای برنامه نويسی ++C، C و يا جاوا باشند كار مشكلی نخواهد بود، حتی افراديكه دارای آشنائی اوليه با جاوااسكريپت و يا ديگر زبانهای برنامه نويسی نظير ويژوال بيسك می باشند، امكان پذير و راحت خواهد بود. برخی از برنامه نويسان حرفه ای بر اين باور هستند كه #C نسبت به VB.NET با اقبال بيشتر و سريعتری مواجه خواهد شد، چراكه #C نسبت به ويژوال بيسك خلاصه تر است. حتی برنامه های بزرگ و پيچيده ای كه توسط #C نوشته می گردند خواناتر، كوتاه و زيبا خواهند بود. برخی از ويژگی های ارائه شده در #C نظير Unsigned Integer، Operator OverLoading و امنيت بيشتر Type ها، در VB.NET وجود نداشته و اين امر می تواند دليلی بر فراگيرتر شدن #C نسبت به VB.NET نزد برنامه نويسان با تجربه باشد.
برای يادگيری هر يك از زبانهای حمايت شده در دات نت، می بايست از BCL (Basic Class Library) مربوط به NET Framework. شروع كرد. #C خود صرفا دارای ۷۷ کلمه کليدی يا Keyword بوده كه برای اكثر برنامه نويسان غريب نخواهند بود. در مقابل BCL، دارای ۴۵۰۰ كلاس و تعداد بيشماری متد و Property است كه برنامه نويسان #C، می توانند از آنها برای انجام عمليات دلخواه خود استفاده نمايند. شايد يكی از مسائل قابل توجه جهت يادگيری اين زبان برای برخی از برنامه نويسان حرفه ای عدم وجود برخی از ويژگی ها و امكاناتی باشد كه در گذشته و از طريق ساير زبانهای استفاده شده، بخدمت گرفته می شدند. مثلا عدم وجود امكاناتی جهت توارث چندگانه (MI) سلسله مراتبی يك شئ.

خلاصه
بدون شك فراگيری و تسلط بر زبان #C بمنزله كسب يك پتانسيل با ارزش بوده كه ثمرات آن برای برنامه نويسان در حال و آينده ای نه چندان دور بيشتر هويدا خواهد شد. استاندارد بودن و وجود كتابخانه ای مملو از كلاس اين اطمينان را بوجود خواهد آورد كه با فراگيری زبان فوق و كسب، مهارت های لازم، به يك توانائی فرا محيطی جديد دست پيدا خواهيم كرد كه امكان استفاده از آن بر روی محيط های متفاوت وجود خواهد داشت. ويژگی ها و قابليت های بيشمار اين زبان از جمله دلايل قانع كننده ديگری است كه فراگيری آن را توجيه پذير و منطقی می كند.

------------------------------------------------------------------------
ابتدا باز کردن ویژوال استودیو و کمی شرح محیط کار:
شروع کار با ویژوال استودیو دات نت 2005

ابتدا در حالت کنسولی تمرین می کنیم. پس باید طرز باز کردن یک پروژه کنسولی را بلد باشید.
در اولین تاپیک من با شکل این کار را آموزش می دهم.
باز کردن برنامه و ساخت یک پروژه کنسولی
در تاپیک بالا کمی با محیط برنامه آشنا شدید. حالا باید اولین برنامه خود را بنویسید و اجرا کنید.
ساختن اولین برنامه و اجرای آن


حال که اولین برنامه را نوشتیم و اجرا کردیم. خوب است به نکات گرامری سی شارپ بپردازیم.
یعنی چگونه نوشتن مجاز است و چگونه نوشتن باعث گزارش خطا توسط برنامه خواهد بود.
نکات گرامری و سینتکسی سی شارپ



برای مقداری آشنایی و تسلط بیشتر بر محیط کار به تاپیک زیر مراجعه کنید. کلا رفاه زیادی در این محیط ایجاد شده برای هر کاری . در تاپیک زیر با چگونگی کار با سولوشن ها - پروژه ها (مثل کار با چند پروژه با هم) - و کار با فایلها آشنایی پیدا می کنیم .
آشنایی با ابزارهای محیط کار - سولوشن - پروژه

------------------------------------------------------------------

حالا شما طرز ایجاد پروژه را می دانید و طرز افزودن کدها را هم می دانید.
حالا می خواهیم تمرین کدنویسی کنیم. با کارهای ساده شروع می کنیم.
اولین چیزی که در برنامه نویسی به ذهن من می رسد متغیر است.
طبق تعریفی ساده متغیر محلی از حافظه است که می توانی چیزی آنجا ذخیره کنیم.(البته این تعریف من است)
در تاپیک زیر با انواع متغیرها و نکات اولیه کار با آنها بیشتر آشنا می شویم:
انواع متغیر و نکات عمومی متغیرها

در تاپیک زیر هم می آموزیم که چه اسم هایی می توانیم روی متغیرهای خود بگذاریم و چه اسمهایی غیرمجاز است:
قوانین نام گذاری متغیرها (تاپیکهای وابسته به این تاپیک: C# Keywords )

برای آشنایی با متغیرهای عددی به این تاپیک مراجعه کنید:
متغیرهای عددی

-------------------------
درتاپیک زیر هم به تمرین با متغیر رشته ای می پردازیم:
متغیر رشته ای

متغیر کنستانت(مقدار ثابت):
متغیر کنستانت
-------------------------
نکات تکمیلی راجع به متغیر ها :
نکات تکمیلی راجع به متغیر ها

آرایه :
آرایه

---------------------------------------------------------------------------------

شرط :
شرط یعنی این که کدهایی بنویسیم که برنامه با توجه به شرایط کاری و در صورت نبودن آن شرایط کار دیگری را انجام دهد.
در تاپیک زیر به بررسی و تمرین این قضیه می پردازیم:
شرط و کدنویسی آن
دستور Switch هم نوعی شرط است.به مطالب آن در این تاپیک توجه کنید:
دستور Switch
-------------------
حلقه :
منظور از حلقه این است که کاری کنیم کدی چند بار اجرا شود.
در تاپیک زیر به بررسی و تمرین این قضیه می پردازیم:
حلقه و کدنویسی آن


استفاده از حلقه ي foreach

------------------------------------------------------------------------------

کامپایل بیرون محیط ویژوال استودیو و توسط کامند پرومپت:
command promp- working

نکات ادیتوری برای راحتی بیشتر:
نکات ادیتوری برای راحتی بیشتر

در تاپیک زیر مهارت بیشتری با توابع کنسولی پیدا می کنیم:
توابع کنسولی


نکات متد WriteLine و Write:
نکات WriteLine و Write

نکاتی راجع به main :
نکات main

نکاتی راجع به namespace :
نکاتی راجع به namespace

نکات مربوط به using :
نکاتی راجع به using

--------------------------------------------------------------------------

تابع :
در تاپیک های زیر با مفهومی به نام تابع آشنا می شویم. طرز تعریف آن و طرز صدا کردن آن و ورودی و خروجی و غیره.
تابع - طرز تعریف آن و مفاهیم اولیه
ورودی دادن به تابع به حالتهای دیگر
نکات تکمیلی تابع

Delegates

-------------------------------------------------------------------------------------

استراکت:
استراکت و کار با آن



کلاس:
حالا که می دانید تابع چیست و کار با متغیر را بلدید موقع آن است که به سراغ کلاس برویم:

کلاس و کار با آن
البته می توانیم کلاس را کنار کلاس حاوی main در فایل program.cs نگه داریم ولی همچنین می توان کدهای کلاس را برای نظم بیشتر در یک فایل کلاس قرار داد. در تاپیک زیر به روش انجامش این کار می پردازیم:
قرار دان کدهای کلاس در یک فایل کلاس

از انواع متدهای کلاس می توانیم متد سازنده را نام ببریم.بحث:
سازنده کلاس

از انواع دیگر متدهای یک کلاس می توان به متد مخرب اشاره کرد.بحث:
متد مخرب کلاس

مقاله ای راجع به تعریف و آشنایی با :
Inheritance
Encapsulation
Polymorphism
Abstraction
Interface
در این تاپیک:
شئ گرایی در #c

بعد از اینکه یاد گرفتیم چگونه یک کلاس بسازیم نوبت وراثت در کلاسها می شود:
وراثت گام 1
وراثت گام 2

-------------------------------------------------------------------------

انوم:
enum

کار با فایل:
کار با فایل
 
آخرین ویرایش:

saalek110

Well-Known Member
در سایت زیر:
http://cslearning.tripod.com/cs/compCs_2_1.htm
مطالب زیر به چشم می خورد:
b9.gif

که در این پست Attribute را نقل می کنم. (قسمت اول)

=======================================

صفات و استفاده از آنها

در اين درس با نحوه استفاده از صفتها در زبان C# آشنا خواهيد شد. اهداف ما در اين درس به شرح زير است :
صفت ها چه هستند و چرا از آنها استفاده مي‌کنيم

استفاده از صفتهای تک پارامتری و چند پارامتری

انواع پارامترهاي صفت (پارامترهاي Named و Positional)

Target های صفتها



صفتها در حقيقت اطلاعات توضيحی هستند که مي‌توانيد آنها را به برنامه‌های خود بيفزاييد. صفتها را مي‌توان برای کليه عناصر برنامه از قبيل کلاسها، واسطها، اسمبلی ها و ... مورد استفاده قرار داد. از اين اطلاعات مي‌توان برای موارد متنوعی در زمان اجرای برنامه استفاده نمود. برای مثال مي‌توان به صفتی مانند DllImportAttribute اشاره کرد که امکان برقراری ارتباط با توابع کتابخانه‌ای Win32 را فراهم مي‌نمايد. همچنين صفتهايي نيز وجود دارند که برنامه‌نويس يا توسعه دهنده برنامه را در امر توليد برنامه ياری مي‌نمايند. برای مثال مي‌توان به صفت ObsoleteAttribute اشاره کرد که با استفاده از آن، در زمان کامپايل برنامه پيغامی برای برنامه نويس نمايش داده مي‌شود و مشخص مي‌کند که متدی خاص مورد استفاده قرار نگرفته و يا ديگر مورد استفاده نيست. همچنين هنگاميکه با فرمهای ويندوز کار مي‌کنيم، صفتهای بسياری وجود دارند که امکان استفاده از اين فرمها را فراهم کرده و باعث مي‌شوند تا اطلاعات مربوط به اين عناصر در property فرم ظاهر شوند. يکی ديگر از موارد استفاده از صفتها در مسايل امنيتی اسمبلي‌های .Net است. برای مثال صفتهايي وجود دارند که باعث جلوگيری از فراخواني‌های غير مجاز مي‌شوند، بدين معنی که تنها اجازه فراخوانی را به متدها يا اشيايي مي‌دهند که قبلا تعريف شده و مشخص شده باشند.

يکی از علتهای استفاده از صفتها آنست که، اغلب سرويسهايي را که آنها برای کاربر فراهم مي‌نمايند، بسيار پيچيده است و با کدهای معمولی نمي‌توان آنرا را بدست آورد. از اينرو استفاده از صفتها در بسياری از موارد ضروری و اجتناب ناپذير است. همانطور که خواهيد ديد، صفتها به برنامه‌هاي ما Metadata اضافه مي‌نمايند. پس از کامپايل برنامه‌های C#، فايل اسمبلی برای آن ايجاد مي‌گردد که اين اسمبلی معمولا يا يک فايل اجرايي است و يا يک Dll است. توصيف اسمبلی، در Metadata ي مربوط به آن قرار مي‌گيرد. طی پروسه‌ای تحت عنوان Reflection، صفت يک برنامه از طريق فايل Metadata ي موجود در اسمبلی آن قابل دسترس مي‌گردد. .(برای آشنايي بيشتر با اسمبلی و Metadata مي‌توانيد به " کامپايل يک برنامه سی شارپ " در همين سايت مراجعه نماييد.) در حقيقت صفتها، کلاسهايي هستند که مي‌توانيد آنها را با زبان C# توليد کرده و جهت افزودن اطلاعاتی توضيحی به کد خود، از آنها استفاده نماييد. اين اطلاعات در زمان اجرای برنامه از طريق Reflection قابل دسترسی هستند.

در اين درس با روش استفاده از صفتها و چگونگی ارتباط دادن آنها با عناصر مختلف برنامه آشنا خواهيد شد.


مفاهيم اوليه درباره صفتها

صفتها را معمولا قبل از اعلان عنصر مورد نظر در برنامه قرار مي‌دهند. اعلان صفتها بدين صورت است که نام صفت درون دو براکت قرار مي‌گيرد.

[ObsoleteAttribute]
استفاده از کلمه Attribute در اعلان صفت الزامی نيست، از اينرو اعلان زير با اعلان فوق يکسان است :

[Obsolete]
همچنين صفتها مي‌توانند دارای پارامتر نيز باشند که با استفاده از آنها خواص بيشتری را در اختيار برنامه قرار مي‌دهند. در مثال 1-16 موارد متنوعی از استفاده صفت ObsoleteAttribute را مشاهده مي‌نماييد.

مثال 1-16 :‌ نحوه استفاده از صفتها
کد:
using System;

class BasicAttributeDemo
{
    [Obsolete]
    public void MyFirstDeprecatedMethod()
    {
        Console.WriteLine("Called MyFirstDeprecatedMethod().");
    }

    [ObsoleteAttribute]
    public void MySecondDeprecatedMethod()
    {
        Console.WriteLine("Called MySecondDeprecatedMethod().");
    }

    [Obsolete("You shouldn't use this method anymore.")]
    public void MyThirdDeprecatedMethod()
    {
        Console.WriteLine("Called MyThirdDeprecatedMethod().");
    }
[COLOR="SeaGreen"]
    // make the program thread safe for COM[/COLOR]
    [STAThread]
    static void Main(string[] args)
    {
        BasicAttributeDemo attrDemo = new BasicAttributeDemo();

        attrDemo.MyFirstDeprecatedMethod();
        attrDemo.MySecondDeprecatedMethod();
        attrDemo.MyThirdDeprecatedMethod();
    }
}
همانطور که در مثال 1-16 نيز مشاهده مي‌شود، صفت Obsolete در فرمهای مختلف مورد استفاده قرار گرفته است. اولين محلی که از اين صفت استفاده شده است، متد MyFirstDeprecatedMethod() و پس از آن در متد MySecondDeprecatedMethod() است. تنها تفاوت استفاده در اين دو حالت آنست که در متد دوم صفت با نام کامل يعنی به همراه کلمه Attribute مورد استفاده قرار گرفته است. نتيجه هر دو اعلان يکسان است. همانطور که گفته بوديم، صفتها مي‌توانند دارای پارامتر نيز باشند :
کد:
[Obsolete("You shouldn't use this method anymore.")]

    public void MyThirdDeprecatedMethod()

    ...
مثال 1-16 شامل صفت ديگری نيز مي‌باشد. اين صفت STAThreadAttribute است که معمولا در ابتدای کليه برنامه‌های C# و قبل از آغاز متد Main() قرار مي‌گيرد. اين صفت بيان مي‌دارد که برنامه C# مورد نظر مي‌تواند با کد مديريت نشده COM از طريق Simple Threading Apartment ارتباط برقرار نمايد. استفاده از اين صفت در هر برنامه‌ای مي‌تواند مفيد باشد، چراکه شما بعنوان برنامه نويس هيچ‌گاه اطلاع نداريد که آيا کنابخانه ثالثی که از آن استفاده مي‌کنيد، قصد برقراری ارتباط با COM را دارد يا نه؟ (در صورتيکه با برخی از اصطلاحات بکار رفته آشنايي نداريد اصلا نگران نشويد. در اينجا هدف تنها نشان دادن موارد استفاده از صفتهاست.)

صفتها مي‌توانند دارای چندين پارامتر باشند. در مثال 2-16، استفاده از دو پارامتر برای يک صفت نشان داده شده است.

مثال 2-16
کد:
using System;
public class AnyClass 
{
    [Obsolete("Don't use Old method, use New method", true)]
    static void Old( ) { }
   
    static void New( ) { }
   
    public static void Main( ) 
    {
        Old( );
    }
}
همانطور که در مثال 2-16 مشاهده مي‌کنيد، صفت مورد استفاده دارای دو پارامتر است. پارامتر اول که يک جمله متنی است و همانند مثال 1-16 عمل مي‌کند. پارامتر دوم نيز بيان کننده نوع پيغامی است که اين صفت در هنگام کامپايل توليد مي‌کند. در صورتيکه اين مقدار برابر با True باشد، بدين معناست که در هنگام کامپايل پيغام خطا توليد مي‌شود و کامپايل برنامه متوقف مي‌گردد. در حالت پيش فرض مقدار اين پارامتر برابر با False است که بيان مي‌دارد، به هنگام کامپايل تنها پيغام هشداری توليد خواهد شد. در پيغام اين برنامه، عنصری از برنامه را که نبايد از آن استفاده شود معين شده و جايگزين آن نيز معرفی مي‌شود.
AnyClass.Old()' is obsolete:
'Don't use Old method, use New method'
تفاوت پارامترهای positional با پارامترهای named در آنست که، پارامترهای named با نامشان مورد استفاده قرار مي‌گيرند و هميشه اختياری هستند. در مثال 3-16 صفت DllImport را مشاهده مي‌نماييد که دارای هر دو نوع پارامتر positional و named است.

مثال 3-16
کد:
using System;
using System.Runtime.InteropServices;

class AttributeParamsDemo
{
    [DllImport("User32.dll", EntryPoint="MessageBox")]
    static extern int MessageDialog(int hWnd, string msg, string caption, int msgType);

    [STAThread]
    static void Main(string[] args)
    {
        MessageDialog(0, "MessageDialog Called!", "DllImport Demo", 0);
    }
}
صفت DllImport در مثال 3-16 دارای يک پارامتر positional ("User32.dll") و يک پارامتر named (EntryPoint="MessageBox") است . پارامترهای named در هر مکانی مي‌توانند قرار گيرند و مانند پارامترهای positional دارای محدوديت مکانی نيستند. بدين معنا که چون در پارامترهای named، نام پارامتر مستقيما مورد استفاده قرار مي‌گيرد، محل قرار گيری آن در ليست پارامترهای صفت مهم نيست اما در مورد پارامترهای positional چون اسم پارامتر مورد استفاده قرار نمي‌گيرد، اين پارامترها حتما بايد در مکانهای تعيين شده و تعريف شده در ليست پارامترهای صفت قرار گيرند. توجه کنيد که چون هدف ما تنها آشنايي با صفتها و نحوه استفاده از آنهاست، درباره پارامترهای مختلف صفت DllImport بحث نخواهيم کرد چراکه پارامترهای اين صفت نياز به آشنايي کامل با Win32 API دارد.

در يک بررسی کلی مي‌توان گفت که پارامترهای Positional، پارامترهای سازنده(Constructor) صفت هستند و در هر بار استفاده از صفت بايد مورد استفاده قرار گيرند، ولی پارامترهای Named کاملا اختياری هستند و هميشه نيازی به استفاده از آنها نمي‌باشد.

Target های صفتها (عناصری که صفتها بر روی آنها اعمال مي‌شوند)

صفتهايي که تا کنون مشاهده کرديد، همگی بر روی متدها اعمال شده بودند. اما عناصر مختلف ديگری در C# وجود دارند که مي‌توان صفتها را بر روی آنها اعمال نمود. جدول 1-16 عناصر مختلف زبان C# را که صفتها بر روی آنها اعمال مي‌شوند را نشان مي‌دهد.

c1.gif

هر چند ممکن است استفاده از اين Target ها باعث ايجاد ابهام شوند، اما مي‌توان با استفاده از اين Target ها معين کرد که صفت دقيقا به عنصر مورد نظر اعمال شود. يکی از صفتهايي که بر روی اسمبلی اعمال مي‌شود و باعث ارتباط با CLS مي‌گردد، صفت CLSCompliantAttribute است. CLS يا همان Common Language Specification امکان برقراری ارتباط بين کليه زبانهايي که تحت .Net کار مي‌کنند را فراهم مي‌نمايد. Target های صفتها با استفاده از اسم Target که بعد از آن کولون قرار مي‌گيرد، ايجاد مي‌شوند. در مثال 4-16 نحوه استفاده از اين صفت نشان داده شده است.

مثال 4-16
کد:
using System;

[assembly:CLSCompliant(true)]

public class AttributeTargetDemo
{
    public void NonClsCompliantMethod(uint nclsParam)
    {
        Console.WriteLine("Called NonClsCompliantMethod().");
    }

    [STAThread]
    static void Main(string[] args)
    {
        uint myUint = 0;

        AttributeTargetDemo tgtDemo = new AttributeTargetDemo();

        tgtDemo.NonClsCompliantMethod(myUint);
    }
}
با استفاده از Target مورد نظر در اينجا يعنی assembly، اين صفت بر روی کل اسمبلی اعمال مي‌گردد. کد موجود در مثال 4-16 کامپايل نخواهد شد، زيرا uint در متد NonClsCompliantMethod() اعلان شده است. در اينجا درصورتيکه فرم پارامتر صفت CLSCompliant را به false تغيير دهيد و يا متد NonClsCompliantMethod() را به متدی منطبق با CLS تبديل کنيد (مثلا نوع بازگشتی آنرا int تعريف کنيد) آنگاه برنامه کامپايل خواهد شد. (توضيحي كه درباره CLS ميتوانم بيان كنم اينست كه CLS مجموعه‌اي از ويژگيها و خواص .Net Framework است كه به نحوي بيان مي‌دارد، براي اينكه زبانهاي مختلف تحت .Net بتوانند بدون مشكل با يكديگر ارتباط برقرار نمايند، لازم است از يك سري از قوانين پيروي كنند، در غير اينصورت امكان برقراري ارتباط با ساير كدهاي نوسته شده تحت زبانهاي برنامه‌سازي ديگر را نخواهند داشت. براي مثال، استفاده از نوع uint به دليل اينكه در زبانهاي مختلف مي‌تواند به صورتهاي متفاوتي پياده‌سازي شود و يا وجود نداشته باشد، سازگار با CLS نيست و براي اينكه بخواهيم برنامه‌اي منطبق با CLS داشته باشيم نبايد از آن استفاده نماييم.)

نکته قابل توجه در مورد مثال 4-16 آنست که در اين مثال صفت CLSCompliant به استفاده از يک Target که همان assembly است، مورد استفاده قرار گرفته است و از اينرو تمامی مشخصات اين صفت به کليه اعضای اين اسمبلی اعمال خواهند شد. توجه نماييد که در اين مثال علت و موارد استفاده از صفتها مشهودتر است، چراکه همانطور که مشاهده مي‌نماييد، با استفاده از يک صفت مي‌توانيم کنترلی بر روی کل اسمبلی و برنامه قرار دهيم تا در صورتيکه مي‌‌خواهيم برنامه ما با ساير زبانهای برنامه‌سازی تحت .Net ارتباط برقرار کند، از متدهای استاندارد و سازگار با CLS استفاده نماييم که اين قابليت بزرگی را در اختيار ما قرار خواهد داد.
 
آخرین ویرایش:

saalek110

Well-Known Member
از همان سایت بالا قسمت دوم Attribute را نقل می کنم با آدرس:
http://cslearning.tripod.com/cs/compCs_2_2.htm
=====================================

صفات و استفاده از آنها

در اين درس با نحوه استفاده از صفتها در زبان C# آشنا خواهيد شد. اهداف ما در اين درس به شرح زير است :
توليد صفتهای شخصی

تعريف و يا کنترل موارد استفاده از يک صفت

استفاده از پارامترهای Positional و Named در صفتهای شخصی

انواع (type) معتبر برای پارامترهای صفت

استفاده از صفتها در زمان اجرا

خلاصه مطالب


توليد صفتهای شخصی


پس از اينکه با طريقه استفاده از صفتهای موجود در زبان آشنا شديد، حال نوبت به ساخت صفتهای شخصی مي‌رسد. برای توليد يک صفت (Attribute) بايد يک کلاس ايجاد نماييم و اين کلاس بايد از System.Attribute مشتق شود. کلاسی که از System.Attribute مشتق مي‌شود (چه بطور مستقيم و چه بطور غير مستقيم) يک کلاس صفت(Attribute Class) است. اعلان کلاس صفت باعث ايجاد صفت جديدی مي‌شود که مي‌توان از آن در برنامه استفاده نمود. به مثال 5-16 توجه فرماييد.

مثال 5-16
کد:
using System;
public class HelpAttribute : Attribute
{
}
در اين مثال به سادگی يک صفت جديد توليد کرده‌ايم و مي‌توانيم از آن استفاده کنيم.
کد:
[Help()]
public class AnyClass
{
}
همانطور که قبلا نيز گفتيم استفاده از کلمه Attribute به دنبال نام صفت الزامی نيست. صفتی که در اينجا ايجاد کرده‌ايم عملا کار خاصی برای ما انجام نمي‌دهد پس اندکی در کد آن تغيير ايجاد مي‌کنيم تا مفيدتر باشد.

مثال 6-16
کد:
using System;
public class HelpAttribute : Attribute
{
    public HelpAttribute(String Descrition_in)
    {
        this.description = Description_in;
    }
    protected String description;
    public String Description 
    {
        get 
        {
            return this.description;
                 
        }            
    }    
}
[Help("this is a do-nothing class")]
public class AnyClass
{
}
هماطور که مشاهده مي‌کنيد با اضافه کردن چند خط کد توانستيم اين صفت را کاراتر کنيم. با قرار دادن يک property در اين صفت، پارامتر اين صفت بعنوان پيغام نمايش داده مي‌شود.


تعريف و يا کنترل موارد استفاده از يک صفت

AttributeUsage يکی از کلاسهای از پيش تعريف شده در زبان است که با استفاده از آن مي‌توانيم موارد استفاده از صفتی را که توليد کرده‌ايم را کنترل کنيم.

اين کلاس دارای سه property مختلف است که مي‌توان آنها را به هنگام استفاده صفت شخصی تنظيم نمود و مورد استفاده قرار داد.

ValidOn

با استفاده از اين property مي‌توانيم مشخص کنيم که صفت توليد شده توسط ما، بر روی کدام يک از عناصر برنامه قابل اعمال هستند. اطلاعات اين عناصر از AttributeTarget گرفته مي‌شود و مي‌توان عناصر مختلف را بوسيله OR بيتی با يکديگر ترکيب نمود.

AllowMultiple

با استفاده از اين property مي‌توان مشخص کرد که آيا مي‌توان از اين صفت بيش از يکبار بر روی يک عنصر برنامه استفاده کرد يا نه.

Inherited

با استفاده از اين property مي‌توان قوانين ارث‌بری اين صفت را کنترل نمود. با استفاده از اين property مي‌توان مشخص کرد که آيا کلاسی که از کلاسی که صفت بر روی آن اعمال شده، ارث بری مي‌کند نيز، صفت بر رويش اعمال مي‌شود يا نه و يا به عبارتی صفت در کلاس مشتق شده نيز مورد ارث‌بری قرار مي‌گيرد يا نه.

حال با استفاده از موارد گفته شده در بالا، مي‌خواهيم اين مطالب را بر روی صفتی که خودمان توليد کرديم اعمال نماييم. مثال 7-16 را بررسی نماييد.

مثال 7-16
کد:
using System;
[AttributeUsage(AttributeTargets.Class),
 AllowMultiple = false, Inherited = false ]
public class HelpAttribute : Attribute
{
    public HelpAttribute(String Description_in)
    {
        this.description = Description_in;
    }
    protected String description;
    public String Description
    {
        get 
        {
            return this.description;
        }            
    }    
}
در ابتدا به AttributeTargets.Class توجه نماييد. اين مشخص مي‌کند که صفت Help تنها بر روی کلاسها قابل اعمال است و در صورتيکه از آن بر روی عنصری به غير از کلاس استفاده نماييم خطايي رخ خواهد داد. بنابراين کد زير، خطايي توليد خواهد کرد :
کد:
[Help("this is a do-nothing class")]
public class AnyClass
{
    [Help("this is a do-nothing method")] //error
    public void AnyMethod()
    {
    }
}
و کد خطای توليد شده بشکل زير خواهد بود :

AnyClass.cs: Attribute
'Help' is not valid on this declaration type.
It is valid on 'class' declarations only.
توجه کنيد که با استفاده از AttributeTargets.All به صفت Help اين امکان را مي‌دهيم تا بر روی تمامی عناصر موجود اعمال شود. ليست کامل عناصر مجاز نيز بشرح زير است :

Assembly,

Module,

Class,

Struct,

Enum,

Constructor,

Method,

Property,

Field,

Event,

Interface,

Parameter,

Delegate,

All = Assembly , Module , Class , Struct , Enum , Constructor , Method , Property , Field , Event , Interface , Parameter , Delegate,

ClassMembers = Class , Struct , Enum , Constructor , Method , Property , Field , Event , Delegate , Interface

حال به AllowMultiple = false توجه نماييد. با استفاده از اين کد، به صفت Help اجازه مي‌دهيم تا تنها يکبار بر روی عنصری از برنامه اعمال شود. پس کد زير توليد خطا مي‌نمايد :
کد:
[Help("this is a do-nothing class")]
[Help("it contains a do-nothing method")]
public class AnyClass
{
    [Help("this is a do-nothing method")]        //error
    public void AnyMethod()
    {
    }
}
و کد خطای توليد شده نيز بصورت زير است :

AnyClass.cs: Duplicate 'Help' attribute
در نهايت نيز به بررسی Inherited مي‌پردازيم. با استفاده از اين ويژگی، معين مي‌کنيم درصورتيکه کلاس ديگری بخواهد از روی کلاسی که صفت بر روی آن اعمال شده ارث‌بری نمايد، آيا اين صفت بر روی آن کلاس نيز اعمال شود يا نه. در صورتيکه مقدار اين ويژگی برابر با True باشد، کلاس مشتق شده نيز از صفت ارث‌بری مي‌نمايد. برای يک مثال مي‌توانيم حالت زير را در نظر بگيريم :
کد:
[Help("BaseClass")] 
public class Base
{
}
 
public class Derive :  Base
{
}
تمامی حالتهای مختلف ترکيب اين سه ويژگی بصورت زير است :

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false ]

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false ]

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true ]

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true ]

استفاده از پارامترهای Positional و Named

همانطور که در قبل نيز اشاره شد، پارامترهای Positional پارامترهای سازنده صفت هستند و در هر بار استفاده از صفت بايد لحاظ شوند. حال برای بررسی مي‌خواهيم پارامترهايي به صفت Help خود اضافه نماييم.

مثال 8-16
کد:
[AttributeUsage(AttributeTargets.Class, 
AllowMultiple = false, Inherited = false)]
public class HelpAttribute : Attribute
{
    public HelpAttribute(String Description_in)
    {
        this.description = Description_in;
        this.verion = "No Version is defined for this class";
    }
    protected String description;
    public String Description
    {
        get 
        {
            return this.description;
        }
    }
    protected String version;
    public String Version
    {
        get 
        {
            return this.version;
        }
        //if we ever want our attribute user to set this property, 
        //we must specify set method for it 
        set 
        {
            this.verion = value;
        }
    }
}
[Help("This is Class1")]
public class Class1
{
}
 
[Help("This is Class2", Version = "1.0")]
public class Class2
{
}
 
[Help("This is Class3", Version = "2.0",
 Description = "This is do-nothing class")]
public class Class3
{
}
پس از اينکه اين صفت را بر روی کلاس Class1 اعمال کرديم و بخواهيم آنرا کامپايل کنيم با پيغام زير روبرو مي‌شويم :

Help.Description : This is Class1
Help.Version :No Version is defined for this class
چون در اينجا هيچ مقداری برای Version در نظر نگرفته‌ايم، با اين پيام مواجه شده‌ايم.

حال نتيجه اعمال اين صفت را بر روی کلاس دوم بررسی مي‌کنيم.

Help.Description : This is Class2
Help.Version : 1.0
برای پارامترهای اختياری معمولا از دو سازنده استفاده نمي‌شود و در عوض از پارامترهای Named استفاده مي‌گردد. نکته‌ای که بايد به آن توجه کنيد آنست که برای پارامترهای Named حتما بايد در تعريف property، از متد set نيز استفاده نماييد در غير اينصورت با پيغام خطای زير روبرو مي‌شويد :

'Version' : Named attribute argument can't be a read only property
بنابراين درصورتيکه اين صفت را بر روی کلاس سوم نيز اعمال کنيم با پيغام خطای مشابهی روبرو خواهيم شد. اگر در کلاس Help تغييری کوچکی ایيجاد کنيم و به Description نيز متد set را بيفزاييم، با خطا مواجه نخواهيم شد.

Help.Description : This is do-nothing class
Help.Version : 2.0
اتفاقی که در اينجا رخ مي‌دهد آنست که در ابتدا سازنده (Constructor) اين صفت به همراه پارامترهای Positional آن فراخوانده مي‌شوند و سپس متد set برای هر يک از پارامترهای Named فراخوانده مي‌شود .

انواع (type) معتبر برای پارامترهای صفت

انواع معتبر برای پارامترهای صفت بشرح زير مي‌باشند :

bool,byte,char,double,float,int,long,short,string,System.

Type ,object
همچنين مي‌توان از enum و يا آرايه‌ای تک بعدی، که عناصر آن يکی از انواع فوق باشد، نيز استفاده نمود.


استفاده از صفتها در زمان اجرا

تا كنون با طريقه ساخت صفتها و چگونگي استفاده و اعمال آنها بر عناصر مختلف برنامه آشنا شديم. حال نوبت به آن رسيده است تا ببينيم چگونه مي‌توان از صفتها در زمان اجرا استفاده نمود. براي جستجوي (query) يك برنامه درباره صفت موجود در آن، به Reflection نيازمنديم. Reflection قابليت بدست آوردن اطلاعات مربوط به انواع (Types) مختلف در زمان اجراي برنامه است. با استفاده از توابع Reflection موجود در .Net Framework مي‌توانيم با جستجو و پيمايش Metadate مربوط به يك اسمبلي، ليست كاملي از كلاسها، انواع و متدهايي را كه براي آن اسمبلي خاص تعريف شده‌اند را، بدست آوريم. به مثال 9-16 در اين باره توجه نماييد.

مثال 9-16 : استفاده از Reflection
کد:
using System;

using System.Reflection;

using System.Diagnostics;

 

//attaching Help attribute to entire assembly

[assembly : Help("This Assembly demonstrates

 custom attributes creation and their run-time query.")]

 

//our custom attribute class

public class HelpAttribute : Attribute

{

    public HelpAttribute(String Description_in)

    {

        //

        // TODO: Add constructor logic here

        this.description = Description_in;

        //

    }

    protected String description;

    public String Description

    {

        get 

        {

            return this.deescription;

                 

        }            

    }    

}

//attaching Help attribute to our AnyClass

[HelpString("This is a do-nothing Class.")]

public class AnyClass

{

//attaching Help attribute to our AnyMethod

    [Help("This is a do-nothing Method.")]

    public void AnyMethod()

    {

    }

//attaching Help attribute to our AnyInt Field

    [Help("This is any Integer.")]

    public int AnyInt;

}

class QueryApp

{

    public static void Main()

    {

    }

}
مبحث صفتها بسيار گسترده است و مي‌توان ساعتها در مورد صفتهای مختلف بحث نمود. اما آنچه مسلم است تمرين مستمر و پيگيری برنامه نويس در يافتن مواردی که مي‌توان با استفاده از صفتها، برنامه‌ای پوياتر ايجاد نمود، مهمترين عامل در فهم و درک کامل مبحث خواهد بود. درباره Reflection نيز در آينده در يان سايت مفصلا توضيح خواهم داد.

خلاصه :

در اين درس با صفتها آشنا شديد. ياد گرفتيد كه چگونه از صفتهاي موجود در .Net Framework استفاده كرده و همچنين چگونه صفتهاي شخصي و دلخواه خود را توليد نماييد. همچنين با پارامترهاي صفتها و انواع آنها و نيز، عناصري كه صفتها بر روي آنها اعمال مي‌شوند آشنا شديد. در انتهاي درس نيز به مختصر درباره Reflection و چگونگي استفاده از صفتها در زمان اجرا صحبت كرديم. اميدوارم مفيد واقع شده باشد.
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا