PDA

View Full Version : آموزش: آموزش پایه #C



brilliantprogrammer
جمعه 19 دی 1393, 16:19 عصر
با سلام
مطالبی که قصد دارم برای بینندگان بگذارم برای تازه کارها مفید خواهد بود و با توجه به اعضا افراد را بسیار حرفه ی تر از خود می بینم و احتمالا مطالب من برای حرفه ی ها بسیار ساده خواهد بود. هدف این هست تا هر هفته یک فصل توضیح داده شود. از دوستان حرفه ی می خواهم تا در این کار یاری کنند



با تشکر از انتخاب شما هدف اصلی این مجموعه حرفه ای ساختن برنامه نویسهاست به شکلی که با اکثر دستورات C#‎‎‎‎ آشنا شوند و بتوانند برنامه های دلخواه خود را به شکل استاندارد طراحی کنند. در این مجموعه ما نگاه کلی به C#‎‎‎‎ خواهیم کرد و آنچه لازم است برنامه نویس بداند توضیح داده خواهد شد به شکلی که برنامه نویس برای انجام پروژه سنگین آماده شود. به این مجموعه می توانید به شکل سکوی پرواز نگاه کنید


مطالب در 4 بخش توضیح داده خواهد شد که شامل
1- اصول برنامه نویسی C#‎‎‎‎ و معرفی .NET
2- ساختن برنامه با استفاده از کلاسهای C#‎‎‎‎
3- مباحث پیشرفته C#‎‎‎‎
4- برنامه نویسی اینترنت




1- اصول برنامه نویسی C#‎‎‎‎ ومعرفی .NET
این بخش شامل 4 فصل است
1- معرفی C#‎‎‎‎ و .NET
2- اصول زبان C#‎‎‎‎
3- طراحی کلاسها
4- کار با اشیا








فصل اول
این فصل توضیحاتی در مورد ساز و کار C#‎‎‎‎ و .NET است اگر در این مورد اطلاعاتی دارید می توانید از فصل دوم شروع کنید
معرفی C#‎‎‎‎ و .NET
نظر اجمالی به .net framework
فکر می کنید قدرت C#‎‎‎‎ در چه حدی است؟ آیا می توانیم باآن برنامه های برای موبایل طراحی کنیم؟ این زبان از چه بخشهای تشکیل شده و چگونه کار می کند؟
هنگام برنامه نویسی C#‎‎‎‎ ما معمولا از دو بخش استفاده می کنیم یک قسمت اصولی است که برای کدنویسی به زبان C#‎‎‎‎ باید رعایت کنیم و قسمت دیگر منابعی هستند که در طراحی به ما کمک می کنند. یکی از منابعی که بیشتر مورد استفاده برنامه نویسان قرار می گیرد .NET هست که ما به ساختار آن در این قسمت نگاهی می اندازیم
.net به دو بخش تقسیم تقسیم می شود.1- Command Language Runtime (CLR) و Framework Class Library (FCL)
وظیفه بخش clr اجرای دستورات برنامه نویس هست. معمولا برنامه نویسان کمتر با این بخش درگیر می شوند ولی کسب اطلاعات در این زمینه هم خالی از لطف نخواهد بود. اما بخش fcl جایی است که بیشتر برنامه نویسان استفاده می کنند شما به این قسمت می تونید به چشم تکه های از نرم افزارهای آماده نگاه کنید. این قسمت دارای خونه های زیادی در نظر بگیرید که هر کدام وظیفه خاصی را دارند.
CLR
برای بیشتر برنامه نویسها این مهم هس که آیا زبان آنها قابل انتقال بین محیطهای گوناگون را دارد یا خیر؟ آیا .NET تنها برای ویندوز ساخته شده یا قابل اجرا بر روی سیستم عاملهای دیگر نیز هست؟ انجام این کارها را clr بر عهده دارد
این بخش چرخه زندگی برنامه را مدیریت می کند. اجرا شدن دستورات، انتقال به زبانهای دیگر، مدیریت حافظه و امنیت از وظایف clr می باشد. با شناخت clr می توانیم بفهمیم برنامه های ما چگونه اجرا می شود.
در clr بخشی وجود دارد به نام CLI . این بخش یک محیط اجرای برنامه ایجاد می کند که مستقل از سیستم عامل هست. در حقیقت CLI مانند یک واسط عمل می کند یعنی دستورات برنامه نویسی ابتدا توسط CLI به یک برنامه خاص تبدیل می شود. برنامه ی که می تواند بر روی هر سیستم عاملی اجرا شود در مرحله بعد این برنامه با توجه به سیستم عامل اجرا می شود.
بخشی از وظایف CLR توسط Compiler انجام می شود. این قسمت دستورات برنامه نویس را به کدهای تبدیل می کند که بدون توجه به CPU قابل اجرا باشد. کدهای تولید شده به اسمهای CIL یا IL یا MSIL شناخته می شوند.کدهای تولید شده توسط Compiler رابا عنوان کدهای مدیریت شده می شناسند. کدهای مدیریت شده قابل اجرا نیستند و باید در هنگام اجرا به زبان ماشین ترجمه شوند. ترجمه از دستورات MSIL به زبان قابل اجرا توسط Just-In-Time (JIT) صورت می گیرد.
CLR نمی داند که دستورات توسط چه زبانی و برنامه ی تولید شده. دستورات شما توسط هر ماشینی که JIT بر روی آن باشد قابل اجرا خواهد بود.
JIT وظایف زیر را برعهده دارد
1- برای برنامه نویسی باید استانداردهای را رعایت کنیم. تعیین سالم و صحیح بودن کدها بر عهده JIT می باشد.
2- مدیریت حافظه و آزاد سازی حافظه های بلا استفاده
3- انجام تنظیمات دلخواه در زمان اجرا

