تبليغاتX
جادوي سي شارپ
کلاسهای (Abstract):
کلاسهای Abstract کلاسهایی هستند که دارای یک یا چند متد پیاده سازی نشده هستند.  اگر متدی رو به شکل abstract تعریف کردید، باید کلاس رو هم به شکل abstract تعریف کنید. بطور مثال یک کلاس پایه با نام Shape تعریف می کنیم که پارامترهایی رو نگهداری می کنه و یک شی Pen هم برای رسم می سازیم. متد draw برای رسم استفاده می شه و ما اون رو فقط تعریف می کنیم و کدی رو برای پیاده سازی اون نمی نویسیم، چون هر شکلی به روش رسم خاصی نیاز دارد. (زمانی از کلاسهای Abstract استفاده می کنیم که بخواهیم کلاس پایه ای داشته باشیم و متدهای اون در کلاسهای مشتق شده نیاز به بازنویسی داشته باشه) به لیست کد 1 دقت کنید:
// List Code 1
public abstract class Shape
{
protected int height, width;
protected int xpos, ypos;
protected Pen bPen;
//-----
public Shape(int x, int y, int h, int w)
{
width = w;
height = h;
xpos = x;
ypos = y;
bPen = new Pen(Color.Black);
}
//-----
public abstract void draw(Graphics g);
//-----
public virtual float getArea()
{
  return height * width;
}
}
توجه کنید که ما متد draw رو به شکل abstract تعریف کرده ایم و پس از تعریف با استفاده از ; انتهای تعریف متد را مشخص کرده ایم. کلاس تعریف شده نیز به شکل abstract تعریف شده است.
همچنین برای استفاده از کلاسهای abstract نیز باید از کلاسهای مشتق شده اون یک نمونه بگیرید و از کلاس abstract نمی توان یک نمونه ایجاد کرد. ادامه مسیر ساخت کلاس رو پی می گیریم و حالا باید کلاس Rectangle رو بسازیم. برای این منظور کلاس مورد نظر رو از کلاس Shape که به شکل Abstract تعریف شده مشتق می کنیم. به لیست کد 2 توجه فرمایید:

// List Code 2 (Rectangle class derived from abstract base class)
public class Rectangle:Shape
{
public Rectangle(int x, int y,int h, int w):base(x,y,h,w) {}
//-----
public override void draw(Graphics g)
{
  g.DrawRectangle (bPen, xpos, ypos, width, height);
}
}
کلاس Rectangle کلاسی است که می توانید از آن یک نمونه بگیرید. که یک متد draw واقعی دارد و می تواند رسم مستطیل را انجام دهد. برای مثال کلاس دومی رو هم پیاده سازی کرده ایم. به لیست کد 3 دقت نمایید که پیاده سازی کلاس Circle را نمایش می دهد.
// List Code 3 (Circle class derived from abstract base class)
public class Circle :Shape
{
public Circle(int x, int y, int r):base(x,y,r,r) {}
//-----
public override void draw(Graphics g)
{
  g.DrawEllipse (bPen, xpos, ypos, width, height);
}
}
حالا می خواهیم که بر اساس کلاس های تعریف شده، نمونه ای ایجاد کنیم. در لیست کد 4 نمونه های تعریف شده اند که پارمترهای مورد نیاز با استفاده از سازنده اون ارسال شده است.

// List Code 4
public class Form1 : System.Windows.Forms.Form
{
private PictureBox pictureBox1;
private Container components = null;
private Shape rect, circ;
//-----
public Form1()
{
  InitializeComponent();
  init();
}
//-----
private void init()
{
  rect = new CsharpPats.Rectangle (50, 60, 70, 100);
  circ = new Circle (100,60, 50);
}
}
در آخر، در رویداد Paint رسم دایره و مستطیل رو انجام می دهیم. به لیست کد 4 دقت نمایید که یک دایره و یک مستطیل رسم شده است.

// List Code 5
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics ;
rect.draw (g);
circ.draw (g);
}
تمرین: یک پروژه برای مثال این پست ساخته آن را برای رسم پنج ضلعی منتظم توسعه دهید.

مقایسه کلاسهای Abstract و کلاسهای Interface:
- زمانی که یک کلاس واسط Interface Class تعریف می کنیم، مجموعه ای از تعریف یک یا چند متد رو خواهیم داشت که باید برای هر کلاسی که از این واسط مشتق می شود کد نویسی شود. هیچ کدی اولیه ای برای کلاسها نوشته نخواهد شد. در این حالت شما یک ساختار درختی از وراثت کلاسها خواهید داشت که از کلاس پایه (کلاس واسط) نمی توان نمونه ای ایجاد کرد و اگر متدی از واسط رو در کلاس خارجی تعریف و کد نویسی نکنید حتما با خطای کامپایلر مواجه خواهید شد.
- زمانی که یک کلاس Abstract می سازید، شما یک کلاس پایه با تعریف یک یا چند متد دارید که ممکن است کد نویسی شده  یا نشده باشند و به شکل Abstract تعریف شده است. شما نمی توانید از یک کلاس Abstract نمونه بگیرید و البته می توانید از کلاس مشتق شده از کلاس Abstratct که متدهای اون پیاده سازی شده است، نمونه بگیرید. اگر همه متدهای تعریف شده در کلاس بدون کد باشند، این کلاس کاملا مشابه کلاسهای واسط خواهد بود با این محدودیت که نمی توانید از آن مانند کلاس واسط ساختار درختی وراثت را داشته باشید. بیشترین استفاده از کلاسهای Abstract فراهم نمودن تعریف کلاس پایه ای است برای کلاسهای مشتق شده ای که می خواهند کاری را انجام دهند و به برنامه نویس اجازه داده می شود که شخصا کدهای موردنیازش را در کلاسهای مشتق شده مختلفی پیاده سازی نماید. استفاده دیگر پیاده سازی متدهای خالی از کد است که ممکن است در کلاسهای مشتق شده دیگر پیاده سازی نشده باشند و بخواهید اطمینان داشته باشید که پروژه شما کامپایل خواهد شد.
به مثال زیر توجه نمایید (لیست کد 6):
// List Code 6
public class NullShape
{
protected int height, width;
protected int xpos, ypos;
protected Pen bPen;
//-----
public Shape(int x, int y, int h, int w)
{
width = w;
height = h;
xpos = x;
ypos = y;
bPen = new Pen(Color.Black );
}
//-----
public void draw(Graphics g){}
//-----
public virtual float getArea()
{
  return height * width;
}
}
در این مثال متد draw خالی رها شده و کدی برای آن نوشته نشده است و کلاس مشتق شده بدون مشکل کامپایل خواهد شد. و هیچ اشاره ای به اینکه این متد یک متد Abstract بازنویسی شده است نمی شود.

بسیار عالی، این آخرین قسمت از آموزش کلاس در سی شارپ بود که تقدیم دوستان شد. سری بعدی آموزش رو هنوز در نظر نگرفتم ولی به احتمال بسیار زیاد بحث UML Diagram رو شروع خواهم کرد. در کنار این موضوع سعی می کنم مطالب جدید و پراکنده ای هم در سایت قرار بدم. و مثل همیشه و طبق معمول از دیر بروزرسانی شدن وبلاگ عذر خواهی می کنم.


تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، کلاس، تعریف کلاس، ارث بری، کلاس مشتق شده، کلاس پایه، کلاس واسط
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#, Abstract Class,Abstract, Class, Inheritance, Derived Class, Base Class, Derived Abstract Class, Example, Interface, Interface Class
+ نوشته شده در  سه شنبه بیست و هشتم آبان 1387ساعت 14:30  توسط کنستانتین  | 
واسطها (Interfaces):
یک واسط یا Interface شامل تعاریفی است برای یک کلاس که این تعاریف شامل معرفی مجموعه ای از متدها با آرگومانهای مشخص است. اگر کلاسی دارای اون متدها باشد، میگیم که این کلاس از یک واسط Implement شده است. این فرض و قولی است برای اینکه شما مطمئن باشید که یک کلاس حتما دارای متدهای نام برده شده باشد. واسط تعریف امضای متدهای عمومی هست ولی بدنه این متدها کاملا خالی هستند.
اگر یک کلاس از یک واسط Implement شده باشد که نام واسط xyz باشد، می توانید به اون کلاس ارجاع داشته باشید همانطوری که به واسط ارجاع داشته اید. و تا زمانی که سی شارپ اجازه نمی دهد که یک کلاس از بیش از یک کلاس به ارث برسد، تنها راه برای اینکه کلاس از بیش از یک کلاس به ارث برسد، استفاده از کلاس واسط هست.
حالا بهتره با یک مثال مطلب خودمون رو ادامه بدیم، در این مثال ما یک کلاس از نوع واسط داریم که لیستی از عناصر انتخاب شده یا یک لیست از عناصر CheckBox را فراهم می کند. (لیست کد1)
// List Code 1
public interface IMultiSelect
{
  void Clear();
  System.Collections.ArrayList GetSelected();
}
همانطور که می بینید این واسط دارای دو متد است یکی با نام Clear و دیگری با نام GetSelected که بدنه اون هم خالی است.
حالا اگر بخواهیم کلاسی رو از این واسط Implement کنیم، ابتدا باید در تعریف این کلاس واسط رو مشخص کنیم و سپس تمامی متدهای واسط رو در کلاس جدید پیاده سازی کنیم. به لیست کد 2 دقت کنید:
// List Code 2 (Class Sample Implemented On IMultiSlect Interface)
public class ListSelect : IMultiSelect
{
public ListSelect() { }
public void Clear() { }
public System.Collections.ArrayList GetSelected()
{
  return new System.Collections.ArrayList();
}
}
در پروژه های بزرگ اول واسطها تعریف می شوند و بعد کلاسها بر اساس اونها تعریف می شوند. معمولا متدهایی رو هم به عنوان رزرو تعریف می کنند که این متدها در زمانهای آپگرید برنامه ممکن است مورد استفاده قرار بگیرند. با این ترتیب چون ساختار کلاس، یا به اصطلاح امضای کلاس تغییری نمی کند پروژه با کپی فایل DLL جدید براحتی قابل بروزرسانی است و نیازی نسیت که کل پروژه مجددا ساخته شده و از طرف مشتری نصب شود.
پیشنهاد می شود در پروژه های خود ابتدا واسطها رو تعریف کنید و حتی متدهایی رو هم که فعلا نیاز ندارید رو در تعریف واسط قرار بدید سپس به پیاده سازی کلاسها بپردازید. (لازم نیست که دوباره به این نکته اشاره کنم که پیاده سازی واسط چون کدی در بدنه متدها ندارد عمل وقت گیری نخواهد بود).
تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، واسط، تعریف واسط، کلاس، تعریف کلاس، ارث بری، ارث بری بیش از یک کلاس
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#, Interface, Inheritance, Inherited Class, Drived Class, Declare Interface, Declare Class, Inherit from more class
+ نوشته شده در  شنبه نوزدهم مرداد 1387ساعت 15:37  توسط کنستانتین  | 
بازنویسی کنترلهای ویندوزی:
در سی شارپ می تونید به سادگی کنترلهای ویندوزی جدیدی رو بر اساس کنترلهای ویندوزی ایجاد نمایید. برای مثال ما یک جعبه متن با قابلیت جدیدی ایجاد می کنیم. قصد داریم برای مثال، زمانی که کنترل جدید دارای فوکوس شود متن داخل آن بطور کامل به حالت انتخاب درآید. در سی شارپ کنترل جدید از روی کنترل ویندوزی موجود مشتق می شود. برای شروع یک کلاس جدید به پروژه اضافه کنید و تعریف کلاس رو به شکل زیر تغییر بدید:
public class HighlighterTextBox: System.Windows.Forms.TextBox
ما نام کنترل جدید را HighlighterTextBox گذاشتیم و اون رو از کلاس TextBox مشتق کردیم یا به اصطلاح کنترل ما از کنترل TextBox اینهریت (Inherit) شده است. برنامه رو کامپایل کنید (F6) بعد از کامپایل برنامه یک کنترل جدید در لیست کنترلهای ویندوزی به نام HighlighterTextBox اضافه خواهد شد.
تصویر کنترل ساخته شده در ToolBox ویژوال استدیو
حالا شما می تونید از این کنترل جدید در تمامی فرمهای پروژه استفاده کنید. در ادامه ما قصد داریم کدهای این کلاس رو طوری تغییر بدیم که در زمان گرفتن فوکوس متن داخل اون به حالت انتخاب دربیاد. در کد زیر این تغییرات دیده می شوند:
public class HighlighterTextBox : System.Windows.Forms.TextBox
{ public HighlighterTextBox()
{
  init();
}
private void init()
{
  //add event handler to Enter event
  this.Enter += new System.EventHandler(highlight);
}
//event handler for highlight event
private void highlight(object obj, System.EventArgs e)
{
  this.SelectionStart = 0;
  this.SelectionLength = this.Text.Length;
}
}

