تبليغات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  توسط کنستانتین  | 
فرض کنید که تو برنامتون یه enum دارید که شامل برندهای موبایله و کابر باید نام برند مورد نظرشو وارد کنه و شما بر اساس اون واکنش نشون بدید.

enum MobileBrands : short
{
Nokia,
SonyEricson,
HTC
};


در این صورت برای تبدیل رشته ورودی به enum از چه روشی استفاده می کنید؟ اگه رشته ورودی را مستقیما بخواهید توی متغیری از جنس enum بریزید (مثل کد زیر)

static void Main(string[] args)
{
MobileBrands brands;
string brandName = Console.ReadLine();
brands=brandName;
}


خطای زیر اتفاق میفته:

Cannot implicitly convert type 'string' to 'EnumConvert.MobileBrands'

راه دوم اینه که با استفاده از switch متغیر مورد نظر را مقداردهی کنیم:

static void Main(string[] args)
{
MobileBrands brands;
string brandName = Console.ReadLine();
switch(brandName)
{
case "HTC":
brands=MobileBrands.HTC;
break;
case "Nokia":
brands=MobileBrands.Nokia;
break;
case "SonyErricson":
brands=MobileBrands.SonyErricson;
break;
}
}


اما راه سوم و ساده ترین راه استفاده از متد Enum.Parse است. به مثال زیر توجه کنید:

static void Main(string[] args)
{
MobileBrands brands;
string brandName = Console.ReadLine();
brands = (MobileBrands)Enum.Parse(typeof(MobileBrands), brandName);
}


اگه روش سوم را با Generic ادغام کنیم می تونیم متدی بنویسیم که هر رشته ای را به enum مورد نظر تبدیل کنه:

public static T StringToEnum(string paranName)
{
return (T)Enum.Parse(typeof(T), paranName);
}


به نحوه استفاده از این متد توجه کنید:

static void Main(string[] args)
{
MobileBrands brands;
string brandName = Console.ReadLine();
brands=StringToEnum(brandName);
}


+ نوشته شده در  شنبه نهم شهریور 1387ساعت 0:15  توسط ققنوس  | 
پاسخ به نظرات
یاسمن عزیز در مورد یه قطعه کد C# توضیح خواستن که توضیحش اینه:
خط 1: آرایه ای از نوع Point گرفته به تعداد 10 تا
خط 2: یک شی از نوع Point گرفته
خط 3: CopyTo محتوای شی Tn2 را در Tn1 کپی می کند. توجه کنید به این نکته که اگه دوشی را با استفاده از علامت = برابر همدیگه قرار بدید آدرس اون اشیا باهم یکی میشه یعنی واقعا اون دو شی باهم یکی میشن نه اینکه باهم برابر می شن!
خط 4و5و6: از Convert.Toint32 برای تبدیل به اعداد int 32 بیتی استفاده میشه و از Convert.ToSingle برای تبدیل به اعداد اعشاری استفاده میشه.
پیشنهاد می کنم مقاله گرافیک در .NET را مطالعه کنید.

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

مجیدجان برای این کار باید از Hook یا Subclass استفاده کنی. اون سایتها و وبلاگها هم حق داشتن چون این مبحث گسترده و پیچیده است. تازه اگه بخوای از این دو روش استفاده کنی کد شما Unmanaged میشه. ولی اگه بازم می خوای پیگیری کنی یه پروژه توی Codeproject هست که یه Library برای استفاده از Hook و Subclass در .NET ارائه داده. زحمت جستجوش با خودت!



DebuggerStepThrough
نکته جالبی که به تازگی بهش برخوردم یه Attribute به نام DebuggerStepThrough است. حتما تا حالا با این مشکل مواجه شدید که در حال Debug بصورت خط به خط (با استفاده از کلید F11) کنترل اجرای برنامه برای مقداردهی Property ها و یا خواندن مقدار اونا دائما وارد کد اونها یا همون Property Accessor ها میشه که این مسئله باعث میشه تا زمان زیادی برای Debug کدتون هدر بره. در وهله اول به راحتی می تونید با استفاده از کلید F10 این مشکلو برطرف کنید! اما در بیشتر مواقع نوع کد باعث میشه که نتونید این کار را انجام بدید! به مثال زیر توجه کنید:
کلاس Person دارای سه Property به نامهای PersonName و Grade و Salary است. متد CalculateSalary برای محاسبه حقوق بر اساس درجه کارمند و حقوق پایه استفاده می شود. اگر کد فراخوانی متد CalculateSalary شما به شکل زیر باشه:

calcSalary=CalculateSalary(p.Grade, p.Salary);

در اینجا اگه با کلید F10 بخواید تو کدتون حرکت کنید نمی تونید کد متد CalculateSalary را قدم به قدم مشاهده کنید اگه با کلید F11 حرکت کنید کد مربوط به Proprty های Grade و Salary را هم باید قدم به قدم مشاهده کنید. برای جلوگیری از این حالت DebuggerStepThrough را باید برای Property های مورد نظر استفاده کنید. به عنوان مثال تعریف Grade و Salary به شکل زیر نوشته خواهد شد:
public int Grade
{
[DebuggerStepThrough]
get { return _grade; }
[DebuggerStepThrough]
set { _grade = value; }
}

public int Salary
{
[DebuggerStepThrough]
get { return _salary; }
[DebuggerStepThrough]
set { _salary = value; }
}



از این Attribute می تونید برای متدها، Property Accessor ها، کلاسها و structها استفاده کنید.

 