Assemblies
مفهوم دیگری که باید قبل از شروع برنامه نویسی با آن آشنا باشیم اسمبلی می باشد. تمام دستورات ما باید دارای حداقل یک اسمبلی باشند. از نظر منطقی یک اسمبلی به یک فایل exe یا dll اشاره می کند. یک اسمبلی توسط .NET زمانیکه دستورات برنامه نویس به یک فایل exe یا dll تبدیل می شود، ساخته می شود. اسمبلی به سه قسمت تقسیم می شود.1-Manifest 2- Metadata و3-IL که به بررسی آنها می پردازیم.
Manifest : هر اسمبلی باید یک فایل دارای Manifest داشته باشد. این فایل دارای جدولی است که دادهای در مورد اسمبلی های مورد استفاده در برنامه در آن ذخیره می شود. اطلاعاتی از قبیله نام و ورژن برای شناسایی اسمبلی ها در آن قرار می گیرد. زمانیکه اسمبلی اجرا می شود، ابتدا این فایل اجرا می شود.
Metadata: اطلاعات فایل Manifest و همچنین اطلاعاتی در مورد دیتا تایپ، Field و ... که کامپایلر برای ساختن کدهای IL از این اطلاعات استفاده می کند، در این فایل قرار دارد.
IL : همانطور که قبلا گفته شد کدهای واسطی است که بعضا با توجه به محیط اجرا و سیستم عامل به زبان ماشین مناسب ترجمه خواهد شد.
در نظر داشته باشید که اسمبلی ها می توانند .exe یا .dll باشند. اسمبلی ها در اصل مجموعه از فایلها هستند که هدف مشخصی را دنبال می کنند یعنی یک اسمبلی می تواند شامل چند فایل باشد و فایل ها نیز صرفا دستورات برنامه نویسی نیست و می تواند فایل متنی یا یک تصویر باشد. در نهایت فایل ها با استفاده از Manifest باهم ترکیب شده و یک واحد را تشکیل می دهند.
FCL
این قسمت دارای ابزارهای زیادی است که در برنامه نویسی به ما کمک می کنند. FCL به قسمت های مختلف گروهبندی شده. این گروه های را Namespace می نامند. برنامه نویسان با هر زبانی در .NET می توانند از این ابزارها استفاده کنند
در اینجا من توضیحات مختصری در مورد Namespace های FCL می نویسم
System : بیشتر شامل ابزارهای کلی طراحی می باشد. دیتا تایپها و exceptionها در این قسمت قرار دارند.
System.Collections : ابزارها برای ساخت Collection ها و مدیریت آنها
System.Data : برای کار با دیتابیس
System.Diagnostics : برای اجرا و دیباگ برنامه
System.Drawing : برای کار با گرافیک برنامه
System.Globalization : برای کار با اطلاعات زبان و واحد پولی کشورهای مختلف و تغییر در برنامه با استفاده از آنها
System.IO : برای کار با فایلها
System.Net : برای کار با شبکه
System.Reflection : برای انجام کنترل های در زمان اجرا و ساختن کدهای IL مورد نظر
System.Security : برای تنظیمات امنیتی مورد نظر
System.Threading : برای انجام چند کنش به صورت همزمان
System.Web : برای کار با اینترنت و پروژهای ASP.NET
System.Windows.Forms : برای ساختن و مدیریت پنجره های ویندوزی
System.xml : برای کار با فایلهای xml

شما با یادگیری دستورات و شیوه کدنویسی در C#‎‎‎‎ و با توجه به قسمتی که می خواهید در آن کار کنید می توانید به بررسی و مطالعه NameSpace مورد نظر خود اقدام کنید. مثلا در صورتیکه می خواهید وارد دنیای طراحی وب بشوید لازم است تا System.Web.* را مطالعه کنید.

sabz12
شنبه 20 دی 1393, 09:27 صبح
پیشنهاد می کنم که مثل کلاس اول یک(کتاب ساده) یک نرم افزار ساده بزارید که زیاد هست و اولش بگید که با این نرم افزار می خواهیم به عنوان مثال تابع و... را اموزش دهیم این ها را خودمون مطالعه می کنیم چون مطلب اموزشی زیاد هست ولی خورد شدن روی برنامه های کوچک اماده مثال اموزشیش کم هست که چطوری درست شده مثلا این خط کد برای فلان مطلب مثلا تابه یا کلاس یا... هست .البته یک پیشنهاد بود امیدوارم موفق و پیروز باشید .ما هم مشتاق بقیه مطالب هستیم.:خجالت::لبخندساده:

brilliantprogrammer
جمعه 03 بهمن 1393, 20:17 عصر
فصل دوم : اصول برنامه نویسی C#‎‎‎‎
1- قوانین اولیه برنامه نویسی
این فصل در مورد اصول و استانداردهای اولیه برنامه نویسی بحث می کند اگر با این استانداردها آشنا هستید می تواند این فصل را رها ساخته و به فصل بعد مراجعه کنید.
همانطور که گفتم برای برنامه نویسی ما با دو قسمت روبه رو می شویم یکی اصول برنامه نویسی است که در واقع همان استانداردهای می باشد که باید برای برنامه نویسی رعایت شود و دیگری استفاده از منابع یا ابزارهای است که کار ما را راحت می کند.
میدانیم که برنامه نویسان برای تولید برنامه، کدنویسی می کنند به عبارت دیگر متنهای را می نویسند که کامپیوتر آنها را می فهمد و اجرا می کند. این متنها به سبک خاصی نوشته می شوند.
کدنویسی دارای دو قسمت کلی است
1- توضیحات(Comment) : توضیحات هیچ تاثیری در روند اجرای برنامه ندارند و همانطور که از نام آن پیداست تنها برای توضیح دادن در مورد کدهای برنامه مورد استفاده قرار می گیرند. ممکن است فکر کنید استفاده از توضیحات کار بیهوده و وقت تلف کردن است اما این نکته را در نظر بگیرید که در پروژهای بزرگ توضیحات بسیار به شما کمک خواهد کرد. ما در توضیحات می توانیم هر چیز به هر زبانی بنویسیم توضیحات به سه دسته تقسیم می شوند.
توضیحات تک خطی : این توضیحات با // شروع می شوند و تا انتهای خط ادامه دارند
توضیحات چند خطی : این توضیحات با /* شروع شده و تا */ ادامه دارند
توضیحات xml ی : این توضیحات با /// شروع می شوند
توضیحات xmlی به شکلهای زیر می تواند نوشته شود. شکل کلی این توضیحات به شکل زیر است
///<TagName [attribute="Value"]> ... Comment ...</TagName>
///<example>
اگر می خواهید برای کدهای خود نمونه یا مثال بنویسید می توانید آن را در این توضیحات قرار دهید.
///<exception cref="ExceptionType">
exceptionها حالتهای خاص یا استثنا های هستند که در برنامه رخ می دهد در مورد Exceptionها در فصل های بعد توضیح خواهیم داد.اگر می خواهید برای exception رخ داده در کدها توضیحات قرار دهید این قسمت مورد استفاده خواهد بود و نوع Exception درون خصوصیت cref تعیین می شود.
///<include file="MyXML">
اگر توضیحات شما در یک فایل xml قرار دارد و می خواهید توضیحات خود را از فایل ذخیره شده فراخوانی کنید این نوع برای شما مفید خواهد بود
///<param name="ParamName">
برای قرار دادن توضیحات در پارامترهای متد
///<permission>
برای کنترل دسترسی بر روی کدها
///<remarks>
توضیحات ریز در مورد عملکرد کد
///<returns>
توضیحات در مورد مقدارهای بازگشتی
///<seealso cref="FieldName">
برای استفاده از توضیحات کدهای دیگر
///<summary>
توضیحات مختصر در مورد عملکرد کد