برای تست برنامه یک نمونه از جعبه متن ساخته شده رو از جعبه ابزار ویژوال استدیو بروی فرم قرار بدید و یک جعبه متن معمولی هم برای مقایسه روی فرم قرار بدید. حالا اگر برنامه رو اجرا کنید و متنی رو داخل هر دو تایپ کنید، با حرکت بین کنترلها می بینید که متن داخل هر دو جعبه متن انتخاب می شود. این همان حالت AutoHighlight در سی شارپ است که برای کنترل جعبه متن وجود دارد. برای اینکه بتونید تفاوت بین دو کنترل رو ببینید بین متن داخل هر دو کنترل کلیک کنید و سپس با استفاده از کلید TAB بین آن دو حرکت کنید، حالا خواهید دید که فقط متن داخل کنترل ما به حالت انتخاب در می آید و نه کنترل ویندوزی.
در مثال دوم قصد داریم یک خصوصیت نمایش تاریخ به این کنترل اضافه کنیم. این خصوصیت باعث خواهد شد که جعبه متن ما بتوانید تاریخ را نمایش دهد. برای این منظور یک خصوصیت برای نمایش تاریخ به نام ShowDateTime از جنس bool تعریف می کنیم و در زمانی که خصوصیت دارای مقدار true است تاریخ را نمایش می دهد.
کد زیر خصوصیت مورد نظر را نمایش می دهد. (برای اینکه این خصوصیت را در پنجره خصوصیات کنترل ببینید باید یکبار برنامه را کامپایل کنید).
// add new property to control
private bool showDateTime;
public bool ShowDateTime
{ get {return showDateTime;}
set
{
  showDateTime = value;
  if (showDateTime)
    this.Text = DateTime.Now.ToString();
}
}
تمرین: کنترل جدیدی بر اساس کنترل جعبه متن بسازید که دارای قابلیت نمایش تاریخ به دو شکل میلادی و شمسی رو داشته باشه. و بتونید همیشه تاریخ داخل کنترل رو به جهت مخالف تبدیل کنید. می تونید این کنترل رو توسعه بدید و از اون برای ورود اعداد و متن هم استفاده کنید.
از اینجا می تونید کد نمونه رو دانلود کنید.
تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، جعبه متن، پروژه، کد نمونه، کنترل ویندوزی، ساخت کنترل، انتخاب متن، ارث بری کنترل، ویژوال استدیو، ساخت خصوصیت
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#, Textbox, Button, Project, Sample Code,Windows Control, User Control, Create Control, SelectionStart, SelectionLenght, Inheritance, Inherited control, Drived Control, Visual Studio, VS, Property, Create Property
+ نوشته شده در  سه شنبه بیست و هشتم خرداد 1387ساعت 20:55  توسط کنستانتین  | 
گروه اعتبار سنجی - ValidationGroup:
یکی از مشکلات استفاده از کنترلهای سنجش اعتبار یا Validation Controls اینه که اگر در یک صفحه چند گروه مختلف کنترل داشته باشیم و بخواهیم هر دسته از کنترلها رو با در شرایط خاصی چک کنیم به مشکل برخواهیم خورد.
1- بطور مثال اگر در یک صفحه دو دسته اطلاعات مختلف به همراه دو دکمه برای ثبت هر کدام از گروه های اطلاعاتی داشته باشیم نمی توان از کنترلهای اعتبار سنجی به روش پیش فرض استفاده کرد.
2- شاید صفحاتی رو که دارای دکمه ثبت و دکمه پاک کردن اطلاعات هستند رو دید، در این صفحات نیز مشکل اعتبار سنجی وجود داره! چرا؟ چون اگر کاربر بخواهد اطلاعات صفحه رو پاک کنه به مشکل اعتبار برخواهد خورد و کد مربوط به پاک کردن محتویات کنترلها اجرا نخواهد شد.
3- مثال آخر اینکه در صفحه ای که کنترلهای اعتبار سنجی وجود دارند و شما بخواهید از یک دکمه دیگر مثل نمایش اطلاعات اضافی استفاده کنید
در کل در تمام صفحاتی که به غیر از دکمه اصلی که معمولا ثبت هست یک کنترل دارای خاصیت PostBack استفاده کنید، کنترلهای اعتبار سنجی شما به خطا خواهند رفت، زیرا جلوی هر PostBack صفحه را خواهند گرفت.

پیشنهاد می کنم اگر با این مشکل قبلا روبرو نشدید حتما یک پروژه تمرینی بسازید تا بهتر مطالب رو درک کنید. برای این منظور یک پروژه وب جدید ایجاد کرده و دو textbox و دو button به اون اضافه کنید. می تونید از کنترلهای اعتبار سنجی Requierd Field Validator استفاده کنید و تنظیمات اون رو انجام بدید. یک کد برای دکمه ثبت و کدی جهت پاک کردن خصوصیات Text دو textbox بنویسید. اگر همه چی رو درست تنظیم کرده باشید، خواهید دید که تا زمانی که هر دو جعبه متن پر نشده باشند نمی توان از دکمه پاک کردن استفاده کرد.

خوب حالا می ریم سراغ تمرین خودمون یعنی بکارگیری Validation Group: برای این منظور یک پروژه وب ایجاد کنید.
دو asp:textbox به عنوان گروه اول اضافه کنید و برای این دو کنترل، دو کنترل asp:RequiredFieldValidator اضافه کنید و خصوصیت ControlToValidate آن دو را به دو کنترل TextBox مرحله قبل تنظیم کنید.
دو کنترل asp:button به صفحه اضافه کنید، یکی با عنوان Submit و دیگری با عنوان Reset برای دکمه Reset کدی جهت پاک کردن دو کنترل جعبه متن مرحله قبل بنویسید.
دو یا سه asp:textbox دیگر به صفحه اضافه کنید و مانند مراحل قبل برای آنها از asp:RequiredFieldValidator استفاده کنید.
دو کنترل asp:button مانند مراحل قبلی اضافه کنید با همان نام.
پروژه را اجرا نموده و از دکمه های Submit و Reset استفاده کنید. نتیجه را مشاهده کنید. این همان مشکل استفاده پیش فرض از کنترلهای اعتبارسنجی است.
کد زیر لیست کنترلها و تنظیم خصوصیات اصلی آنها رو مشخص می کنه:
1. asp:TextBox ID="txtName"
2. asp:RequiredFieldValidator ID="rfvName" ControlToValidate="txtName" ErrorMessage="*"
3. asp:TextBox ID="txtFamily"
4. asp:RequiredFieldValidator ID="rfvFamily" ControlToValidate="txtFamily" ErrorMessage="*"
5. asp:Button ID="btnSubmit" Text="Submit"
6. asp:Button ID="btnReset" Text="Reset"
7. asp:TextBox ID="txtIDNo"
8. asp:RequiredFieldValidator ID="rfvIDNo" ControlToValidate="txtIDNo" ErrorMessage="*"
9. asp:TextBox ID="txtUserName"
10. asp:RequiredFieldValidator ID="rfvUserName" ControlToValidate="txtUserName" ErrorMessage="*"
11. asp:TextBox ID="txtPassword"
12. asp:RequiredFieldValidator ID="rfvPassword" ControlToValidate="txtPassword" ErrorMessage="*"
13. asp:Button ID="lblSubmitExtraInfo" Text="Submit Extra Info"
14. asp:Button ID="lblResetExtraInfo" Text="Reset Extra Info"

کدهای مربوط به دو دکمه Reset:
protected void btnReset_Click(object sender, EventArgs e)
{
  txtName.Text = "";
  txtFamily.Text = "";
}
protected void btnResetExtraInfo_Click(object sender, EventArgs e)
{
  txtIDNo.Text = "";
  txtUserName.Text = "";
  txtPassword.Text = "";
}
خوب حالا که مشکل کنترلهای اعتبارسنجی رو به روش پیش فرض استفاده شون دیدیم، میخواهیم اون مشکل رو با استفاده از خصوصیت ValidationGroup حل کنیم. بسیار روش ساده ای رو در پیش رو داریم. برای این منظور باید خصوصیت ValidationGroup هر گروه از کنترلها رو با یک مقدار مشخص مقداردهی کنیم. دو کنترل اعتبارسنجی گروه اول رو با دکمه Submit در یک گروه قرار میدیم (کنترلهای 2،4 و 5). سه کنترل اعتبارسنجی و دکمه Submit دوم را نیز در یک گروه دیگر قرار می دیم. (8،10،12 و 13)
پروژه رو اجرا کنید و نتیجه رو ببینید.
کنترلهایی که باید تغییر پیدا کنند در زیر لیست شده اند: (به خاصیت ValidationGroup دقت کنید)
1. asp:RequiredFieldValidator ID="rfvName" ControlToValidate="txtName" ErrorMessage="*" ValidationGroup="groupName"
2. asp:RequiredFieldValidator ID="rfvFamily" ControlToValidate="txtFamily" ErrorMessage="*" ValidationGroup="groupName"
3. asp:Button ID="btnSubmit" Text="Submit" ValidationGroup="groupName"
4. asp:RequiredFieldValidator ID="rfvIDNo" ControlToValidate="txtIDNo" ErrorMessage="*" ValidationGroup="groupExtraInfo"
5. asp:RequiredFieldValidator ID="rfvUserName" ControlToValidate="txtUserName" ErrorMessage="*" ValidationGroup="groupExtraInfo"
6. asp:RequiredFieldValidator ID="rfvPassword" ControlToValidate="txtPassword" ErrorMessage="*" ValidationGroup="groupExtraInfo"
7. asp:Button ID="lblSubmitExtraInfo" Text="Submit Extra Info" ValidationGroup="groupExtraInfo"
برای راحتی و حصول نتیجه کامل یک برنامه نمونه آماده شده که می تونید اون رو از اینجا دانلود کنید.
تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، ای اس پی دات نت، وب، اعتبارسنجی، جعبه متن، دکمه، پروژه، کد نمونه
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#, ASP.Net, Web, Web Development, Solution, Validation Group, Textbox, Button, Project, Sample Code
+ نوشته شده در  شنبه چهاردهم اردیبهشت 1387ساعت 15:1  توسط کنستانتین  | 
در ابتدا به نمایندگی از کلیه نویسندگان وبلاگ جادوی سی شارپ سال نو رو به شما تبریک می گم.
شاید برای ببیندگان و خوانندگان وبلاگ جادوی سی شارپ این سوال وجود داشته باشه که چرا اینقدر وبلاگ دیر بروزرسانی میشه! در این خصوص من فقط یک توضیح کوچولو عرض کنم که کلیه نویسندگان وبلاگ مشغله کاری فراوانی دارند و در کمترین زمان بدست آمده از فرصتهای پیش آمده استفاده می کنند و وبلاگ رو بروزرسانی می کنند. در این میان اگر دقت کرده باشید معمولا مدیر وبلاگ سعی بر ارائه جدیدترین اطلاعات در زمینه سی شارپ داره که خود این به چند دلیل زمان بیشتری رو طلب می کنه و من شخصا از آقای صافدل (ققنوس) به عنوان مدیر وبلاگ جادوی سی شارپ تشکر می کنم.