تگهای فارسی: محمد صافدل، سی شارپ، سي شارپ، دیباگ
English Tags: Mohammad Safdel,Csharp, C sharp, C#, Debug, DebuggerStepThrough, Attribute
+ نوشته شده در  یکشنبه بیست و هفتم مرداد 1387ساعت 13:18  توسط ققنوس  | 
واسطها (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  توسط کنستانتین  | 
در ابتدا به نمایندگی از کلیه نویسندگان وبلاگ جادوی سی شارپ سال نو رو به شما تبریک می گم.
شاید برای ببیندگان و خوانندگان وبلاگ جادوی سی شارپ این سوال وجود داشته باشه که چرا اینقدر وبلاگ دیر بروزرسانی میشه! در این خصوص من فقط یک توضیح کوچولو عرض کنم که کلیه نویسندگان وبلاگ مشغله کاری فراوانی دارند و در کمترین زمان بدست آمده از فرصتهای پیش آمده استفاده می کنند و وبلاگ رو بروزرسانی می کنند. در این میان اگر دقت کرده باشید معمولا مدیر وبلاگ سعی بر ارائه جدیدترین اطلاعات در زمینه سی شارپ داره که خود این به چند دلیل زمان بیشتری رو طلب می کنه و من شخصا از آقای صافدل (ققنوس) به عنوان مدیر وبلاگ جادوی سی شارپ تشکر می کنم.



فضای نام : 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  توسط کنستانتین  | 
وراثت :: 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  توسط کنستانتین  | 
سلام
ادامه مطلب استفاده از کلاسها و اشیا در سی شارپ
لازم به ذکر هست که این قسمتها، مربوط به مطالب پایه ای کلاسها و اشیا هستند و بعدا در قسمتهایی بصورت مفصل راجع به کلاسها و اشیا صحبت خواهد شد.

استفاده از کلاس برای قالب دهی و تبدیل
خیلی وقتها از متدها برای تبدیل نوعهای مختلف داده و قالب دهی آنها استفاده می شود. البته از کلاسها برای مخفی سازی جزییات تبدیل نیز استفاده می شود. برای مثال، ممکنه شما برنامه ای طراحی کرده باشید که یک مقدار ساعت رو به شکل عدد از ورودی بگیرد.
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  توسط کنستانتین  | 
قبل از هر چيز سال نو را به همتون تبريک مي گم و اميدوارم که سال خوب و خوش و پر برکتي را در پيش داشته باشيد.
تو اين پست چند نکته بدرد بخور تو دات نتو باهم مرور مي کنيم. البته اغلب شما با اين نکات آشنا هستيد ولي يادآوري اونا بد نيست.

نکته 1: بدست آوردن مسير فولدرهاي خاص در دات نت


اين کارو با استفاده از GetFolderPath از کلاس System.Environment انجام ميديم. مثال زير مسير فولدر MyDocuments رو در يه متغير String ذخيره مي کنه:

String myDocPath=System.Environment.GetFolderPath(
System.Environment.SpecialFolder.Personal);


نکته 2: بدست آوردن مسير اجراي فايل Exe:


اين کارو با استفاده از کد زير انجام بديد:

String appPath=Application.ExecutablePath;


شما مي تونيد همين کارو با استفاده از Reflection بصورت زير انجام بديد:

String appPath=System.Reflection.Assembly.GetExecutingAssembly().Location;


نکته 3: ست کردن کليد پيش فرض و کليد انصراف در يک فرم


کليد پيش فرض در يه فرم به کليدي مي گن که وقتي Enter فشار داده شد رويداد Click مربوط به اون اجرا بشه. براي تعيين کليد پيش فرض در يک فرم بايد خاصيت AcceptButton اون فرمو ست کنيد.
کليد انصراف در يک فرم به کليدي ميگن که وقتي Esc فشار داده شد رويداد Click مربوط به اون اجرا بشه. براي تعيين کليد انصراف در يک فرم بايد خاصيت CancelButton اون فرمو ست کنيم.

نکته 4: ليست فونتهاي موجود در سيستم


فرض کنيد که مي خوايد ليست فونتهاي نصب شده در سيستمو توي يه ComboBox نمايش بديد. استفاده از هر نوع حلقه اي رو فراموش کنيد. فقط کافيه يه خط کد زيرو بنويسيد:

comboBox1.Items.AddRange(FontFamily.Families);


نکته 5: غير فعال کردن منوي کليک راست در يک TextBox


براي اين کار بايد يه خط کد زيرو بنويسيد:

textBox1.ContextMenu=new ContextMenu();


نکته 6: راهي براي ساخت ConnectionString


اين راهو وقتي که کلاس MCSD مي رفتم استاد سر کلاس پيشنهاد داد. قدم به قدم به اين ترتيبه که:
-Notepad رو اجرا کنيد و يه فايل با پسوند udl ذخيره کنيد. آيکون اون فايل از حالت متني عوض ميشه
-روي اون دبل کليک کنيد. پنجره مشخصات Data نمايش داده ميشه.
- Provider مورد نظرتونو انتخاب کنيد.
-برگه Connection رو انتخاب کنيد.
-در اينجا شما مي تونيد تنظيمات بيشتري انجام بديد و در نهايت کليد Test Connection رو کليک کنيد تا صحيح بودن تنظيمات رو بررسي کنيد.
-حالا اگه فايل مذکور رو با Notepdباز کنيد مي بينيد که ConnectionString توي اون نوشته شده و شما ميتونيد اونو جايي که مي خوايد کپي کنيد.

 

+ نوشته شده در  شنبه چهارم فروردین 1386ساعت 20:19  توسط ققنوس  |