اولین نکته ی که باید در کدنویسی بدانیم تمام برنامه ها از یک یا چند کلاس (class) تشکیل شده اند. مجموعه کلاسها تشکیل یک Namespace یا فضای نامی را می دهد. تقسیم بندی کدها به کلاس برای برنامه نویس فواید فراوانی دارد. اول اینکه برنامه نویس می تواند کدهای خود را دسته بندی کند و این در پروژهای بزرگ بسیار سودآور است. دوم اینکه کلاسها یک بار طراحی می شوند و می توانند چندین قسمت استفاده شوند. مثلا اگر شما کلاسی را طراحی کنید که باعث نمایش ساعت در پنجره ویندوز شود و بخواهید در برنامه ی که دارای پنجرهای فراوانی است این کلاس را استفاده کنید، فقط کافی است در هر پنجره دلخواه کلاس طراحی شده را صدا بزنید..NET چیزی نیست جز کلاسهای طراحی شده برای راحتی کار برنامه نویسان.
ما در فصل بعد ساختار کلاس ها را بدقت بررسی خواهیم کرد اما اینجا لازم است توضیحات کمی داده شود. کلاسها از دارای خصوصیت و متد هستند. معمولا از خصوصیت ها برای ذخیره سازی یک مقدار یا نمایش مقدار استفاده می شود و از متد برای انجام عمل. شیوه کلی دسترسی به خصوصیت یا متد به شکل زیر است
نام خصوصیت.نام کلاس
()نام متد.نام کلاس
همانطور که می دانیم برنامه ها اطلاعاتی را از کابر می گیرند، بر روی آنها پردازش لازم را انجام می دهند و نتایج را به کاربر برنامه نمایش می دهند. پس اولین قدم ذخیره اطلاعات در برنامه هست. در C#‎‎‎‎ مانند اکثر زبانها این کار توسط تعریف متغیرها صورت می گیرد. شیوه کلی تعریف متغیرها به شکل زیر است.

;نام دلخواه نوع متغیر
;DataType MyName
DataTypeها یا نوع متغیر با توجه اینکه چه اطلاعاتی را می خواهید ذخیره کنید تعیین می شوند. C#‎‎‎‎ دارای نوع های زیر است که هر کدام دادهای خاص خود را قادرند ذخیره کنند.



دادهای قابل پذیرش

نام کلاس معادل

نوع متغیر DataType



برای ذخیره سازی متن (رشته یا کاراکترها)

System.String

string



برای اعداد بزرگ، تا 28 عدد را میتواند ذخیره کند

System.Decimal

decimal



تنها دو نوع true یا False را می پذیرد

System.Boolean

bool



یک کاراکتر را در خود ذخیره می کند

System.Char

char



برای اعداد صحیح از 0 تا 256

System.Byte

byte



برای اعداد صحیح از -126تا126

System.SByte

sbyte



برای اعداد صحیح از32767- تا 32767

System.Int16

short



برای اعداد صحیح بزرگ(مثبت و منفی)

System.Int32

int



برای اعداد صحیح بسیار بزرگ(مثبت و منفی)

System.Int64

long



برای اعداد صحیح از صفر تا 65535

System.UInt16

ushort



برای اعداد صحیح بزرگ(اعداد مثبت)

System.UInt32

uint



برای اعداد بسیار بزرگ (اعداد مثبت)

System.UInt64

ulong



برای اعداد اعشاری

System.Single

single(float)



برای اعداد اعشاری بسیار بزرگ

System.Double

double



هر نوع داده ی را می تواند در خود ذخیره کند

System.Object

object





همانگونه که می بینید نوع یک متغیر نشان می دهد که آن متغیر چه نوع دادهای را قادر است در خود ذخیره کند. با تعریف یک متغیر مقداری از حافظه کامپیوتر اشغال شده و دادهای مورد نظر در آن ذخیره می شود. قبلا گفته شد که برنامه ها از یک یا چند کلاس تشکیل شده و ما اینجا هر نوع متغیر را معادل یک کلاس می دانیم البته بعدها خواهیم دید که برخی از متغیرها واقعا کلاس نیستند ولی فعلا تمام آنها را کلاس در نظر بگیرید. System که در تمام کلاسهای معادل آمده نام Namespace است در واقع هنگامی که بخواهیم به یک کلاس دسترسی پیدا کنیم که آن کلاس داخل یک Namespace است باید به صورت NamespaceName.ClassName کدنویسی کنیم.
اما بعد از تعیین نوع متغیر باید به آن نامی اختصاص بدهیم. شما می توانید هر نامی را برای آن انتخاب کنید اما نام شما باید با حرف شروع شود و نباید دارای علائم (مثل علامت *) یا فاصله باشد استثناء شما می توانید از علامت زیرخط در نام خود استفاده کنید. معمولا منابع به این نامها که به اختیار برنامه نویس هست شناسه می گویند.( معمولا توصیه می شود اگر شناسه دارای چند کلمه هست، کلمه اول با حرف کوچک و اول کلمات بعدی با حروف بزرگ نوشته شود)در نهایت علامت سمی کالن قرار گرفته که همیشه ثابت است تمام دستورات C#‎‎‎‎ به سمی کالن ختم می شود.
اگر من بخواهم متغیری از نوع long تعریف کنم به صورت زیر کدنویسی می کنم.
;long myName
بعد از تعریف یک متغیر می توانیم دادهای خود را در آن ذخیره کنیم که به شکل زیر کدنویسی می شود.
;myName = 1000
البته می توانیم در هنگام تعریف متغیر نیز دادهای خود را درون متغیر قرار دهیم
;long myName = 1000