فضای نام : Namespace
ویژوال استدیو برای هر پروژه ای که شروع می کنید یک فضای نام با نام پروژه ایجاد می کند، البته شما می تونید با استفاده از پنجره خصوصیات ابن نام را تغییر دهید یا اینکه اون رو خالی کنید که به معنای اینه که پروژه شما در فضای نام قرار ندارد. همچنین شما این اجازه رو دارید که فضای نام خود را تعریف کنید. با استفاده از فضای نام می تونید کلاسهایی با نامه های مشابه در یک پروژه ایجاد نمایید، برای این منظور کافیست هر کلاس را در یک فضای نام مجزا قرار دهید. در زمان استفاده از کلاس مورد نظر نیز باید فضای نام آن را مشخص نمایید. در لیست کد 1 یک کلاس تعریف شده با نام Rectangle دیده می شود که همنام با کلاس Rectangle از فضای نام Drawing است:
/// Sample Code 1
CsharpPats.Rectangle cpRect;
System.Drawing.Rectangle sdRect;

private void init()
  {
    rect1 = new CsharpPats.Rectangle (10, 20, 70, 100);
    rect2 = new System.Drawing.Rectangle (20, 30, 80, 200);
  }

تعاریف Public, Private و Protected:
در سی شارپ می توان متدهای کلاس و متغیرها را به شکل Public, Private یا Protected تعریف نمود. متد یا خصوصیت Public یا عمومی در کلاسهای دیگر قابل دسترس است. متد یا خصوصیت Private یا خصوصی فقط در همان کلاس قابل دسترس است. معمولا تمامی متغیرهای کلاس را به شکل Private خصوصی تعریف می کنیم و برای دسترسی به آنها از توابع دسترسی Get و Set استفاده می کنیم. اینکه متغیرهای در خارج از کلاس در دسترس باشند، ایده بسیار بدی خواهد بود. زیرا این امر تخلف از قانون کپسوله نمودن (Encapsulation) در شی گرایی است. یا به عبارت دیگر تمامی متغیرهای کلاس فقط باید در محدوده کلاس قابل دسترس باشند.
در سی شارپ می توان متدها و متغیرها را به شکل Protected یا محافظ شده نیز تعریف نمود. متد یا متغیر محافظت شده در تمامی کلاس و زیرکلاسهای تعریف شده قابل دسترس است. یا بطور ساده متد یا متغیر محافظت شده فقط در همان کلاس یا کلاسهایی که از آن مشتق می شوند قابل دسترس است و خارج ار کلاس نمی توان به آن دسترسی داشت.

Overloading:
در سی شارپ نیز همانند دیگر زبانهای برنامه نویسی شی گرا می توان یک متد با نام یکسان و آرگومانها یا امضای مختلف تعریف نمود. برای مثال ما می خواهیم یک متد برای رسم مستطیل تعریف نماییم که از آن برای رسم مستطیل و مربع استفاده نماییم. در این حالت یک متد رسم دارای چهار آرگومان و دیگری دارای سه آرگومان خواهد بود. به لیست کد 2 توجه کنید:
/// Sample Code 2
namespace Draw
{
  class Rectangle
  {
public void DrawRect(long x,long y,long w,long h)
{
  // Write Your Code Here [Draw Rectangle]
}
public void DrawRect(int x,int y,int w)
{
  // Write Your Code Here [Draw Square]
}
  }
}
در مثال فوق یک فضای نام به اسم Draw تعریف شده که دارای دو متد یکسان با آرگومانهای مختلف است (متد Draw اصطلاحا Overload شده است) تصویر زیر استفاده از کلاس Rectangle را در زمان کد نویسی نمایش می دهد.

Draw.Rectangle drawingRect=new Draw.Rectangle();
drawingRect.DrawRect(15,25,200,40);
drawingRect.DrawRect(30,20,50);

کلمات کلیدی Virtual و Override:
اگر متدی رو می خواهید در اختیار کلاسهای مشتق شده از کلاس برای بازنویسی قرار بدید، باید اون رو از نوع Virtual تعریف کرده باشید. این به معنی اینه که کلاس مشتق شده از کلاس پایه می تواند دارای یک متد با نام، آرگومان و امضای یکسان با متدی از کلاس پایه باشد. در این حالت شما باید متد خود را با کلمه کلیدی Override در کلاس مشتق شده تعریف نمایید.
- دقت کنید که اگر در کلاس مشتق شده یک متد را Override کنید بدون اینکه همان متد در کلاس پایه Virtual تعریف شده باشد، کامپایلر یک خطا از شما خواهد گرفت.
- اگر یک متد را بدون استفاده از کلمه کلیدی Override مجددا بازنویسی نمایید نیز کامپایلر یک خطا از شما خواهد گرفت.
- اگر متدی رو در کلاس پایه Virtual تعریف نکرده باشید و در در کلاس مشتق شده متدی با همان نام بدون کلمه کلیدی Override تعریف کنید، خطایی رخ نخواهد داد و کامپایلر فقط یک اخطار تولید خواهد کرد و متد تعریف شده نیز قابل استفاده است.
در لیست کد 3 مثالی از تعریف متدهای Override دیده می شود (برای تست کد زیر یک کلاس به پروژه اضافه نمایید و کدهای آن را با کد زیر جایگزین کنید):
/// Sample Code 3
namespace Draw
{ class Rectangle
{ public void DrawRect(long x, long y, long w, long h)
{
  // Write Your Code Here [Draw Rectangle]
}
public void DrawRect(int x, int y, int w)
{
  // Write Your Code Here [Draw Square]
}
virtual public void DrawSquare(int x, int y, int w)
{
  // Write Your Code Here [Draw Square]
  System.Windows.Forms.MessageBox.Show("DrawSquare From Base Class Called");
}
}
class Square : Rectangle
{ public void DrawCircle(int x, int y, int r)
{
  // Write Your Code Here [Draw Circle]
}
override public void DrawSquare(int x, int y, int w)
{
  System.Windows.Forms.MessageBox.Show("DrawSquare From Derived Class Called");
  // Write Your Code Here [Draw Double Square]
}

}
}

