ايران ويج

نسخه‌ی کامل: آموزش سی شارپ
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2 3 4 5
هر چند در برابر اساتید C# من برنجی بیش نیستم ولی چون زکات علم یاد دادن آن به دیگران است اولین آموزش رو من میزارم .
از اونجا که من عاشق component ها هستم دوست دارم اولین آموزشم راجب همین باشه :

خوب حالا چی میخوایم بنویسیم :
خوب این کنترل ما قراره وقتی به فرم اضافه میشه به تمام text box های برنامه 2 خاصیت به نام ISRequired و ValidationPatern اضافه کند .
خوب شروع کنیم .
اول vs تون باز کنید .
بعد یک پروژه از نوع Class Library اضافه کنید . اسمشم هر چی دوست داشتی بزار من گزاشتم H128Control
بعد یه کلاس به نام ValidationControl به پروژتون اضافه کنید .
خوب ابتدا این name space ها را به class تون add کنید .
using system.text.regularexpressions;
using system;
using system.componentmodel;
using system.windows.forms;
using system.collection ;
خوب refrence هاشم خودتون ok کنید .
بریم سر قسمت بعد .
معمولا کنترل ها به 2 گونه هستند : 1 - کنترل هایی که کنترل های دیگر را extend میکنند مثل کنترلی که ما داریم مینویسیم (errorprovider,tooltip,...( و دیگری خود کنترل مانند ,...textbox ,button هستند

خوب بریم سر کنترل خودمون :
به کلاسمون بگیم از component ,iextenderprovider به ارث ببرد برای این کار :
public class validationcontrol : component,iextenderprovider
وقتی که iextenderprovider اضافه کردین باید یک متد به نام canextend هم بهش اضافه کنید فکر کنم tab بزنید خودش اضافه کنه نمیدونم الان c# باز نیست به هر حال :
کد:
[align=left]public bool CanExtend(object sender)
{
return object is textbox;
}[/align]
در واقع این متد به ما میگه شما چی رو دارین توسعه میدین که من بهش گفتم textbox

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

خوب اول hashtable مون ردیف میکنم بعد میریم سراغ کلاسه :
hashtable extendtable;
و تو کانستراکتورمون اونو new میکنیم .
کد:
public validationcontrol ()
{
extendtable=new hashtable();
}

یه کلاسه دیگه به برنامتون اضافه کنید به نام validation class و توش 2 تا پروپرتی به نام ISRequired,ValidationPatern بدین شکل تعریف کنید :
کد:
[align=left]private class validationclass
{
private bool isrequired=false;
private string validationpatern=string.empty ;

public bool ISRequired
{
get
{
return isrequired;
}
set
{
isrequired=value;
}

public string ValidationPatern
}
get
{
return validationpatern;
}
set
{
if (validationpatern!=value)
validationpatern=value;
}
}
}
[/align]
خوب دوباره بریم تو کلاس اصلی کار manage پروپرتی ها رو ردیف کنیم .

حتما شما کنترل errorprovider دیدین یادتون چجوری باهاش کار میکردیم .
errorprovider.seterror(controlname control,string value)

پس کنترل ما نیز به 2 متد set,get نیاز دارد .
یکی برای ISRequred , دیگری ValidationPatern
پس چرا معطلین شروع کنید به نوشتن میگین چه جوری خوب دوگوله رو کار بندازین اینجوری :
کد:
Public Void SetISRequired(control mycontrol,bool Value)
{
validationclass myvalidation;
if (tableextend.containskey(control)
{
myvalidation=(validationclass)tableextend[mycontrol];
}
else
{
myvalidation=new validationclass();
}
myvalidation.ISReqired=Value;
mycontrol.Validation+=new canceleventhandler(mycontrol_validating);
if (!tableextend.containkey(mycontrol)
tableextend.add(mycontrol,myvalidation);
}
خوب این متد set ش .
خوب یه توضیح راجبش بدم :
خوب اولش به کلاس validationclass متغیر myvalidation بهش assign کردم .
بعد گفتم اگر تو hashtable هم نیود ازش یه شی جدید میسازم و اگرنه خودتون میبینید .
بعد به مقدار required هم مقدار دهی کردم .
بعد به کنترل textbox طرف event validating رو بهش اضافه کردم .
در آخرم گفتم اگر تو hashtable هم نبود شی که از کلاسم اضافه کن به hashtable تا برای دفعه بعد گمش نکنم .
شما هم میتونید از struct و هم از کلاس استفاده کنید بازم من باس خاطر سرعت طرف کلاسو گرفتم .
اصلا کلاس یه کلاسه دیگه داره . C# یعنی CLASS و CLASS هم یعنی C#!
خوب بریم سراغ getش ببینیم چی میگه :
کد:
public bool GetISRequired(control mycontrol)
{
validationclass myvalidation;
if (tableextend.containskey(mycontrol)
{
myvalidation=tableextend[mycontrol];
return myvalidation.ISRequired;
}
return false;
}

برای اون یکی پروپرتی هم همین کارا رو بکنید برای چیزو میگم validationpatern همینجوری است ok اسم متدشم میشه یکیش SetValidationPatern ,GetValidationPatern

خوب اینم میشه کد event validating مون :
کد:
[align=left]private void mycontrol _validating (object sender,canceleventargs e)
{
validationclass myvalidation;
if (tableextend.containskey(sender))
{
myvalidation=(validationclass)tableextend[sender];
if ((textbox)sender).Text.Trim()==string.empty & myvalidation.ISRequred==true )
{
e.cancel=true ;

}
if (myvalidation.validationpatern!=string.empty) & ((textbox)sender).Text.Trim()!=string.empty
{
try

{
Regex regex=new Regex(myvalidation.ValidationPatern );
if (!regex.IsMatch(((TextBox)sender).Text)) e.Cancel =true ; return ;}
catch{throw new Exception("there is a mistake in patern"); }
}
}
}[/align]
توضیح : regex که همه فکر کنم میدونید چیه . بقیشم نکته خاصی نداره .
قسمت آخرشم میشه :
قبل از تعریف کلاسمون این attribute ها را اضافه میکنیم .

کد:
[ProvideProperty("ISRequired",typeof(TextBox ))]

[ProvideProperty("ValidationPatern",typeof(TextBox ))]
همین دیگه تموم شد .
ببخشید اگر یه خورده بینظمه چون همه رو تو همین editor نوشتم و اگر جاییش مشکل حروف داره یا کم و زیاد شده به بزرگی خودتون ببخشید . یه خواهش دیگه هم اینجا حرف از پول نشه .
تا آموزش بعد فعلا Bye.
that's just great let's get on work with VC#2005 HO$E!N AGHA
اگر علاقه مندید من قسمتی از تجربیاتم را به صورت مقاله میتوانم در اختیارتون بزارم .
منتظر نظرات شما هستم .
در ضمن از مدیر بخش برای فعال تر شدن این بخش مساعدت میطلبم .
سلام.
آقای اسماعیلی از زحمات شما تشکر میکنم. ادامه بده. میتونه تاپیک مفیدی باشه.
خوب این بار بیاید با هم یه کنترل خودمون بسازیم .
معمولا ساخت خود کنترل ها هم به 3 شکل ما از کنترل دیگه ای به ارث ببریم مانند این کنترلی که قراره الان بنویسیم . یه کنترل از اول خودمون توسعه بدیم که در این حالت یا از کلاس Control یا از کلاس User Control به ارث میبریم (اکثر کنترل های .net از کلاس کنترل به ارث برده اند ) که قراره بعدا بنویسیم . و یا ترکیبی از هر دو که در جلسات آینده از هر کدوم مقاله ای خواهم گذاشت برای ترکیب هر دو PersianDatetimePicker را در نظر گرفتم پس این مقالات را دنبال کند .

این مقالات فقط جنبه آموزشی و درک بهتر OOP برای شماست .
خوب بریم سر کنترل امروز .
برای این مقاله کنترل fliter TextBox را درنظر گرفتم .
کنترل ما قراره چی کار کنه : کنترل ما Text Box ی است که شامل یک Black List از کلمات بد میباشد . اگر کاربر این کلمات را وارد کرد کنترل ما برای برنامه نویس رویداد مربوطه را raise میکند .

خوب بریم سر برنامه نویسی آن .
ابتدا یک پروژه از نوع Class Library به نام هر چی که دوست دارید بسازین من اسمشو گزاشتم H128Control .
نکته : اگر vs 2005 دارین میتونین windows Application را انتخاب کنید تا همون موقع تستش کنید و اگرنه که هیچی کلا 2005 خیلی با حاله همه کارهای سخته خودش میکنه . و در آخر به class library ببرید تا dll تون تحویل بگیرین .

خوب داخل پروژتون یک کلاس به نام FilterTextBox اضافه کنید و از TextBox به ارث ببرین ( system.windows.forms هم به name space هاتون و هم به refrence ها add بشه ) به این شکل :
public class FilterTextBox:TextBox
{

}
حالا ما نیاز به یک collection داریم که اسامی را در داخلش قرار بدیم من برای این کار از ArrayList استفاده میکنم . ( برای ساختن collection ها بصورت دستی و گرفتن ورودی از برنامه نویسی و User در مقالات بعد توضیح داده میشود )
ArrayList BlackList;
و توی کاستراکتورمون ازش یه Instance میسازیم و داخلشو پر میکنیم .
کد:
Public FilterTextBox()
{
BlackList=new ArrayList();
BlackList.AddRange(new string[]{";","select","delete","if","***","h128"});
if (!this.DesignMode)
this.KeyDown+=new KeyEventHandler(FilterTextBox_KeyDown);
}
و در دیکانستراکتورمون اونو برابر null میکنیم .
کد:
~ FilterTextBox()
{
BlackList=null;
}
دیکانستراکتور زمانی که کلاسمون Dispose میشه فراخونی میشه و هیچ جور دیگه نمیشه اونو فروخونی کرد بدلیل اینکه manage کردن حافظه رو خود C# انجام میده . پس الکی دنبالش نرید .
و در خط بعد بهش میگیم اکر برناممون در زمان اجرا نبود بهش دستگیره keydown بهش بچسبون .
باید یه سری کار برای رخداد مون بکنیم .
اول یه class دیگه اضافه کنید به برنامه به این شکل :
کد:
public class FilterText
{
public FilterText(int position,string word)
{
Position=position;Word=word;
}
private int position;
public int Position
{
get
{
return position;
}
set
{
position=value ;
}
}

private string word;
public string Word
{
get
{
return word;
}
set
{
if (word!=value)
word=value ;

}
}



}
و بعد از ابن در کلاس خودمون event مون مینویسیم . event ها رابطه تنگاتنگی با delegate ها دارند .
کد:
public delgate void badword (object sender,FilterText e);
public event badword BadWord;

int position=0;
string tempstr=string.empty;
private void FilterTextBox_KeyDown(object sender,keyeventargs e)
{
if (e.keycode==keys.space)
{
position=this.text..trim.LastIndexof(" ");
tempstr=this.text.substring(position,this.text-position).trim.tolower();
if (blacklist.contains(tempstr))
{
if (BadWord!=null)
{
BadWord(this,new FilterText(position,tempstr));
}
}
}
}
راستی خودتون دیگه test ش کنید و احتمالا اگر باگی چیزی داشت برطرف کنید .
از این پس در هر مقاله عنوانی با good prgramming هم براتون میزارم .
به نظر شما تفاوت این 2 حلقه در چیست .
کد:
int i=0,j=0;
for (i=0;i<1000000;i++)
{
for (j=0;j<20000;j++)
{

}
}
و این حلقه
کد:
for (int i=0;i<100000;i++)
{
for (int j=0;j<20000;j++)
{

}
}
پاسخ : در حلقه شماره 2 به اندازه متغیر i متغیر j از بین و دوباره ساخته میشود ولی در حلقه شماره 1 فقط یکبار .

فعلا با اجازه .
حسین جان سلام

خیلی ممنون بابت آموزش های #C . فقط جسارتا چندتا نکته رو میخواستم عرض کنم :

1- فکر کنم بهتر باشه از ابتدا شروع کنی چون اینطور دوستان میتونن از اول کار رو دنبال کنن . معمولا از همون مفاهیم شی گرایی و برنامه های کنسول تا برسه به Windows Forms و پیشرفته تر
2-لطفا کد ها رو توی ادیتور در بخش کد قرار بده تا دوستان بهتر بتونن کد ها رو ببینن . توی ادیتور کافیه کد خودت رو سلکت کنی و در Toolbar روی آیکون # کلیلک کنی .

من هم فعلا در دوران امتحانات هستم و فعلا سرم تا یک ماه آینده با امتحانات گرمه . حتما من هم به شما میپیوندم . ممنون و متشکر از زحماتی که میکشید
بچه ها همچینی گفتند همه C# بلدند ما گفتیم مقاله های پیشرفته تر از code project بزارم .
به قول یکی از اساتید هر کی یک سوم از C# بلد باشه برنامه نویس ارشد شرکت microsoft میشه !
خوب بگذریم . به گفته مدیر سایت سطح مقالات از صفر شروع میکنیم .
فقط یه خواهش دیگه زیاد خودتون درگیر ورژن نکنید چون تمام مقالاتی که من میزارم در تمام نسخه های .net جواب میده و از دوستان نیز همین خواهش را دارم یه خواهش دیگه اگر مقالات را جای دیگه copy past میکنند زیر مقالات لااقل نام سایت iranvig.com هم بنویسید .

خوب حالا که قراره از صفر بگیم یه خورده درباره خود C# بگم .
microsoft برای مصاف با java به دنبال ارایه یک زبان کامل بود که سایه java را در میادین برنامه نویسی کم رنگ تر کند شاید به همین دلیل هم C# را ایجاد کرد ، برای اینکه برنامه نویس های java را هم به سمت C# سوق بده شباهت زیادی بین 2 زبان ایجاد کرد واقعا چه مخیه این microsoft .
و واقعا نیز همینگونه شد چون java در برابر .net 3.5 مثل vb6 در برابر vc6 میمونه .

C# چیست :
طراحان زبان C# با الگو برداری از زبانهایی مثل C,C++ و جاوا و سادگی زبان vb6 و نادیده گرفتن برخی از امکانات کم استفاده این زبانها دست به طراحی این زبان زدند . زبان C# دارای 77 کلمه کلیدی میباشد و داری 4500 کلاس و تعداد بیشماری متد و پروپرتی است .

تفاوت بین C# .net و vb.net :
در اکثر مقالات نوشته شده بین این 2 زبان هیچ تفاوتی نیست ولی واقعا اینگونه نیست .
مزایای C# نسبت به vb.net از نظر من :
1- زبان C# به طور ویژه برای .net طراحی شده ولی در vb.net به خاطر از دست ندادن شباهت هایی که با vb6 داشت به الجبار برخی از امکانات .net در این زبان حذف گردید .
2- نبود unsigned integer , operator overloading, Delegate و امنیت بیشتر type ها چیزی است که در vb.net مشاهده نمیشود .
3- کوتاه تر بودن کد MSIL در C#
4-پشتیبانی خیلی بهتر از oop نسبت به vb.net
5- کوتاه تر و زیباتر بودن کدها هم که جای خودش رو داره

ولی باید اذعان کرد که هر دوی آنها از یک هسته دارند استفاده میکنند ولی C# یه کم بیشتر .

--------------------------------------------------------------------------------
C# گرچه زبانی است که از C++ گرفته شده ولی یک زبان شی گرا به طور کامل میباشد
زبان C# فرضش بر این است که شما میخواهید تنها برنامه نویسی شی گرا انجام دهید و همانند C++ مخلوطی از شی گرا و رویه ای نمیتوان برنامه نویسی کرد . اصلا بدون درک کلاس ها در C# نمیتوان برنامه نویسی کرد . بنابر این باید طرز فکرتان را با شی گرایی (حقیقت مجازی )تطبیق دهید . در ادامه مقالات خواهید دید که در C# همه چیز شی است .
حتی خود شما!
--------------------------------------------------------------------------------

در مقاله بعد کمی راجب oop و کلاس ها مینویسم .
اگر به شی گرایی علاقه ندارید و دوست دارین مثل قبل به همون رویه vb6 برنامه بنویسید از همین الان بهتره بیخیال C# شین چون در C# جور دیگه نمیشه برنامه نوشت .
ساخت اشیا :
شاید از زمانی که با کامپیوتر آشنا شدید واژه شی گرایی را زیاد شنیده باشید .
در ابتدای امر فکر میکنید که این مبحث جزو مباحث سخت و غیر قابل پیاده سازی باشد شاید در ابتدای امر نیز اینگونه بود ولی با استفاده از زبانهای سطح بالا به راحتی قابل پیاده سازی میباشد .
تمامی زبانهای سطح بالا تمام تلاششان این بود که بتوانند به راحتی OOP را در خود پیاده کنند اما هر یک از آنها تا سطحی در زمینه موفق بوده اند .
در جهان واقعی مدام ما با اشیای مختلف کار داریم . هر چیزی را که شما میبینید یک شی است مثل تلویزیون ، یخچال و ...
هر شی برای خود خواص و رویدادها وAction های مختلفی دارد .
مثلا تلویزیون خاصیت رنگ و ... و رویداد تغییر رنگ و Action روشن شدن داشته باشد .

در جهان اشیا باید یک شی تمام وظایفش را خودش انجام دهد و کمترین وابستگی را به جهان خارج داشته باشد و فقط از طریق خواص و Action های خودش میتونه با جهان خارج ارتباط برقرار کند .
C# جزو زبانهایی است که به طور کامل از OOP پشتیبانی میکند . و ما برای هر کاری میبایست باید یک شی ایجاد کنیم .

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

برای شروع یک کلاس به برنامه تان به نام Square اضافه کنید .
حال نگاه کنیم ببینیم شی ما چه چیزهایی نیاز دارد .
مطمیناً مربع من خواصی همچون رنگ ، اندازه ، موقعیت و رویدادهایی مانند تغییر رنگ و تغییر اندازه دارد و متدی برای رسم خود دارد .

ایجاد خاصیت رنگ به کلاسمان :
معمولا برای ایجاد یک خاصیت (Property) به شکل زیر عمل میشود .
کد:
[align=left]Private Color squarecolor=Color.Black;
Public Color SquareColor
{
Get
{
         Return squarecolor;
}
Set
{
             squarecolor=value;
}
}[/align]
یک متغیر از نوع private که در کلاس خودمان استفاده میشه و یک متغیر Public که در جهان خارج از ان استفاده میشود . بیشترین بلایی که میشه سر یک متغیر آورد اینه که چیزی را در داخلش قرار داده و یا آنرا بخوانیم
حال اگر فرض کنید که در موقع این عمل ها اتفاق دیگری نیز میخواهید بیفتد یا هر چیزی در property ما قرار نگیره آنوقت چه .
قسمت Get زمان خواندن و زمان نوشتن در پروپرتی شما Set میباشد . و value جزو کلمات کلیدی C# میباشد و مقداری که قراره در داخل متغیرمان ریخته شود را به ما اعلام میکند .
به همین راحتی ما به شی خود یک خاصیت جدید اضافه کردیم .
خوب خاصیت بعد چی بود خاصیت اندازه تنها نکته ای که در این خاصیت وجود دارد این است که طول و عرض ما باید یکسان باشد .
کد:
Private Size squaresize=new Size(50,50);
Public Size SquareSize
{
Get
{
                 Return squaresize;
}
Set
{
               If ( value.Width == value.Height)
          Squaresize=value;
}
}
و خاصیت squareposition را نیز مانند خواص قبل پیاده میکنیم .
کد:
Private Point squareposition=new Point(0,0);
Public Point SquarePosition
{
Get
{
       Return squareposition;
}
Set {squareposition=value;}
}
خوب میمونه متد رسم :
برای تعریف یک متد ایتدا AccessModifiers آن را مشخص کرده سپس نوع بازگشتی و بعد از ان نام متد و در آخر پارامترهای ورودی آنرا مشخص میکنیم .
برای اینکه من میخواهم در جهان خارج متدم دیده شود Modifiers آنرا Public در نظر میگیرم و نوع بازگشتی آنرا void یا هیچی میگزارم ولی مهمترین قسمت آن ورودی آن میباشد من میتوانم Handle پنجره ای که در آن قرار است رسم شود و یا یک ورودی از نوع Graphics دریافت کنم تفاوتی ندارد و بستگی به طراح شی دارد .
کد:
Public void DrawSquare(Graphics gr)
{
    Gr.DrawRectangle(new Pen(squarecolor),new Rectangle(squareposition, squaresize));
    Gr.Dispose();
}
درباره Gdi + بعدا توضیح مفصلی میدهم .

خوب برای اضافه کردن رویدادها نیز در مقاله بعد فعلا دیگه حال ندارم بنویسم .
برای تستش هم کافیست در ساده ترین حالت اینو بنویسید .
کد:
Square mysquare=new Square();
private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
mysquare.DrawSquare(e.Graphics);
}
منتظر نظرات شما هستم .
یعنی واقعاً تو این چند تا مقاله هیچ سوالی برای هیشکی پیش نیومده !
فکر کنم این C# هنوز کسی زیاد باهاش حال نمیکنه که بره یاد بگیرتش .
سعي كنيد از مباحثي استفاده كنيد كه متفاوت باشه مثل كار با پورت يا برنامه هاي تحت شبكه يا بحث تريدينگ يا بحث ايجاد برنامه هاي چند لايه همچنين برنامه هاي هك و نفوز و از اين قبيل موارد .فكر ميكنم ديكه بحث كردن درباره برنامه هايي كه همه نوشته اند و توي همه كتابها توضيح داده شده بس باشه برنامه نويسهاي ايران بايد خودشون رو توي جهان نشون بدن پس بيايد با هم برنامه هايي بنويسيم كه كنده شيم از اين ثبات ذهنتون رو از اين برنامه هاي تكراري خالي كنيد
cop جزو بالاترین مباحث برنامه نویسی میباشد کافیه حقوق معماران .net رو با بقیه یه نیگاه بندازی خودت میفهمی
صفحه‌ها: 1 2 3 4 5