نکته: گفتیم که کلاسها کدهای نوشته شده هستند و ما می توانیم از آنها استفاده کنیم. اگر بخواهیم از کلاسهای ساخته شده استفاده کنیم باید ابتدا یک شی از آن بسازیم این کار به صورت زیر انجام می شود
;()Namespace.ClassName MyName = new Namespace.ClassName
گفتیم که متغیرها نیز دارای کلاسهای معادل هستند بنابراین برای تعریف متغیر می توانیم از کلاسهای معادل آنها استفاده کنیم به شکل زیر
;()System.Int64 myName = new System.Int64
;myName = 1000
اگر از Visual Studio استفاده می کنید خواهید دید که برخی کلمات آبی رنگ هستند. در اصل این کلمات توسط C#‎‎‎‎ رزرو شده و شما نباید از این کلمات به عنوان شناسه(نام دلخواه) استفاده کنید. کلمات کلیدی در اصل نام مستعاری هستند از کلاسها یعنی مثلا کلمه کلیدی long نام مستعاری از System.Int64 می باشد

brilliantprogrammer
جمعه 03 بهمن 1393, 20:46 عصر
اعداد در C# به شکل عادی خود نوشته می شوند اما متن ها باید داخل دابل کوتیشن(") قرار بگیرند و تک کاراکترها باید داخل تک کوتیشن قرار بگیرند.
عمل تبدیل در C# به دو صورت صورت می گیرد 1- به صورت ضمنی: اگر شما یک متغیر را به متغیری با سطح بالاتر (یعنی متغیر سطح بالا بتواند تمام محدود متغیر سطح پایین را پوشش بدهد) نسبت دهید تبدیل به صورت ضمنی صورت می گیرد مثلا یک متغیر long می تواند درون خود یک متغیر int را ذخیره کند چون long تمام اعداد محدوده int را پوشش می دهد.
int intVariable = 1000;
long lngVariable;
lngVariable = intVariable; //C# Compiler Convert number
همانطور که می بینیم ابتدا متغیر int تعریف شده و در بعد از آن متغیر long تعریف شده و مقدار متغیر int را درون خود ذخیره می کند C# این تبدیل را بدون احتیاج به عملگر خاصی انجام می دهد. اما اگر عکس حالت بالا باشد چه می شود؟ اگر عددی در متغیر long ذخیره شده و حالا ما می خواهیم آن را در یک متغیر int بریزیم. C# به حالت عادی اجازه چنین عملی را نمیدهد
int intVariable;
long lngVariable = 1000;
intVariable = lngVariable;// Compiler error
long می تواند اعداد بزرگی را درون خود جای دهد در حالی که int می تواند تا 2147483647 را درون خود ذخیره می کند قطعا اگر عددی را در متغیر long ذخیره کنیم که بزرگتر از ماکسیمم عدد int باشد با خطا مواجه خواهیم شد اما اینجا عدد مورد نظر کوچک است و می تواند بدون خطا تبدیل شود برای این عمل ما به شکل زیر کدنویسی می کنیم
int intVariable;
long lngVariable = 1000;
lngVariable = (long)intVariable;
تنها تفاوت در خط آخر هست که ما صراحتا به C# گفته ایم تا تبدیل را انجام دهد شکل کلی تبدیل صریح به صورت زیر است
VariableName1 = (DataType1)VariableName2

2- اپراتورها Operator : حسابی، منطقی و شرطی
2-1: اپراتورهای حسابی:


برای جمع اعداد یا پیوستن متنها

+



تفریق اعداد

-



ضرب اعداد

*



تقسیم اعداد

/



باقیمانده تقسیم را برمی گرداند

%



یک واحد به متغیر اضافه می کند

++



یک واحد از متغیر کم می کند

--



مکمل عدد نسبت به صفر را نشان می دهد

~



شیفت بیت ها به راست

>>



شیفت بیت ها به چپ

<<



اصطلاحا (و) بیتی گفته می شود برای ترکیب دو عدد بیتی و بازگشت عددی است که در هر دو طرف true یا 1 باشد

&



اصطلاحا (یا) بیتی گفته می شود برای ترکیب دو عدد بیتی و بازگشت عددی است که در یکی از دو طرف true یا 1 باشد

|



اصطلاحا (یا استثنا) بیتی گفته می شود برای ترکیب دو عدد بیتی و بازگشت عددی است که در یکی true ودیگریfalse باشد

^





عملگرهای جمع، تفریق، ضرب و تقسیم همان رفتار عملگرهای حسابی را دارند. % باقیمانده تقسیم را بر می گرداند
int result = 7%3; // result=1
همانطور که می بینید نتیجه تقسیم در عملگر باقیمانده بی اهمیت هست و آنچه از تقسیم باقی می ماند را به متغیر خود برمی گرداند
++ و -- به دو شکل بر روی متغیرها تاثیر می گذارند و هر دو حالت باعث می شود یک واحد متغیر افزایش یا کاهش یابد
int result = 5;
result++; //result=6
++result; // result=7
result--; //result=6
--result; //result=5
همانطور که می بینیم عملگرهای افزایشی و کاهشی می توانند قبل یا بعد از متغیر قرار بگیرند که در هر دو حالت باعث افزایش یا کاهش یک واحدی در متغیر می شود اما تفاوت کوچکی باهم دارند. وقتی نوشته می شود result++ ابتدا از متغیر result استفاده می کند سپس یک واحد به متغیر اضافه می کند اما در ++result ابتدا یک واحد به متغیر اضافه کرده و سپس از متغیر استفاده می شود.
عملگر ~ مکمل عدد را نسبت به -1 نشان می دهد به عبارت دیگر عددی را نشان می دهد که اگر با متغیر جمع شود حاصل برابر -1 خواهد بود.
int result = 130;
~result; //result=-131
result = -15;
~result; //result=14