جایگزینی یک متد با استفاده از کلمه کلیدی
یک راه دیگر برای بازنویسی متدی که در کلاس پایه به صورت Virtual تعریف نشده است، استفاده از کلمه کلیدی new در کلاس مشتق شده است. اگر از این روش استفاده کنید، متد کلاس پایه در کلاس و در زمان استفاده مخفی خواهد بود. دقت کنید که در این حالت امکان دسترسی به متد پایه نخواهد بود و شما باید کدهای مورد نظر خود را در کلاس مشتق شده بطور کامل بنویسید.

public new void DrawLine(int x,int y,int w,int h)
{
  // Write Your New Code Here [Draw Line]
}

تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، سی شارپ مقدماتی، آموزش ربان سی شارپ، شی گرایی در سی شارپ، فضای نام، عمومی، خصوصی، محافظت شده، بازنویسی، متد، کپسوله کردن، کلاس، کد نمونه
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#, Introduction to C#, CSharp Guide, Object Oriented In C#, Namespace, Public, Private, Protedted, Override, Overload, Virtual, new, Encapsulation, Class, Method, Sample Code
+ نوشته شده در  شنبه سوم فروردین 1387ساعت 23:56  توسط کنستانتین  | 
سلام خدمت کلیه دوستان همیشگی جادوی سی شارپ
با توجه به رشد روزافزون وب تصمیم گرفتم که مقاله ای در خصوص وب تهیه کنم و با توجه به اینکه MasterPage یکی از قابلیتهای بسیار عالی در 2005 هست تصمیم گرفتم مقاله ای رو در همین راستا آماده و به دوستانم ارائه کنم.
یکی از مشکلات من در طراحی وب سایت در زمان ASP.NET 1.x این بود که بخوام قالب وب سایت رو عوض کنم، این به معنی تغییر کلیه صفحه های وب سایت و آپلود همه اونها بود که مشکلات این تغییر هم بسیار واضح هست، مثل اشتباهات کاربری، حجم زیاد دوباره کاری، آپلود صفحات زیاد و .... خوشبختانه در ASP.NET 2.0 با ظهور MasterPage این مشکل به راحتی مرتفع گردید.
در خصوص صفحه اصلی یا همورن MasterPage دو مقاله تهیه شده، اولین مقاله شامل آشنایی، مفاهیم و امکانات این قابلیت هست و دومین مقاله به زبان بسیار ساده و به صورت قدم به قدم روش پیاده سازی و بهره مندی از این قابلیت رو شرح میده:
مقله اول:
صفحه اصلی در ASP.NET (در یک نگاه)
فهرست:
  • نحوه کار صفحه اصلی
  • فواید استفاده از صفحه های اصلی
  • رفتار زمان اجرای یک صفحه اصلی
  • صفحه اصلی و مسیر صفحه محتوی
  • صفحه اصلی و تم ها
  • حوزه صفحه اصلی
دریافت مقاله صفحه اصلی در ASP.NET (در یک نگاه)

مقاله دوم:
مثال عملی استفاده از صفحه اصلی در ASP.NET (قدم به قدم)
شامل دو مثال پیاده سازی صفحه اصلی
دریافت مقاله مثال عملی استفاده از صفحه اصلی در ASP.NET (قدم به قدم)
دریافت کدهای مقاله مثال عملی استفاده از صفحه اصلی در ASP.NET (قدم به قدم)



پاسخ به سوالات

عمار دوست عزیز:
در خصوص بدست آوردن شماره سطر و ستون اشاره گر در یک کنترل RichText می تونید از متدها و خصوصیات زیر استفاده کنید:
SelectionStart: این خصوصیت، مکان اشاره گر را به شما برمیگرداند (در کل متن)
GetLineFromCharIndex: این متد شماره خطی مورد نظر شما را برمی گرداند (کافیست به اون شماره اندیس اشاره گر رو بدید)
GetFirstCharIndexFromLine: شماره اندیس اولین کاراکتر یک خط رو برمی گردونه
یک مثال هم نوشته شده که می تونید کد اون رو از اینجا دریافت کنید

int startSelection = 0;
int row = 0;
int col = 0;

startSelection = rtbBody.SelectionStart;
row = rtbBody.GetLineFromCharIndex(startSelection);
col = startSelection - rtbBody.GetFirstCharIndexFromLine(row);
row++;

امیر جان:
در خصوص گرفتن تصویر از صفحه دسکتاپ می تونید از سایتهای زیر استفاده کنید. در دات نت به صورت مستقیم روشی برای این کار وجود ندارد و شما باید به صورت UnManaged این عمل رو انجام بدید.
c-sharpcorner
codeguru
تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، صفحه اصلی، مستر پیج، ام اس دی ان،نگهدارنده محتوا،ارجاع دادن به منابع خارجی،کنترلهای سرور، تم، مقاله، وب، دات نت 2، 2005، طراحی وب سایت، پیاده سازی، مثال، کد، برنامه، ریچ تکیت، سطر، ستون
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#,MasterPage, MSDN, ContentPlaceHolder, Refrence to external resource, Server Controls, Theme, Research, Document, Web, Web 2.0, Dot Net 2.0, VS 2005, Web Site Design, Implementation, Sample, Code, Source Code, Programe, RichText, Row, Col, Managed Code
+ نوشته شده در  یکشنبه نهم دی 1386ساعت 8:28  توسط کنستانتین  | 
وراثت :: Inheritance
یکی از مهمترین مباحثی که در برنامه نویسی زبانهای شی گرا (مانند سي شارپ و وي بی دات نت) وجود دارد، وراثت یا Inheritance است. وقتی که ما یک پروژه ویندوزی مانند برنامه Hello World رو شروع می کنیم، محیط برنامه نویسی ویژوال استدیو (Visual Studio .NET Integrated Development Environment) یک تعریف به شکل زیر رو ایجاد می کند:
public class Form1 : System.Windows.Forms.Form
این تعریف به معنای این است که فرم ایجاد شده فرزند کلاسی به نام Form است. که دارای مفاهیم بسیار قوی است. ما می توانیم اشیایی رو بسازیم و خصوصیات آنها رو تغییر بدهیم. در این صورت رفتار هر شی بصورت خاص همان شی ولی در کل مشابه کلاس اصلی خواهد بود. در زیر مثالهایی برای این موضوع رو می بینید:

سازنده ها: (Constructors)
همه کلاسها دارای یک سازنده یا Constructor هستند که در زمان ایجاد یک نمونه از کلاس فراخوانی می شوند. سازنده همیشه همنام با نام کلاس است. اگر به کد تولید شده در برنامه Hello world نگاهی بیندازید، کدی مشابه کد زیر را خواهید دید:
/// Sample Code 1
public class Form1
{
  public Form1() //constructor
  {
    InitializeComponent();
  }
}
زمانی که یک کلاس را تعریف می کنید، باید یک سازنده برای مقداردهی اولیه آن ایجاد نمایید. البته می توانید پارامترهایی رو به اون ارجاع بدید تا مقداردهی آرگومانهای کلاس مطابق آنچه شما مد نظر دارید مقداردهی شوند. اگر شما برای کلاسی که می نویسید سازنده قرار ندهید، یک سازنده بدون آرگومان در حالت مخفی ساخته می شود.
متد InitializeComponent توسط IDE ساخته شده که حاوی دستورات ساخت و جانمایی کنترلها روی صفحه است. اگر احتیاج به مقداردهی و یا اجرای دستورات خاص دیگری باشد، من یک متد دیگر معمولا به نام Init ایجاد می کنم و دستورات مورد نظر را در آن قرار می دهم. این متد پس از فراخوانی InitializeComponent فراخوانی می شود:

/// Sample Code 2
public Form1() //constructor
{
  InitializeComponent();
  Init();
}
private void Init()
{
  pi=3.141259f; //set initial value of pi
}

رسم و گرافیک در سی شارپ
[این مطلب در خصوص وراثت آمده و در بخش های بعدی مطلب گرافیک بصورت مجزا مورد بحث قرار خواهد گرفت]
در اولین مثال ما یک برنامه گرافیکی داریم که دارای یک PictureBox است و می خواهیم که یک خط در آن رسم کنیم، در سی شارپ، رسم محتویات پنجره به عهده سیستم ویندوز خواهد بود در زمان این اتفاق رویداد Paint مورد استفاده قرار می گیرد. پس می توانیم کد مورد نظر خود را در این رویداد بنویسیم تا در زمان فراخونی رویداد Paint شکل مورد نظر ما نیز رسم شود. (رویداد paint در زمانهایی مثل تغییر سایز، رسم مجدد، مخفی شدن قسمتی از پنجره اتقاق می افتد) برای این منظور یک کنترل PictureBox روی فرم قرار داده شده.
یک رویداد Paint به کنترل تصویر اضافه کرده، کدی مانند کد زیر ایجاد می شود:
private void pic_Paint(object sender, PaintEventArgs e)
{
}
همچنین کد زیر در متد InitializeComponents قرار می گیرد:
this.pic.Paint += new PaintEventHandler(this.pic_Paint);
شی PaintEventArgs توسط روتینهای سیستمی سطح پایین پاس داده می شود. برای رسم یک شی ابتدا باید یک شی Pen ایجاد نمایید، رنگ آن را مشخص نموده و در صورتی که مایل بودید می توانید پهنای آن را مشخص نمایید. در مثال زیر شی Pen با رنگ مشکی و پهنای پیش فرض 1 استفاده شده است:
/// Sample Code 3
private void pic_Paint(object sender, PaintEventArgs e)
{ Graphics g = e.Graphics; //get Graphics surface
Pen rpen = new Pen(Color.Black); //create a Pen
g.drawLine(rpen, 10,20,70,80); //draw the line
}
در این مثال، نشان داده شده که یک قلم در هر بار فراخوانی رویداد Paint ساخته شده. ما می توانیم یک قلم را در سازنده کلاس پنجره Window's Constructor یا در متد Init قرار دهیم و هر بار فقط از آن استفاده نماییم.

استفاده از وراثت
وراثت در سی شارپ این قابلیت را به ما می دهد که یک کلاس از کلاس آماده دیگر مشتق بگیریم. در کلاس جدید مشتق شده ما فقط می توانیم متدهای جدید را اضافه نماییم یا متدهای قبلی را تغییر دهیم. بقیه موارد دیگر بصورت خودکار از کلاس پایه به کلاس جدید به ارث خواهد رسید. برای دیدن این موضوع من یک کلاس Rectangle ساده می نویسم که یک مستطیل در پنجره رسم خواهد کرد. این کلاس دارای دو متد و یک سازنده است:
/// Sample Code 4
namespace CsharpMagic
{ public class Rectangle
{ private int x, y, w, h;
protected Pen rpen;
public Rectangle(int x_, int y_, int w_, int h_)
{ x = x_; //save coordinates
y = y_;
w = w_;
h = h_;
//create a pen
rpen = new Pen(Color.Black);
}
//--------------------------
public void draw(Graphics g)
{ //draw the rectangle
g.DrawRectangle (rpen, x, y, w, h);
}
}
}
تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، برنامه نویسی، وراثت، شی گرا، کلاس، شی، سازنده، کد نمونه، مقداردهی اولیه، رسم و گزافیک، رویداد، شی قلم 
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#, Programming, Inheritance, Object Oriented (OO), Class, Object, Instance, Sample Code, Initialize, Darwing and Graphics, Event, Pen Object, PaintEventArgs, Underlying System
+ نوشته شده در  پنجشنبه بیست و چهارم آبان 1386ساعت 20:25  توسط کنستانتین  | 
تولد سی شارپ بلاگ
سلام
آبان ماه، ماه تولد وبلاگ جادوی سی شارپ هست. به همین مناسبت یک سری کتاب الکترونیکی بسیار جذاب و مفید براتون انتخاب کردیم و در سایت قرار دادیم که بتونید از اونها استفاده ببرید.
این کتابها در دو قالب تک فایلی و یک مجموعه تکه تکه شده (15 قسمتی از نوع rar) ارائه شده تا هر کسی با هر روشی که می تونه آنها رو دانلود کنه.
Welcome to csharpblog.
This month (persian calendar) is a birth month of our weblog (CSharpMagic) and we have a gifts for you ;-).
You can download many ebook from here. two collection is collected for two type user:
1- You can download the first collection by selecting a book that you need.
2- Or you can download all ebooks from one package in 15 piece of [.rar] files.
دریافت کتابهای الکترونیکی به صورت فایلی
ردیف نام کتاب مسیر دانلود
1 (ADO.Net) [Wrox] Professional ADO.Net Programming download
2 (ADO.NET) ADO NET System XML Classes Poster download
3 (ADO.NET) MS Press Building Secure ASP dot NET Applications download
4 APress Distributed Dot NET Programming In C Sharp download
5 ASP dot NET Database Programming Weekend Crash Course download
6 Microsoft SQL Server 2005 New Features (McGraw-Hill, 2005, 0-0722-2776-1) download
7 MS Press - Introduction.to.MS.ASP.NET download
8 MSAJAX-ToDoList download
9 OReilly.Ajax.Design.Patterns.Jun.2006 download
10 OReilly.Learning.SQL.Aug.2005 download
11 OReilly.Programming.Atlas.Sep.2006 download
12 Pragmatic-Ajax a Web 2.0 Primer download
13 Sams.Microsoft.SQL.Server.2005.Changing.the.Paradigm.Aug.200 download
14 sams.teach.yourself.ajax.in.10.minutes.apr.2006 download
15 SQL 2005 download
16 Sybex Dot NET Web Services Solutions download
17 Wrox.Professional.Ajax.Feb.2006 download
18 Wrox.Professional.DotNetNuke.ASP.dot.NET.Portals.May.2005.eBook-DDU download
password: csharpblog.blogfa.com