عملگر >> یا شیفت به راست(shift right) باعث انتقال بیتها به راست می شود. این عملگر و عملگرهای منطقی بر روی اعداد صحیح استفاده می شود.
int oneNumber = 10; // binary 10 is 01010
int result = oneNumber>>1;// change to 00101 and result=5
همانطور که می بینید >> باعث می شود بیتهای یک متغیر عددی به سمت راست به میزان تعیین شده انتقال می یابد و از راست صفر به عدد اضافه می شود. << رفتار مشابه دارد با این تفاوت که به سمت چپ انتقال می دهد
result = oneNumber<<1;// change to 10100 and result = 20

عملگرهای & | ^
این عملگرها دو بیت را باهم مقایسه کرده و نتیجه مناسب را برمیگردانند.وقتی از & استفاده کنید نتیجه 1 می شود اگر هر دو بیت مقایسه شده 1 باشند. اگر از | استفاده کنیم مقدار 1 را برمیگرداند اگر حداقل یکی از بیتهای مقایسه شده 1 باشد و یا هر دو 1 باشد. اگر از ^ استفاده کنید مقدار 1 را برمیگرداند در صورتی که یکی از بیتها 1 و دیگری 0 باشد به مثالهای زیر توجه کنید



result = A&B


result

B

A



1

1

1



0

0

1



0

1

0



0

0

0





result = A|B


result

B

A



1

1

1



1

0

1



1

1

0



0

0

0





result = A^B


result

B

A



0

1

1



1

0

1



1

1

0



0

0

0





int Exp1 = 11; //bit is 001011
int Exp2 = 12; //bit is 001100
int Result = Exp1 & Exp2;//result is 001000
Result = Exp1 | Exp2; //result is 001111
Result = Exp1^Exp2; //result is 000111

اپراتورهای منطقی:
این اپراتورها بیشتر مورد استفاده برنامه نویسان قرار می گیرد و نتیجه این اپراتورها دو حالت بیشتر ندارد بله یا خیر(true/false) جدول زیر نشان دهنده رفتار این اپراتورها می باشد


برای تعیین مساوی بودن یا نبودن دو عبارت مثلا A==B به این صورت برای کامپیوتر ترجمه می شود که آیا A برابر B هست یا نه؟

==



برای عدم مساوی بودن دو عبارت مثلا A!=B به معنای آیا A با B برابر نیست؟

!=



کوچکتر بودن

<



کوچکتر مساوی

<=



بزرگتر

>



بزرگتر مساوی

>=



اصطلاحا AndAlso خوانده می شود A&&B یعنی آیا هم A درست هست و هم B؟

&&



اصطلاحا OrElse خوانده می شود و A||B یعنی آیا A یا B درست هستند؟

||



اصطلاحا And خوانده می شود A&B یعنی آیا هم A درست هست و هم B؟

&



اصطلاحا Or خوانده می شود A|B یعنی آیا A یا B درست هستند

|



قرینه کردن عبارت هست مثلا اگر A برابر true باشد مقدار !A برابر false و برعکس اگر برابر false باشد !A برابر true خواهد شد

!





همانطور که در بالا می بینید هر دو عملگر && و & یک رفتار را دارند و همینطور عملگر | و || نیز چنین است. تفاوت این عملگرها در یک نکته است وقتی ما از && برای مقایسه دو عبارت استفاده می کنیم و عبارت اول مقدار false باشد قطعا نتیجه false خواهد بود بدون توجه به عبارت دوم بنابراین عملگر دیگر به عبارت دوم نگاه نکرده و نتیجه false را برمیگرداند اما & در هر صورت هر دو عبارت را در نظر می گیرد. حال اگر از || استفاده کنیم و عبارت اول true باشد نتیجه قطعا true خواهد بود و نتیجه عبارت دوم دیگر مهم نخواهد بود بنابراین عبارت دوم را در نظر نخواهد گرفت در حالی که عملگر | در هر صورت هر دو عبارت را در نظر می گیرد.
عملگرهای منطقی بیشتر با ساختارهای شرطی استفاده می شوند C# دارای دو نوع ساختار شرطی است 1- ساختار تک انتخابی و2- ساختار چند انتخابی
ما به چند شکل می توانیم ساختار تک انتخابی را پیداسازی کنیم. در زیر شکل کلی این ساختارها را می بینیم
دستوریا دستوراتی که در صورت درست بودن شرط اجرا می شود ( دستور شرطی)if
یا
if دستور یا دستوراتی که در صورت درست بودن شرط اجرا می شود(دستور شرطی)
elseدستور یا دستوراتی که در صورت غلط بودن شرط اجرا می شود

همانطور که می بینید ابتدا کلمه کلیدی if قرار گرفته و سپس دستور شرطی داخل پرانتز قرار گرفته است. در هر حالتی دستور شرطی باید داخل پرانتز قرار بگیرد. قسمت دستورات می تواند شامل صفر یا چند دستور باشد که هر دستور طبق قانون C# با سمی کالن ازهم جدا می شوند. اگر بخواهیم از چند دستور استفاده کنیم باید دستورات داخل آکولاد ({}) قرار بگیرد. معمولا برنامه نویسان ترجیح می دهند آکولادها برای این ساختار وارد شود و به شکل زیر عمل می کنند
(دستور شرطی)if
{
دستور یا دستوراتی که در صورت صحیح بودن شرط اجرا می شود
}
else
{
دستور یا دستوراتی که در صورت غلط بودن شرط اجرا خواهند شد
}
شکل دیگری ساختار تک انتخابی به شکل زیر استresult = (دستور شرطی )? مقداری که در صورت درست بودن شرط در متغیر قرار می گیرد:مقداری که در صورت غلط بودن شرط درمتغیر قرار می گیرد;
این ساختار به انتخاب شرطی تک خطی معروف هست و همانطور که می بینیم در صورت صحیح بودن تنها یک دستور اجرا خواهد شد و دستور شما باید مقداری را به عنوان نتیجه بر گرداند.
تصویر زیر نشان دهنده هر 3 نوع ساختار است که در صورت بالا بودن متغیر از 70 مقدار pass و در غیر این صورت مقدار fail را در متغیر result ذخیره می کند