دریافت کتابهای الکترونیکی به صورت یک فایل چند قسمتی
حجم هر فایل 7mb است
ردیف مسیر دانلود
1 http://rapidshare.com/files/67846551/Csharpblog.blogfa.com_Ebooks.part01.rar
2 http://rapidshare.com/files/67847087/Csharpblog.blogfa.com_Ebooks.part02.rar
1 http://rapidshare.com/files/67847628/Csharpblog.blogfa.com_Ebooks.part03.rar
2 http://rapidshare.com/files/67848162/Csharpblog.blogfa.com_Ebooks.part04.rar
1 http://rapidshare.com/files/67848742/Csharpblog.blogfa.com_Ebooks.part05.rar
2 http://rapidshare.com/files/67849388/Csharpblog.blogfa.com_Ebooks.part06.rar
1 http://rapidshare.com/files/67849978/Csharpblog.blogfa.com_Ebooks.part07.rar
2 http://rapidshare.com/files/67850701/Csharpblog.blogfa.com_Ebooks.part08.rar
1 http://rapidshare.com/files/67851515/Csharpblog.blogfa.com_Ebooks.part09.rar
2 http://rapidshare.com/files/67852243/Csharpblog.blogfa.com_Ebooks.part10.rar
1 http://rapidshare.com/files/67852962/Csharpblog.blogfa.com_Ebooks.part11.rar
2 http://rapidshare.com/files/67853570/Csharpblog.blogfa.com_Ebooks.part12.rar
1 http://rapidshare.com/files/67854081/Csharpblog.blogfa.com_Ebooks.part13.rar
2 http://rapidshare.com/files/67854672/Csharpblog.blogfa.com_Ebooks.part14.rar
1 http://rapidshare.com/files/67854988/Csharpblog.blogfa.com_Ebooks.part15.rar
password: csharpblog.blogfa.com
تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، برنامه نویسی، کتاب الکترونیکی، بانک اطلاعاتی، طراحی وب سایت،  آژاکس، وب سرویس، دات نت نوک، کتابهای رایگان در زمینه کامپیوتر
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#, Programming, ADO.NET, XML,XML Poster, ASP.NET, Security, Distributed .NET, SQL Server 2005, Ajax, Web 2.0, Web Services, Dot Net Nuke,.Net Nuke, C# ebook, C shap ebook, book, rapidshare, Computer EBook, Wrox, OReilly, Secure Web, APress, Database programming, McGraw-Hill, Atlas, ASP.NET Ajax, Design Pattern, Sybex, Portal, rapidshare.com, Free Ebook
+ نوشته شده در  چهارشنبه شانزدهم آبان 1386ساعت 16:25  توسط کنستانتین  | 
سلام
ادامه مطلب استفاده از کلاسها و اشیا در سی شارپ
لازم به ذکر هست که این قسمتها، مربوط به مطالب پایه ای کلاسها و اشیا هستند و بعدا در قسمتهایی بصورت مفصل راجع به کلاسها و اشیا صحبت خواهد شد.

استفاده از کلاس برای قالب دهی و تبدیل
خیلی وقتها از متدها برای تبدیل نوعهای مختلف داده و قالب دهی آنها استفاده می شود. البته از کلاسها برای مخفی سازی جزییات تبدیل نیز استفاده می شود. برای مثال، ممکنه شما برنامه ای طراحی کرده باشید که یک مقدار ساعت رو به شکل عدد از ورودی بگیرد.
0321.53
03:21:53
به عنوان تمرین پیاده سازی این کلاس ساده به عهده شما است.

استفاده از کلاس به جای شی
تفاوت عمده بین زبانهای روالی و زبانهای شی گرا، حضور کلاس است. در مثال قبل (اینجا) نمونه ای از یک کلاس رو دیدید که دارای دو نوع متد خصوصی و عمومی بود که هر کدام می تونستند دارای داده هم باشند. کلاسها به شکل منحصربفرد ولی با نمونه های بیشماری به عنوان اشیا در برنامه می تواند حضور داشته باشد که هر نمونه دارای یک مجموعه مستقل از داده است.

کلاسها و خصوصیات (Class and Properties)
کلاسها در سی شارپ می توانند حاوی خصوصیات باشند که هر خصوصیت می تواند از هر نوع داده ای که در سی شارپ موجود است تعریف شده باشد. در مثال زیر ما یک کلاس داریم که دارای دو متد (برای تعیین کردن و گرفتن مقدار) و یک خصوصیت است:
/// LIST 1
private int mAge;
//age property
public int age {
get {
  return mAge;
}
set {
  mAge = value;
}
}
دقت کنید که در تعریف خصوصیات از پرانتز استفاده نمی شود و از کلمه value برای داده ذخیره شده استفاده می شود.

استفاده از شرط در تعیین داده های کلاس
یک کلاس محل مناسبی برای کپسوله سازی خطاها است. برای مثال ممکن است کاربر برای یک داده از نوع عدد صحیح که در کلاس تعریف شده قرار است ساعت را نکهداری کند، شرط تعیین زمانهای مجاز مطرح می شود: ساعت 0 تا ساعت 23.
در صورتی که عددی بزرگتر یا کوچکتر از محدوده مورد نظر به کلاس داده شود، می توان رفتارهای مختلفی را براساس تعاریف برنامه انجام داد. در مثال زیر در صورتی که عدد ورودی برای ساعت نامتعبر باشد، مقدار 0 به عنوان عدد معتبر پذیرفته می شود.
/// LIST 2
public int setHour(int hour)
{ if (hour > 23 || hour < 0)
  mHour = 0;
else
  mHour = hour;
}

مقداردهی اولیه به متغیرها و پارمترهای مورد نیاز در کلاس
برای تعیین مقادیر پیش فرض برای پارامترهای موجود در یک کلاس و مقداردهی اولیه به آنها از سازنده کلاس استفاده می شود. همانطور که قبلا اشاره شد، سازنده کلاس یک متد بدون خروجی است.
/// LIST 3
public FormatTime(string entry)
{
 errflag = false;
}


تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، کلاس، شی، عمومی، خصوصی، متد، برنامه نویسی، کد نمونه، سازنده، نمونه شی
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#, Class, Object, Public, Private, Method, Programming, Sample Code, Source Code, Constructor, Instance
+ نوشته شده در  یکشنبه بیست و نهم مهر 1386ساعت 19:17  توسط کنستانتین  | 
سلام
چند وقتی بود به دلیل مشکلات کاری نتونستم پستی را داشته باشم که در این مدت دوستان خوبم زحمت زیادی کشیدند که وبلاگ بروزرسانی بشه. به هر حال دوباره پستهام رو شروع می کنم که کمتر زحمت به دوستان بدم.
ادامه مطالب آموزش سی شارپ مقدماتی رو در این پست خواهیم داشت:

سری چهارم از آموزش زبان سی شارپ


استفاده از کلاسها و اشیا در سی شارپ
همه برنامه های سی شارپ از کلاسها بهره می برند. یک برنامه ویندوزی شامل یک پنجره خود از کلاسی به نام Form استفاده می کند.
در سی شارپ مفهوم ماژولها داده های عمومی و داده های مشترک که جز مفاهیم کلاس نیستند، وجود ندارد.
یک کلاس ترکیبی از متدهای Public (عمومی) و Private (خصوصی) است. معمولا ما هر کلاس را در یک فایل می نویسیم. البته این یک قانون نیست.
وقتی که یک کلاس را می سازیم، این کلاس به تنهایی موجودیتی ندارد ولی می توانیم یک نمونه Instance از آن را با استفاده new ایجاد نماییم. وقتی یک نمونه از یک کلاس را می سازیم می توانیم داده هایی را برای شروع ساخت نمونه به کلاس پاس بدیم. این عمل را با استفاده از constructor انجام می دهیم. یک سازنده (constructor) یک متد هم نام با نام کلاس است که هیچ نوع داده خروجی ندارد و پارمترهای ورودی آن می توانند از صفر به بالا باشند که به ازاء هر نمونه شی ساخته شده ارسال می شوند.

برنامه نمونه تبدیل دما
در این قسمت یک برنامه نمونه خواهیم نوشت. این برنامه یک مبدل دما از سانتیگراد به فارنهایت است. اگر خاطرتان باشد، آب در صفر درجه منجم شده و در صد درجه بخار می شود (البته بر حسب سانتی گراد) و در 32 درجه فارنهایت منجمد و در 212 درجه فارنهایت به بخار تبدیل می شود. خوب حالا میشه به راحتی درجه سانتیگراد رو به درجه فارنهایت تبدیل کرد.
مقیاس تبدیل ما همین درجه انجماد و بخار است که برابر با 100 درجه سانتی گراد و 180 درجه فارنهایت است، پس مقیاس تبدیل ما برابر با 100/180 یا 5/9 است. و چون آب در 32 درجه فارنهایت منجمد می شود پس 32 درجه دیگر اختلاف خواهیم داشت. در نتیجه:
C=(F-32)*5/9
F=5/9*C+32
ما در برنامه این امکان را به کاربر می دهیم تا درجه حرارت مورد نظر خود را وارد نمایید و سپس مشخص کند که به کدام واحد تبدیل شود. در آخر با زدن دکمه تبدیل (Convert) عمل تبدیل واحد صورت می گیرد.
تصویر این برنامه را در شکل زیر می بینید:
تصویر برنامه تبدیل دما

این هم کد برنامه تبدیل:

// LIST 1
private void btnConvert_Click(object sender, EventArgs e)
{ float temp, newTemp;

//convert string to input value
temp = Convert.ToSingle(txtTemprature.Text);

//see which scale to convert to
if (opFahrenheit.Checked)
newTemp = 9 * temp / 5 + 32;
else
newTemp = 5 * (temp - 32) / 9;

//put result in label text
lblResult.Text = newTemp.ToString();
txtTemprature.Text = ""; //clear entry field
}

یک کلاس در سی شارپ یک ماژول است که می تواند دارای دو تابع یا روال از نوع Public و Private باشد. این تابع ها یا روالها در کلاس متد (Method) نامیده می شوند.
برای ایجاد یک کلاس در محیط ویژوال استدیو از منوی Project گزینه Add class را انتخاب می کنیم. وقتی که نامی را برای کلاس انتخاب می کنیم، ویژوال استدیو کلاسی را با همان نام و با محتویات خالی ایجاد می نماید. بطور مثال اگر نام فایل را Temprature انتخاب کنیم کدی مانند کد زیر توسط ویژوال استدیو ایجاد می شود:

// LIST 2
using System;
using System.Collections.Generic;
using System.Text;

namespace Temprature_Convertor
{ class Temprature
{
}
}

برای اینکه در خصوص متدهای نوشته شده توضیحاتی را ارئه نمایید می توانید از Summary استفاده کنید. برای این مننظور به روش زیر عمل کنید:

// LIST 3
///


/// Temprature Class for Converting 2way Celesuis and Fahrenheit
///

class Temprature
{
}

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

// LIST 4
private int mDegree;
public Temprature(int Degree)
{ mDegree = Degree; }
public float GetCelesuis()
{ return 5 * (mDegree - 32) / 9; }
public float GetFahrenhiet()
{ return 9 * mDegree / 5 + 32; }

دقت کنید که متغیر mDegree بصورت Private تعریف شده است. این به معنای این است که، متغیر mDegree در خارج کلاس Temprature، قابل دیدن و دسترسی نیست.این متغیر فقظ توسط متدهای تعریف شده داخل همان کلاس قابل دسترسی است.
با این روش پیاده سازی می توانیم تغییرات مورد نیاز را بدون اینکه کاربر از داخل کلاس اطلاعاتی داشته باشد را اعمال کنیم. برای مثال می خواهیم تبدیل کلوین رو هم اضافه کنیم. درجه حرارت صفر کلوین معادل 273.16- درجه سانتیگراد است که به معنای پایین ترین درجه حرارت ممکن است. که در آن هیچ جسمی حرکت نخواهد کرد. مقدار مقیاس کلوین مشابه سانتیگراد است و در نتیجه برای محاسبه کافیست کلوین با درجه حرارت جمع شود تا معادل سانتیگراد آن بدست آید.

// LIST 5
public float GetKelvin()
{ return GetCelesuis() + (float) 273.16; }

وظیفه این متد تبدیل درجه حرارت فارنهایت به سانتیگراد است.

تمامی حکم ها داخل کلاس قرار می گیرند
بهترین روشی رو که میشه استفاده کرد تا کاربر از هر پیچیدگی بدور باشد، استفاده از کلاس هست. خوب بهترین حالت ممکن هم این هست که کاربر بدون درنظر گرفتن کد داخل کلاس، کد مربوط به تبدیل رو در رویداد کلیک دکمه تبدیل می نویسه.

// LIST 6
private void btnConvert_Click(object sender, EventArgs e)
{ int Degree = System.Convert.ToInt32(txtTemprature.Text);
Temprature temp = new Temprature(Degree);
if (opCelesius.Checked)
lblResult.Text = temp.GetCelesuis().ToString(); else lblResult.Text = temp.GetFahrenhiet().ToString(); txtTemprature.Text = "";
}

اگر این کد رو با کد لیست 1 مقایسه کنید می بینید که در کد لیست 6 هیچ گونه دستوری در خصوص حل مسله دیده نمی شود ولی در کد لیست 1 شما دستورات حل مسله را به وضوح می تونید ببینید. حتی با یک تغییر در کد کلاس می تونید عمل تصمیم گیری جهت تبدیل رو هم به کلاس واگذار کنید و کاربر رو با کمترین پیچیدگی روبرو کنید. برای این منظور باید سازنده کلاس تغییر پیدا کرده و یک متد جدید هم به اون اضافه کنیم تا اون متد عمل تبدیل رو انجام بده. در این حالت میشه متدهای قبلی رو از حالت Public خارج کرده و به متدهای Private تبدیل کنیم، زیرا کاربر احتیاجی به این متدها جهت تبدیل نخواهید داشت. به کد زیر دقت کنید:

/// LIST 7
class SimpleTemprature
{ private int mDegree;
private bool mConvertWay;
public SimpleTemprature(int Degree,bool convertWay)
{ mDegree = Degree;
mConvertWay = convertWay;
}
public float GetConvertedTemorature()
{ if (mConvertWay)
  return GetCelesuis();
else
  return GetFahrenhiet();
}
private float GetCelesuis()
{
  return 5 * (mDegree - 32) / 9;
}
private float GetFahrenhiet()
{
  return 9 * mDegree / 5 + 32;
}
}

در این حالت کاربر کمترین درگیری را با حل مسله خواهد داشت، دقت کنید که در زمان استفاده از این کلاس، سازنده کلاس مقدار درجه و جهت تبدیل را می گیرد و کاربر فقط متد GetConvertedTeprature را صدا می زند و مقدار تبدیل یافته را می گیرد. البته این کد رو هم شما به عنوان مثال می تونید بنویسید. آخرین نکته که در این کد دیده میشه تبدیل متدهای قبلی Public به Private هست که در این حالت کاربر فقط یک متد GetConvertedTeprature را در دسترس خواهد داشت.

تگهای فارسی: مهدی ریزوندی، سی شارپ، سي شارپ، کلاس، شی، عمومی، خصوصی، روال، تابع، متد، برنامه نویسی، کد نمونه، سازنده، نمونه شی، سانتیگراد، فارنهایت، برنامه مبدل واحد دما
English Tags: Mehdi Rizvandi, Csharp, C sharp, C#, Class, Object, Public, Private, Subroutin, Function, Method, Programming, Sample Code, Source Code, Constructor, Instance, Celesuis, Fahrenhiet, Converting Tempratue Program
+ نوشته شده در  یکشنبه هشتم مهر 1386ساعت 8:32  توسط کنستانتین  |