نوع دیگری از ساختار انتخابی که بیشتر برنامه نویسان استفاده می کنند ساختار چند انتخابی است. شکل کلی آن به شکل زیر است
(متغیر)swicth
{
:مقدار اول case
دستوراتی که در صورت مساوی بودن متغیر با مقدار1 اجرا خواهند شد
;break
:مقدار دوم case
دستوراتی که در صورت مساوی بودن متغیر با مقدار2 اجرا خواهند شد
;break
.
.
:case nمقدار
اجرا خواهد شدnدستوراتی که در صورت مساوی بودن متغیر با مقدار
;break
:case default
دستوراتی که در صورت مساوی نبودن متغیر با هیچکدام از مقادیر بالا اجرا خواهد شد
;break
{

همانطور که می بینیم این ساختار به بررسی یک متغیر می پردازد و در صورت مساوی بودن متغیر با مقادیر مختلف، دستورات متفاوتی را اجرا می کند.
متغیر استفاده شده در ساختار switch باید یا عدد صحیح یا char یا string باشد و نمی تواند متغیرهای اعداد اعشاری باشد
قسمت default می تواند از ساختار حذف شود.
اگر بخواهیم مقدار متغیر در دو موقعیت دستورات برابری را اجرا کنند یا به عبارت دیگر زمانی که می خواهیم اگر متغیر با 2 مقدار برابر بود دستورات یکسانی را اجرا کند به شکل زیر استفاده می کنیم
(نام متغیر)switch
{
:مقدار1 case
:مقدار2 case
دستوراتی که در صورت مساوی بودن متغیر با مقدار1 یا 2 اجرا خواهد شد
;break
.
.
.
{
قسمت break; باید انتهای دستورات قرار گیرد.
تمام ساختارهای شرطی می توانند تو در تو باشند
(...)if
{
(...)if
}
...
{
else
}
...
{
{

brilliantprogrammer
جمعه 03 بهمن 1393, 21:51 عصر
- حلقه ها (loop ) :
حلقه ها باعث می شود تا یک یا چند دستور دائما تکرار شوند تا زمانی که شرایط خاص برقرار است. C#‎‎‎ دارای 4 نوع ساختار است while, do/while, for, foreach
3 نوع آن را در این قسمت توضیح خواهیم داد و foreach را در فصلهای بعد توضیح داده خواهد شد
ساختار while به شکل زیر است
(دستور شرطی)while
}
دستور یا دستوراتی که در صورت درست بودن شرط اجرا می شود
{
کامپایلر ابتدا دستور شرطی را بررسی می کند اگر شرط برقرار باشد یا به عبارت دیگر اگر عبارت شرطی مقدار true را برگرداند در آن صورت دستور یا دستورات در آکولادها اجرا خواهد شد و دوباره شرط بررسی می شود و باز در صورت true بودن دستورات اجرا خواهد شد. این عمل تا زمانیکه دستور شرطی true می باشد اجرا خواهد شد. اگر دستور شرطی در اولین اجرا مقدار false باشد، کامپایلر دستورات درون آکولاد را اجرا نخواهد کرد.
ساختار do/while مشابه ساختار while است و به شکل زیر می باشد
do
}
دستور یا دستوراتی که در صورت درست بودن شرط اجرا می شود
{
(دستور شرطی)while
تفاوتی که do/while و while باهم دارند در این است که دستور شرطی در ساختار do/while در انتهای آن قرار دارد بنابراین دستورات حداقل یک بار اجرا خواهد شد.
ساختار for معمولا بیشتر مورد استفاده برنامه نویسان قرار می گیرد و به شکل زیر پیاده سازی می شود.
(دستور تکرار, دستور شرطی , دستور شروع)for
}
دستوراتی که در صورت درست بودن شرط اجرا می شود
{
خط تعریف (اولین خط for ) شامل سه قسمت است. دستور شروع هنگام شروع حلقه فقط یکبار اجرا می شود. دستور شرطی مانند ساختارهای قبلی است و یک مقدار true یا false برمی گرداند و دستور تکرار قبل از بررسی مجدد دستور شرطی، اجرا می شود. دستورات واقع در بدنه(دستورات داخل {} ) اگر دستور شرطی مقدار true برگرداند اجرا می شود و اگر مقدار false برگرداند اجرا خاتمه می یابد
شکل زیر نحوه استفاده از 3 ساختار را نشان می دهد

127833
در شکل ما از هر سه ساختار استفاده کردیم و ساختار while و do/while تا زمانیکه متغیر result دارای مقدار کوچکتر 100 هست اجرا می شود و بدنه این ساختارها باعث افزایش یک واحدی result می شود این کار تا زمانی ادامه می یابد که مقدار result برابر 100 شود. در این صورت شرط حلقه ها false شده در نتیجه برنامه از انجام دستورات بدنه آنها صرفه نظر می کند. در ساختار for متغیر i بررسی می شود و با توجه به خط تعریف i قبل از بررسی مجدد شرط، یک واحد افزایش خواهد یافت.
قبل از پایان بحث حلقه ها لازم است نکته ی گفته شود. دستوراتی وجود دارد که باعث می شود روند اجرای حلقه ها تغییر کند یعنی برنامه از مسیر همیشگی خود خارج شود. برخی از این دستورات شامل
break; باعث می شود تا حلقه پایان یافته و برنامه به سراغ دستورات بعد از حلقه خواهد رفت. این کار برای پایان اضطراری استفاده می شود
continue; باعث می شود تا برنامه به خط تعریف ساختار رفته و کار خود را از آنجا شروع کند.

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

#defain و #undef برای نشان گذاری یک محدوده از کدها می باشد. دستور #define باید اولین خط کد در فایل باشد معمولا از این دستورات در ساختار #if استفاده می شود
#if , #elif , #else , #endif مشابه ساختار if, else می باشد با این تفاوت که معمولا عبارت شرطی در این ساختار یک #define است
127872
در بالا شیوه کلی استفاده از این دستورات را می بینیم
#region , #endregion برای دسته بندی کدها استفاده می شود. اگر می خواهیم کدهای خود را در دو بخش ببینیم کافی است دو region تعریف کرده و کدها را داخل آنها قرار دهیم این قسمت فقط جنبه نمایشی دارد.
#error برای نمایش پیغام خطا و به دنبال آن اجرای برنامه متوقف می شود
#warning برای نمایش پیغام خطاست بعد از آن برنامه به کار خود ادامه می دهد

brilliantprogrammer
شنبه 04 بهمن 1393, 20:43 عصر
string -5
در قسمت تعریف متغیرها نوع string را توضیح دادیم و گفتیم که این نوع متغیرها می توانند رشته ها یا متنها را درون خود ذخیره کنند. کلاس string حرف های زیادی برای گفتن دارد ما در این قسمت به توضیح بخشی از آن می پردازیم.
گفتیم که برای ذخیره کردن یک متن در یک کلاس string باید متن مورد نظر درون دو دابل کوتیشن قرار بگیرد

;"هر متن دلخواه "=string strText
اما برای ذخیره بعضی از کاراکترهای خاص C#‎‎‎‎‎‎ علامتهای مشخصی را در نظر گرفته
\' : باعث ذخیره مقدار ' در متغیر می شود
\" : باعث ذخیره مقدار " در متغیر می شود
\\ : باعث ذخیره مقدار / در متغیر می شود
system alert :\a
backspace :\b
form feed :\f
\n : برای ایجاد خط جدید
r\ : باعث می شود تا متن به ابتدای خط شروع شود
u\ : اگر می خواهید مقدار unicode یک عدد را درون متغیر ذخیره کنید از این کاراکتر استفاده کنید
t\ : باعث ایجاد تب در متغیر می شود
v\ : باعث ایجاد تب افقی در متغیر می شود
0\ : باعث می شود تا مقدار null درون متغیر ذخیره شود.
نکته دیگری که بهتر است بدانیم یک متغیر string از مجموع چند متغیر char تشکیل شده به عبارت دیگر متغیرهای char به هم می چسبند و تشکیل یک متغیر string را می دهند.
برای ترکیب دو متغیر یا چسبیدن دو متغیر string می توانیم از + استفاده کنیم

;"string str1 = " this city is;"string str2 = "Kashanstring strMain = str1 + str2; // this city is Kashan
این کار اگر طول متغیرها کوتاه و تعداد الحاق ها کم باشد مفید است اما اگر مقدار الحاق ها زیاد باشد بهتر از از stringbuilder استفاده کنید که در فصلهای آینده توضیح داده خواهد شد
قبلا گفتیم که کلاسها دارای متد هستند و متدها عمل خاصی را انجام داده و مقداری را به فراخوان خود برمی گردانند. یکی از متدهای مفید در کلاس string متد substring می باشد. این متد باعث می شود از یک متن بتوانیم قسمتهای دلخواه خود را انتخاب کنیم. به دو شکل کلی زیر استفاده می شود.

;(5)Result = stringVariable.Substring
این عمل باعث می شود تا رشته مورد نظر از ایندکس مشخص شده انتخاب شود و در متغیر result ذخیره شود.

;(5,7)Result = stringVariable.Substring
این عمل باعث می شود تا رشته مورد نظر از ایندکس مشخص شده انتخاب شود و به مقدار 7 کاراکتر را در متغیر result ذخیره می کند.
127875
باید بدانید که تمام ایندکس ها در C#‎‎‎‎‎‎ از صفر شروع می شود و در متن فضای خالی را نیز باید در نظر بگیریم
()IndexOf و ()LastIndexOf
از این دو متد برای جستجو در متن استفاده می شود. شکل کلی آن به صورت زیر است

;intVariable = strVariable.IndexOf(strSearch)
متد IndexOf باعث می شود تا در متن مورد نظر به جستجو بپردازد و در صورت یافتن متن ایندکس آن را به فراخوان خود ارسال خواهد کرد.

;intVariable = strVariable.IndexOf(strSreach, intStart)
در این حالت نیز جستجو از محل تعیین شده توسط intStart شروع می شود.
LastIndexOf نیز مانند IndexOf عمل می کند با این تفاوت که ایندکس محل برای آخرین جستجو را برمی گرداند.
127873
عمل دیگری که در برنامه ها معمولا استفاده می شود مقایسه دو متن هست. برنامه نویسان معمولا از == برای مقایسه استفاده می کنند اما کلاس string دارای متد Equal() می باشد که می تواند برای این کار استفاده شود. جالب هست که وقتی ما از == استفاده می کنیم در اصل داریم به صورت ضمنی از متد Equal استفاده می کنیم بنابراین استفاده مستقیم از این متد سرعت برنامه را افزایش خواهد داد. این متد به شکل زیر مورد استفاده قرار می گیرد.

if (StrValue1.Equal(strValue2)){.....}
در هنگام مقایسه یا جستجوی این را در نظر بگیرید که C#‎‎‎‎‎‎ نسبت به بزرگ و کوچک بودن حروف حساس است بنابراین is با Is برابر نیست(case sensitive )

brilliantprogrammer
شنبه 04 بهمن 1393, 21:18 عصر
- enum ها
یکی از نوع دادهای مفیدی که C# ارائه داده enum است. فرض کنید شما می خواهید ماههای سال را در برنامه خود ذخیره کنید. ماهها بین 1 تا 12 هستند و ما از یک طرف می خواهیم شماره ماهها در برنامه ذخیره شود از طرف دیگه نام ماهها در برنامه و برای کاربر دیده شود .طراحی این نوع دادها توسط برنامه نویس صورت می گیرد و دارای دو مرحله است در مرحله اول برنامه نویس شکل کلی و دامنه اختیارات enum را تعیین می کند و در مرحله بعد از enum تولید شده در کدنویسی استفاده کند.
شکل کلی طراحی یک enum به صورت زیر است
[access modifiers] enum identifier [:enumType]{body}
{ دستورات بدنه } نوع داده : enum سطح دسترسی
access modifiers یا سطح دسترسی شامل private یا public است در فصل بعدی که در مورد کلاس ها می باشد بیشتر در مورد سطوح دسترسی صحبت خواهیم کرد و خواهید دید که ما 5 نوع سطح دسترسی داریم. قبلا گفتیم که private به معنای دسترسی محدود هست و باعث می شود تا فقط اعضای کلاس جاری بتوانند به enum دسترسی داشته باشند و public به معنای دسترسی آزاد هست و تمام کلاسها در هر فضای نامی می توانند به آن enum دسترسی داشته باشند.
enum همیشه ثابت می باشد و یک کلمه کلیدی است
identifier شناسه یا یک اسم دلخواه هست
در قسمت : enumType نشان می دهیم این enum شامل چه نوع داده ی می باشد
{body} نیز بدنه enum است و دستورات در این قسمت قرار می گیرد.
127877
توجه داشته باشید که enum ها در بدنه کلاس ها تعریف می شوند و استفاده از آنها در داخل یک متد صورت می گیرد. هنگام استفاده ما متغیری از نوع enum تولید شده ساختیم اما می توانستیم یک متغیر از نوع short نیز تعریف کنیم و مقدار enum را داخل آن قرار دهیم
;short CurrentMonth
;CurrentMonth = (short)enmMonth.بهمن

نوع یک enum باید عدد صحیح باشد و اگر تعیین نشود int در نظر گرفته خواهد شد.

brilliantprogrammer
شنبه 04 بهمن 1393, 21:28 عصر
7- آرایه ها Array
در اصل آرایه ها مجموعه ی از متغیرها هستند با یک نام مشابه و نوع متغیر یکسان. شیوه تعریف یک آرایه به شکل زیر است
;Type identifier [] = new Type [n]
[ عدد] نوع آرایه new = []شناسه نوع آرایه
فرض کنید قصد دارید نام 5 نفر را در برنامه ذخیره کنید برای این کار می توانید 5 متغیر string تعریف کرده و هر کدام نامها را درون خود ذخیره کنند اما روش دیگر تعریف یک آرایه با طول 5 می باشدکه درون هر عضو آن یک نام ذخیره می شود
;[5]string[] PersonName = new string
;"PersonName[0] = "Mohammad
";PersonName[1] = "Ali
...
هر یک از اعضای یک آرایه مانند یک متغیر رفتار می کند. آرایه ها را در هنگام تعریف نیز می توان مقدار دهی کرد
;string[] PersonName = new string[] {"Mohammad", "Ali", .... }
در این روش لازم نیس طول آرایه را تعیین کنیم چون با توجه به تعداد اعضای که به متغیر اختصاص می دهیم C# طول آرایه را می سازد.
همانطور که در مثال می بینید آرایه ها از ایندکس صفر شروع می شوند.
آرایه ها می توانند چند بعدی تعریف شوند که در این حالت مشابه ماتریس ها در ریاضی و ضرب دکارتی آنها عمل می کنند
;[2,2]string[,] PersonName = new string
";PersonName[0,0] = "Mohammad
;"PersonName[0,1] = "Sissoko
";PersonName[1,0] = "Habib
;"PersonName[1,1] = "Koloture

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


توضیحات

نوع

نام



تعداد اعضای آرایه را تعیین می کند

Instance Property

Length



تعداد ابعاد آرایه را نشان می دهد

Instance Property

Rank



برای ساختن آرایه روش دیگری هم وجود دارد که استفاده از این متد هست

Static Method

CreateInstance



ایندکس آرایه را در بعد n ام نشان می دهد و همیشه یکی کمتر از تعداد اعضاست(چون ایندکس ها از صفر شروع می شوند

Instance Method

GetUpperBound (n)



برای مرتب سازی آرایه

Static Method

Sort



برای معکوس کردن آرایه

Static Method

Reverse



برای جستجوی یک مقدار در آرایه هست و مشابه IndexOf و LastIndexOf توضیح داده شده در string ها عمل می کند

Static Method

IndexOf,LastIndexOf



برای کپی یک آریه و ساختن آرایه جدید که به همان تعداد اعضا دارد اما مقادیر آنها انتقال نمی یابد

Instance Method

Clone



کپی یک متغیر به همراه مقادیر اعضای آنها در دیگری

Static Method

Copy



برای پاک کردن یک آرایه

Static Method

Clear





ممکن است بپرسید منظور از instance و static چیست. برای توضیح این مطالب باید با کلاس ها آشنایی داشته باشید اما من اینجا توضیح مختصری می دهد instance شامل متد یا خصوصیتی است که برای استفاده از آنها باید از کلاس یک آبجکت ساخته شود اما static متد یا خصوصیتی است که لازم نیست از کلاس آبجکت بسازیم و مستقیما از کلاس می توانیم استفاده کنیم.
System.Array Inst = new System.Array();
Inst.Clone(..) ; //ok
System.Array.Clone(..);//Failed Because its not static
System.Array.Clear();//Ok it is static and no necessary create instance

brilliantprogrammer
شنبه 04 بهمن 1393, 21:30 عصر
Reference Type And Value Type-8
آخرین قسمت این فصل را به توضیح در مورد نوع دادها می پردازیم. در C# دو نوع داده وجود دارد Reference و Value . متغیرهای که در ابتدای فصل توضیح داده شد نوع Value هستند به استثنا متغیرهای string که از نوع referencce می باشد.
تفاوت این دو از نظر فیزیکی به نحوه ذخیره سازی دادهای خود درون حافظه کامپیوتر برمی گردد. هنگامی که یک متغیر از نوع Value ساخته شده و مقداری در آن قرار می گیرد، آن مقدار به صورت مستقیم در حافظه کامپیوتر ذخیره می شود اما هنگامی که یک متغیر از نوع reference تعریف می شود یک قسمت کوچکی از حافظه اشغال شده و در آن دادهای به صورت رمزنگاری شده قرار می گیرند و وقتی مقداری در متغیر reference ذخیره می شود آن قمست رمزنگاری شده به قسمتهای دیگری از حافظه اشاره می کند که آن قسمتها دادها را در خود ذخیره می کنند.
127878
تفاوت برنامه نویسی این دو را در فصل بعد و هنگام ارسال دادها به متدها خواهیم دید.
این فصل به پایان رسید در فصل بعد کلاس ها را به دقت بررسی خواهیم کرد و امکاناتی که در طراحی کلاسها توسط C# برای برنامه نویسان قرار دارد را خواهید دید

فانوس1
جمعه 18 اردیبهشت 1394, 21:41 عصر
سلام
من این حلقه را ایجاد کردم نمیدونم چرا andش درست کار نمی کنه یعنی وقتی یکی از شرط ها true شد میاد بیرون:متعجب::متعجب::متعجب:

while (!(x == e.X) && !(y == e.Y))
ممنون.

فانوس1
یک شنبه 20 اردیبهشت 1394, 17:31 عصر
سلام
من این حلقه را ایجاد کردم نمیدونم چرا andش درست کار نمی کنه یعنی وقتی یکی از شرط ها true شد میاد بیرون:متعجب::متعجب::متعجب:

while (!(x == e.X) && !(y == e.Y))
ممنون.
حل شد.حل شد.