در قسمت نوزدهم با آرایههای چند بعدی آشنا شدیم. در این قسمت سعی داریم با مفاهیم برنامهنویسی شیگرا (OOP) آشنا شویم.
برنامههای کامپیوتری روز به روز در حال پیچیدهتر شدن هستند. برنامهی سادهی Hello World شما دیگر به سادگی قبل نیست و امروزه خط کد برنامههایتان آنقدر زیاد و پیچیده شدهاند که خودتان هم در آن سردرگم میمانید. میخواهید قسمتهایی از کدتان را مجدداً مورد استفاده قرار دهید و به کدهای قدیمیتان ویژگیهای جدیدی را (بدون دستکاری کدهای دیگر) اضافه کنید. میخواهید از زیادهنویسی بپرهیزید. دوست دارید برنامههایتان خیلی بیشتر از قبل قابل درک باشند و به دنیای واقعی نزدیکتر شوند. برنامهنویسی شیگرا آمده است تا مشکل شما را حل و کار شما را راحت کند طوریکه واقعاً از برنامهنویسی لذت ببرید.
دو روش عمومی برای نوشتن برنامههای کامپیوتری وجود دارد که یکی Procedural Programming و دیگری (Object-Oriented Programming (OOP است. قبل از OOP استفاده از Procedural Programming مرسوم بود بدین صورت که برنامه به تعداد زیادی Procedure تقسیم بندی میشد. زبانهایی مثل C، Pascal، Cobol و … Procedural style هستند. با آمدن OOP روش Procedural Programming رفته رفته منسوخ شد و امروزه کمتر کسی Procedural Programming را به OOP ترجیح میدهد.
برنامه نویسی شی گرا (Object-Oriented Programming)
همیشه افرادی که بهصورت Procedural کار میکنند و همچنین افراد تازهکار از من دربارهی اینکه برنامهنویسی شیگرا چیست میپرسند و من همیشه سعی کردهام با مثالهایی از دنیای واقعی، موضوع را برای آنان روشن سازم. بهعنوان مثال، از آنها دربارهی اینکه به چه چیزی وسیلهی نقلیه گفته میشود، میپرسم. پاسخ آنها این است: “خوب، چیزی مثل ماشین، کامیون، وانت و…” سپس میپرسم “به نظر شما چه تفاوتی بین وانت و کامیون دیده میشود؟!” و آنها نیز به مواردی چون اندازه، ظرفیت، هدف ساخت و غیره اشاره میکنند. سپس به آنها میگویم که فعلاً فکر کردن دربارهی وانت یا کامیون را کنار بگذارید و بیشتر دربارهی چیزهایی که یک وسیلهی نقلیه دارد صحبت کنید و آنها در پاسخ میگویند: “خوب، یک وسیلهی نقلیه راننده، چرخ، پدال ترمز و گاز، فرمان، اتاق و … دارد” و من در این لحظه به آنها خاطرنشان میکنم که همهی اینها خصوصیاتی هستند که یک وسیلهی نقلیه دارد سپس از آنها میپرسم آیا این وسیلهی نقلیه با این خصوصیات کاری را هم انجام میدهد؟ آنها پاسخ میدهند: “بله، مسلماً! اگر پدال گاز را فشار دهیم وسیلهی نقلیه توسط چرخهایش شروع به حرکت میکند و هنگامیکه فرمان را بچرخانیم مسیر حرکت آن عوض میشود.” درست است! این وسیلهی نقلیه یکسری ویژگی و یکسری رفتار خاص دارد. بنابراین با این تعاریف (ویژگیها و رفتار وسیلهی نقلیه) یک شرکت میتواند یک وسیلهی نقلیه مثل وانت، کامیون و … را تولید کند.
برنامهنویسی شیگرا نیز اینچنین است. شما در برنامهنویسی شیگرا میتوانید دنیای اطراف خود را مدل کنید. شما میتوانید در برنامهتان یک خودرو را تعریف کنید و مشخص کنید که این خودرو چه ویژگیها و چه رفتارهایی داشته باشد (Class) و سپس یک خودرو بسازید (Object).
مفاهیم برنامه نویسی شی گرا
یک زبان برنامهنویسی در صورتی شیگرا است که شامل مفاهیم زیر باشد:
CLASS
OBJECT
ABSTRACTION
ENCAPSULATION
INTERFACE
DATA HIDING / INFORMATION HIDING
INHERITANCE
POLYMORPHISM
هر یک از مفاهیم بالا در این مقاله و مقالات آینده مورد بررسی قرار میگیرد.
Class چیست؟
Class قالب یک Object را مشخص میکند. در واقع Class مشخص کنندهی data و code ای است که روی data عمل میکند. سیشارپ از مشخصات یک Class برای ساخت Object استفاده میکند بنابراین Object نمونهای از یک Class است. ما میتوانیم به تعداد دلخواه از یک کلاس Object بسازیم.
Object چیست؟
یک Object بیان کنندهی چیزی است که در دنیای واقعی قابل درک باشد. Object یک سری فعالیتهای مرتبط به هم را انجام میدهد و هر Object ویژگی و رفتارهای خاص خود را دارد. همانطور که گفته شد، Object نمونهای از یک Class است. بهعنوان مثال “دست” را در نظر بگیرید. دست یک Class است. در Class دست، مشخص شده که یک دست باید چه ویژگیها و چه رفتارهایی داشته باشد (۵ انگشت، بازو، ساعد، گرفتن، ضربه زدن و …) و بدن ما دو Object از این Class را دارد که دست چپ و دست راست نامیده میشوند.
وقتی یک کلاس را تعریف میکنید، هم data و هم code ای که روی این دیتا عمل میکند را تعریف میکنید. در حالت کلی مواردی که در یک کلاس قرار میدهید در دو دستهی Data Members و Function Members تقسیمبندی میشوند. در سیشارپ این دو قسمت به قسمتهای مختلف دیگری نیز تقسیم بندی میشوند. بهعنوان مثال data members (که به آنها fields هم گفته میشود) شامل instance variable و static variable هستند. همینطور function members شامل method، constructor، destructor، indexer، event، operators و properties هستند.
یک کلاس با کلمهکلیدی class ساخته میشود. فرم کلی یک کلاس که شامل instance variable و method است، بهشکل زیر است:
class className { // declare instance variables access type var-name1; access type var-name2; // declare methods access ret-type methodName1(parameters) { // body of method } access ret-type methodName2(parameters) { // body of method } }
در اینجا، access نوع دسترسی به متغیر و متد مربوطه را مشخص میکند. مشخص کردن نوع دسترسی اختیاری است و اگر نوع دسترسی را مشخص نکنید، نوع دسترسی بهطور پیشفرض private در نظر گرفته میشود. اعضایی از کلاس که دسترسی به آنها private در نظر گرفته میشود فقط توسط همان کلاس و اعضای همان کلاس قابل دسترسی هستند. اگر دسترسی اعضای کلاس بهصورت public در نظر گرفته شود آنگاه آن اعضا در همهجای برنامه قابل دسترسی هستند.
کلاسهایی که میسازید باید هدف خاصی از ساخت آنها داشته باشید و از قرار دادن هرگونه اطلاعات نامربوط در آن پرهیز کنید. تا پیش از این، کلاسی که از آن در برنامههایمان استفاده میکردیم تنها یک method داشت که آنهم متد ()Main بود. متد ()Main تنها باید در کلاسی قرار داشته باشد که آن کلاس نقطه شروع برنامهتان است.
در مثال زیر یک کلاس به اسم Car میسازیم که شامل سه متغیر است:
class Car { public string Color; public string Model; public int MaxSpeed; }
در این کلاس نوع دسترسی هر سه متغیر public است. به این معنی که این سه متغیر میتوانند در همهجای برنامه قابل دسترسی باشند. در این کلاس هیچ method ای تعریف نکردهایم و این یک کلاس data-only است. هنگامیکه یک کلاس را تعریف میکنید در واقع یک data type جدید بهوجود میآورید که در این مثال اسم این دیتاتایپ، Car است. شما از این اسم برای ساخت اشیائی از جنس Car استفاده میکنید.
با تعریف یک کلاس شما فقط قالب یک شیء را مشخص میکنید و در واقع هنوز هیچ object ای از آن نساختهاید. در مثال قبل شما فقط مشخص کردید که یک ماشین میتواند سه مشخصهی رنگ، ماکسیموم سرعت و مدل را داشته باشد اما شما هنوز هیچ ماشینی را نساختهاید و فقط مشخص کردهاید که اگر قرار است ماشینی ساخته شود باید شامل این سه مشخصه باشد!
برای اینکه از کلاس Car، یک شیء بسازید، مینویسید:
Car BMW = new Car(); // create an object of type Car
بعد از اجرای این خط، یک شیء از کلاس Car ساخته میشود و کلاس Car اکنون یک واقعیت فیزیکی دارد چراکه شما با توجه به مشخصاتی که برای یک ماشین تعریف کردید، یک BMW را ساختید. در حال حاضر نگران جزئیات این خط کد نباشید.
از هر کلاس میتوانید به تعداد دلخواه شیء بسازید. هربار که از یک کلاس شیء میسازید هر شیء، کپی خودش را از متغیرهای کلاس مربوطه دارد. بنابراین هر شیء Car، کپی خودش را از متغیرهای Color، Model و MaxSpeed دارد. برای دسترسی به این متغیرها از عملگر دسترسی به اعضا استفاده میکنید که این عملگر، یک نقطه (dot operator) است. dot operator اسم یک شیء را به اسم یکی از اعضای همان شیء متصل میکند:
object.member
برای مثال به این طریق میتوانید رنگ BMW تان را تنظیم کنید:
BMW.Color = "Blue";
به مثال زیر توجه کنید:
// A program that uses the Car class. using System; class Car { public string Color; public string Model; public int MaxSpeed; } // This class declares two objects of type Car. class Example { static void Main() { // First Object Car mercedesBenz = new Car(); mercedesBenz.Color = "Yellow"; mercedesBenz.Model = "McLaren"; mercedesBenz.MaxSpeed = 300; Console.WriteLine("Mercedes Benz has:"); Console.WriteLine(" " + mercedesBenz.Color + " Color"); Console.WriteLine(" " + mercedesBenz.Model + " Model"); Console.WriteLine(" " + mercedesBenz.MaxSpeed + " Max Speed"); Console.WriteLine(); // Second Object Car BMW = new Car(); BMW.Color = "Black"; BMW.Model = "M6"; BMW.MaxSpeed = 250; Console.WriteLine("BMW has:"); Console.WriteLine(" " + BMW.Color + " Color"); Console.WriteLine(" " + BMW.Model + " Model"); Console.WriteLine(" " + BMW.MaxSpeed + " Max Speed"); } }
در این مثال از کلاس Car دو شیء مختلف را ساختیم که هرکدام رنگ، مدل و ماکسیموم سرعت مخصوص به خود را دارند. در این برنامه دو کلاس Example و Car موجود است. اینها دو کلاس جدا هستند و تنها ارتباط آنها این است که در کلاس Example دو شیء از کلاس Car ساخته میشود. ما در کلاس Example میتوانیم به اعضای کلاس Car دسترسی داشته باشیم، چراکه دسترسی آنها public است اما اگر دسترسی آنها private باشد فقط در کلاس Carقابل دسترسی هستند.
چگونه یک Object ساخته میشود؟
در مثال قبل از خط کد زیر برای ساخت یک شیء استفاده کردیم:
Car BMW = new Car();
این خط کد، سه کار را انجام میدهد. ابتدا، یک متغیر به اسم BMW از جنس Car میسازد. این متغیر به خودی خود، یک شیء نیست بلکه متغیری است که به یک شیء رجوع میکند (آدرس یک شیء را در خود ذخیره میکند). این خط کد در مرحلهی دوم توسط کلمهیکلیدی new یک شیء را میسازد و سپس در مرحلهی سوم توسط علامت مساوی (=) متغیر و شیء ساخته شده را به هم وصل میکند (به متغیر BMW آدرس جایی که object ساخته شده قرار دارد اختصاص داده میشود). بنابراین بعد از اجرای این خط کد، متغیر BMW به یک شیء از جنس Car رجوع میکند.
خط کد بالا را به طریق زیر هم میتوانید بنویسید:
Car BMW; BMW = new Car();
در خط اول متغیری از جنس Car تعریف کردهاید که میتواند آدرس یک شیء را در خود ذخیره کند (میتواند به یک شیء رجوع کند). در خط دوم، یک شیء از جنس Car ساخته میشود و آدرس آن در متغیر BMW ذخیره میشود بنابراین بعد از اجرای این دستورات متغیر BMW و شیء ساخته شده به هم وصل هستند.
مطمئناً تا اینجا متوجه شدهاید که متغیر BMW شیء را در خودش ذخیره نمیکند بلکه شیء در حافظه ذخیره میشود و متغیر فقط آدرس جایی که شیء قرار دارد را در خود ذخیره میکند. اگر بهیاد داشته باشید بیان شد که سیشارپ شامل دو دستهبندی برای data type (نوع اطلاعات) است که یکی value type و دیگری reference type بود. تفاوت بین ایندو مقداری است که متغیر در خودش نگاه میدارد. برای یک متغیر value type، متغیر مستقیماً خود مقدار را نگهداری میکند:
int x = 22;
در اینجا متغیر x از جنس int و مستقیماً شامل مقدار ۲۲ است. به همین دلیل int را value type مینامیم.
اما در این مورد:
Car BMW = new Car();
متغیر BMW خود شیء را نگهداری نمیکند بلکه تنها آدرس آن را ذخیره دارد به همین دلیل کلاسها reference type هستند.
Method چیست؟
Method ها شبیه به Procedure ها، Function ها و … در دیگر زبانهای برنامهنویسی هستند. Method ها و متغیرها (instance variables) تشکیل دهندهی اجزای اصلی کلاس هستند. کلاسی که در مثالهای قبلی ساخته بودیم فقط شامل متغیر بود (data-only). اکنون قصد داریم کلاسی بسازیم که شامل Method هم باشد. اصولاً Method ها، متغیرهایی که در کلاس تعریف میشوند را تغییر میدهند و در بیشتر موارد باعث میشوند بتوانید به متغیرهای کلاس دسترسی داشته باشید. معمولاً قسمتهای دیگر برنامه از طریق Method های یک کلاس با آن در تعامل هستند.
هر Method باید یک وظیفه را بر عهده داشته باشد، نه چند وظیفه. هر Method یک اسم دارد و شما از طریق همین اسم میتوانید Method را صدا بزنید و آن را اجرا کنید. برای نامگذاری Method ها نباید از اسم کلمههای کلیدی سیشارپ و ()Main که از پیش رزرو شده است استفاده کنید. بعد از نام Method پرانتز باز و بسته قرار میگیرد. بهعنوان مثال اگر نام یک Method را CalculateSum انتخاب کرده باشد باید بنویسید ()CalculateSum و اینکار باعث میشود نام Method را از نام متغیرها تشخیص دهید.
فرم کلی یک Method بهشکل زیر است:
access ret-type name(parameter-list) { // body of method }
در اینجا access مشخص کنندهی نوع دسترسی است (access modifier) و دسترسی قسمتهای دیگر برنامه را به این Method کنترل میکند. همانطور که پیشتر بیان شد، قرار دادن access modifier اختیاری است و درصورتی که آن را ننویسید، private محسوب میشود. ret-type مشخص کنندهی نوع مقداری است که Method برمیگرداند. اگر Method هیچ مقداری را برنگرداند ret-type باید void باشد. name مشخص کنندهی اسم Method است و در قسمت parameter-list لیستی از متغیرها قرار میگیرید که Method میتواند آنها را دریافت کند. اگر Method هیچ پارامتری نداشته باشد این قسمت باید خالی گذاشته شود.
به مثال زیر توجه کنید:
using System; class HelloWorld { public void SayHello(string name, string family) { Console.WriteLine("Hello " + name + " " + family); } } class Example { static void Main() { HelloWorld myWorld = new HelloWorld(); myWorld.SayHello("Masoud", "Darvishian"); } }
در این مثال، در کلاس HelloWorld متدی را به اسم ()SayHello قرار دادیم که هیچ مقداری را برنمیگرداند (void) و تنها دو مقدار را بهعنوان ورودی دریافت و پیغام خوشآمدگویی را چاپ میکند. در متد ()Main برای اینکه به متد ()SayHello دسترسی داشته باشیم ابتدا باید یک شیء از کلاس HelloWorld بسازیم سپس میتوانیم از طریق نام آن شیء به متد دسترسی پیدا کنیم (زیرا دسترسی public است).
Return کردن از یک Method
در دو حالت یک متد return میشود:
1 – زمانی که برنامه به کروشه پایانی ( { ) متد برسد.
2 – زمانی که با کلمه return مواجه شود.
برای استفاده از کلمهی return در متد، دو حالت وجود دارد. حالت اول زمانی است که از void methods استفاده میکنید (متدهایی که هیچ مقداری را برنمیگردانند) و حالت دوم برای متدهایی است که مقداری را برمیگردانند.
استفاده از return در یک void method موجب میشود اجرای متد در همانجایی که هست متوقف شود.
به مثال زیر دقت کنید:
public void MyMeth() { int i; for (i = 0; i < 10; i++) { if (i == 5) return; // stop at 5 Console.WriteLine(); } }
در این Method زمانیکه i برابر با ۵ باشد، اجرای مابقی خط کدهای متد متوقف شده و داستان از همان نقطهای که متد صدا زده شده است ادامه مییابد. همچنین میتوانید در void methods از چندین return در جاهای مختلف آن استفاده کنید اما ترجیحاً این کار انجام ندهید چراکه معمولاً اینجور استفاده در نقاط مختلف یک Method موجب خرابی کد میشود.
البته return کردن به این شکل از یک void method رایج نیست و بیشتر Method ها یک مقدار را برمیگردانند. return کردن یک مقدار به منظورهای مختلفی در برنامهنویسی استفاده میشود. در بعضی موارد مقداری که return میشود نتیجهی یکسری محاسبات است. در بعضی موارد دیگر مقدار بازگشتی نشاندهندهی موفقیت یا عدم موفقیت یک عملیات خاص است. درکل، مقدار بازگشتی بستگی به هدف شما از نوشتن آن Method دارد.
به Method زیر توجه کنید:
public double Addition(double x, double y) { double result = x + y; return result; }
این Method دو مقدار را دریافت، آنها را جمع و در متغیر result ذخیره میکند و در نهایت مقدار result را return میکند (مقدار result را برمیگرداند). فرض کنید ما مقدار ۲ و ۵ را به این Method بدهیم. برای اینکه از این Method و مقداری که return میکند استفاده کنیم مینویسیم:
using System; class Calculator { public double Addition(double x, double y) { return x + y; } } class Example { static void Main() { double result; Calculator myCalculate = new Calculator(); result = myCalculate.Addition(5, 2); Console.WriteLine("Addition: " + result); } }
همانطور که میبینید از کلاسی که Method در آن قرار داشت یک شیء ساختیم و سپس متد را صدا زدیم و مقادیر ۲ و ۵ را به آن دادیم. این متد، ۲ و ۵ را جمع و حاصل این جمع (عدد ۷) را return میکند. سپس عدد ۷ در متغیرresult ذخیره میشود.
به مثال زیر توجه کنید:
using System; class Calculator { public double Multipliction(double x, double y) { return x * y; } public double Division(double x, double y) { return x / y; } public double Subtraction(double x, double y) { return x - y; } public double Addition(double x, double y) { return x + y; } } class Example { static void Main() { double result; Calculator myCalculate = new Calculator(); Console.Write("Enter first number: "); double firstNum = Convert.ToDouble(Console.ReadLine()); Console.Write("Enter second number: "); double seconNum = Convert.ToDouble(Console.ReadLine()); Console.WriteLine(); Console.WriteLine("Calculations"); result = myCalculate.Addition(firstNum, seconNum); Console.WriteLine(" Addition: " + result); result = myCalculate.Subtraction(firstNum, seconNum); Console.WriteLine(" Subtraction: " + result); result = myCalculate.Multipliction(firstNum, seconNum); Console.WriteLine(" Multipliction: " + result); result = myCalculate.Division(firstNum, seconNum); Console.WriteLine(" Division: " + result); result = Math.Pow(firstNum, seconNum); Console.WriteLine(" Power: " + result); } }
در واقع این همان مثال قبلی است با این تفاوت که اندکی آن را توسعه دادیم. در این مثال، کلاسی به اسم Calculator داریم که در آن متدهایی قرار دارد که عملیات ضرب، تقسیم، جمع و تفریق را انجام میدهند و نتیجه را باز میگردانند. در این برنامه مقادیری که باید به این متدها داده شود را از کاربر دریافت کردهایم و در نهایت نتیجهی محاسبات را نمایش دادهایم. همچنین از متد ()Pow که در کلاس Math قرار دارد (یکی از متدهای از پیش تعریف شده در داتنت فریمورک است) برای به توان رساندن استفاده کردهایم. توجه کنید که اگر ret-type یک متد را از جنس double تعریف کردهاید آنگاه مقداری را که return میکنید نیز باید double باشد.
مطمئناً تا این لحظه متوجه شدهاید هنگامیکه مینویسیم ()Console.WriteLine درحال استفاده کردن از متد ()WriteLine هستیم که این متد در کلاس Console قرار دارد. همینطور موارد مشابهی چون ()Console.ReadLine و غیره.
استفاده از پارامترها
در مثالهای قبلتر چگونگی استفاده از پارامتر را مشاهده کردید. هنگامی که یک Method را صدا میزنید میتوانید یک یا چندین مقدار را به آن بدهید. مقداری که به یک Method داده میشود argument نام دارد. درون Method، متغیری که این argument را دریافت میکند پارامتر (parameter) نامیده میشود. پارامترها درون پرانتزی که جلوی نام متد قرار میگیرد تعریف میشوند و طریقهی تعریف کردن پارامتر به همان شکل است که بهصورت عادی یک متغیر تعریف میشود. این پارامترها فقط در محدودهی خود آن متد شناخته میشوند.
به مثال زیر توجه کنید:
using System; class ChkNum { public bool isEven(int number) { if (number % 2 == 0) return true; else return false; } } class Example { static void Main() { ChkNum ob = new ChkNum(); for (int i = 0; i < 10; i++) { if (ob.isEven(i)) Console.WriteLine(i + " is even"); else Console.WriteLine(i + " is odd"); } } }
در این برنامه، ۱۰ مرتبه متد ()isEven صدا زده میشود و هربار مقداری متفاوت بهعنوان argument به آن داده میشود و درون متد، پارامتر number هربار این argument را دریافت میکند. متد ()isEven عدد دریافتی را بررسی نموده و درصورتی که زوج باشد مقدار true را بازمیگرداند.
داوود
22 December 2012
سلام مسعود جان؛
خیلی ممنونم از ادامه آموزشهای پربار و مفیدت؛ دستت درد نکنه.
اوایل می گفتم خداکنه شما هر روز یه قسمت جدید بذارید ولی الان که به قسمتهای 18 و 19 رسیدیم و هر کدومش تقریبا چند روز خوندنش طول میکشه خوشحالم که همون هفته ای یک درس رو میذارید و میتونیم اینجوری خودمون رو به درسها برسونیم.
فقط یک سوال؟؟؟ اگه در مجموع گاهی از قسمتهای قبل سوالی برامون پیش بیاد ، تو همون قسمت درس مورد نظر اگه مطرح کنیم شما پاسخ میدید؟ یا تو درس جدید سوال رو بپرسیم(حتی اگه مربوط به قسمتهای قبلی باشه)؟
مسعود درویشیان
22 December 2012
سلام، خواهش میکنم. ترجیحاً توی قسمت مربوط به موضوع بپرسید بهتره
فرشید
23 December 2012
با سلام و ممنون از وقتی که میگذارید، ممکنه توضیح دهید متدAdd.Range عملکردش چیست؟ وچگونه در نزولی کردن یک آرایه رفتار میکنه . به عنوان مثال:
;()ArrayList al = new ArrayList
;(){“al.AddRange(new string[] {“Hello”, “world”, this
;(()al.Sort(new reverseSort
(()foreach (object s in al)
;(()Console.WriteLine(s.ToString
;()Consol.ReadLine
خیلی از همراهی شما ممنون
مسعود درویشیان
23 December 2012
()AddRange عناصر یه کالکشن رو به آخر یه <>List اضافه میکنه
این بحث فعلاً مربوط به موضوع فعلی ما نیست اما میتونید برای اطلاعات بیشتر این لینک رو ببینید.
فرشید
23 December 2012
در ضمن من هم از آموزشهای شما خیلی زیاد بهره میبرم و واقعا خودم را مدیون زحمات شما میدونم.
mryam
3 January 2013
سلام اقا مسعود ببخشيد مزاحم شدم..
لطف ميكنيد اين تمرين رو حل كنيد ممنون ميشم.خواهشا تورو خدا مهم هستش
سلام بخشيد مزاحم شدم مي خواستم متدهاي Copy,Cut,paste,select,undo,redo رو توسط يك مثال
در بحث ارث بري و چند ريختي بصورت خيلي ساده توضيح بدين(با مثال)
خواهش ميكنم چون يك سوال مهم هستش كه بايد جوابشو براي استادم ببرم.
ممنونم از لطف شما
فیروزه
13 April 2013
سلام و خسته نباشید
میخواستم بدونم ادر ادامه این سری اموزش ها به سی شارپ دات نت هم میرسیم؟
میشه همزمان اموزش mvc رو هم شروع کنید؟ یا میشه منبعی برای شروع mvc از پایه معرفی کنید؟
مسعود درویشیان
13 April 2013
منظورتون ASP.NET هست؟ نه، فقط خود سیشارپ توی محیط کنسول…
برای MVC هم باید بگم خیر، شما باید اول سیشارپ رو بلد باشید بعد برید اونو کار کنید
فیروزه
13 April 2013
خب تا چه حد از سی شارپ رو باید بلد باشم؟ تسلط کامل؟
برای یادگیری دات نت باید شاخه کنسول از سی شارپ رو یاد بگیرم یا چیز دیگه ای رو؟
مسعود درویشیان
13 April 2013
ببینید، ما کد سیشارپ رو با استفاده از داتنت فریمورک مینویسیم ولی توی محیط کنسول ازش استفاده میکنیم. وقتی شما سیشارپ رو یه حد قابل قبولی بلد بشید میتونید توی محیطهای دیگه (مثلاً وب و MVC) از اون استفاده کنید.
میلاد
26 April 2013
خیلی ممنون از آموزش کلاس ها و متد ها و در کل شی گرایی
من تاحالا جرات نمی کردم برم سراغ شی گرایی ولی با آموزش خوب شما علاقه پیدا کردم.
مسعود درویشیان
26 April 2013
هر وقت از انجام کاری ترسیدی، بی برو برگشت انجامش بده، بعد میفهمی که بیخودی میترسیدی :)
سعید
21 May 2013
سلام مسعود جان.
متشکر از آموزشهای خیلی خیلی خوبت همشهری :)
اول یه انتقاد بکنم که چرا وقتی آموزش هاتو توی وبلاگینا قطع کردی و اومدی توی این وب خبر ندادی٬من فکر میکردم تعطیل شده و امروز شانسی پیداش کردم.
دوم اینکه من از اوبونتو استفاده میکنم.
محیطیهست که بتونم سی شارپ رو توی اون بنویسم؟یا حتما باید یه یرچوال نصب کنم؟
مسعود درویشیان
21 May 2013
سلام ممنون از لطفت :)
سعید جان همون لحظهای که قرار شد من بقیه مقالات رو اینجا منتشر کنم، توی وبلاگینا آخر همهی مقالات با فونت قرمز نوشتم که دیگه اونجا منتشر نمیشه و آدرس اینجا رو دادم. در مورد اوبونتو، فک کنم باید با mono کار کنی. ولی خودم تا حالا اینکارو نکردم. mono رو تست کن اگه باهاش راحت نبودی با ویندوز و visual studio کار کن
ALIREZA
7 June 2013
شیر مادرت حلالت باشه من که خیلی خوب متوجه شدم هر چیزی که خوندم یه جایش گنگ بود ولی شما خیلی جالب نوشتید . ممنون
Mersad
7 August 2013
از آموزش خیلی خوبتون متشکرم.
فقط یه موردی بود، من هنوز خیلی کامل، تفاوت دو نوع کد
و
رو متوجه نشدم.
الان از کدوم x بالا باید استفاده کرد؟!
مسعود درویشیان
11 August 2013
تعریف متغیر بهصورت زیر:
باعث میشه constructor پیشفرض int اجرا بشه و به x مقدار صفر رو اختصاص بده
اما بهصورت زیر:
باعث میشه متغیر x مقداردهی نشه و اگر بخواهید ازش استفاده کنید با خطا مواجه بشید.
hiddeen
25 September 2013
سلام آقا مسعود کارت عالیه! یه مدت بودمیخواستم سی شارپو شروع کنم ولی نمی شد.از اون موقه که اومدم تو این سایت هر روز دوست دارم بیشتر یاد بگیرم.
خیلی آقایی
ثنا
28 September 2013
سلام عذر میخوام صفحه نوزده مشکل داره باز نمیشه زحمت میکشید راهنمایی کنید
مسعود درویشیان
5 October 2013
نه مشکلی نداره! این لینک قسمت نوزدهم هست
بهاره
27 January 2014
سلام سوالم مربوط به پیاده سازی یه پروژس.اگه راهنمایی کنید ممنونتون میشم
یه مجموعه خودرو داریم سه تا پارامتر دارن هر سه تاباید با عدد تصادفی بهش بدم. کلاس براش تعریف کردم و سه تا ویژگی رو گذاشتم الان چون تعداد خودروهام مشخص نیست نمی تونم از آرایه استفاده کنم .از لیست استفاده کردم نیاز به تبدیل و باکسینگ وو..داشت موند لیست جنریک و arraylist و لیست پیوندی…بنظر شما کدوم رو باید انتخاب کنم؟و کارباهاش راحت تره؟ بعد تو این مورد حتما باید کلاس تعریف کنم؟struct نمیشه؟مقادیرم هم همه int هستن.
مهدی
29 January 2014
واقعا عالی بود. نمیدونی چقدر مطلب و کتاب خوندم و از چند نفر سوال کردم، ولی هیچکدوم به واضحی شما توضیح ندادند.
دستتون درد نکنه و خدا خیرتون بده. :)
a-p
5 August 2014
خدا قوت آقای درویشیان عالی بود
محمد
25 August 2014
چرا دو طرفش اسم کلاسو نوشته
Car BMW = new Car();
؟
اگر کنسول کلاسه پس سیستم چیه؟سوپر کلاسه؟؟؟یعنی چی؟؟؟
محمد
26 August 2014
نگفتید آیا System هم یه کلاس است ؟
فارسه
29 August 2014
ممنون عالی بود
امین
18 September 2014
خوب بود امیدوارم که موفق باشید
mehri
6 November 2014
چطور میتونم از قسمت اولش ببینم من تازه اومدم به این سایت
mehri
7 November 2014
همه قسمتاشو دیدم واقعا ممنونم
ولی توش گیر میکنم
هدیه
19 October 2015
سلام خسته نباشید.
من یه کلاس درست کردم .
حالا میخوام یک لیست از نوع کلاس ام داشته باشم .
که حذف و درج و ویرایش و نمایش انجام بدم چه طوری میتونم ؟؟
مرسی
zahra
31 October 2016
من مدرک مهندسی نرم افزار دارم از همان ابتدا به لطف آموزشهای غیر اصولی و گنگ اساتید از برنامه نویسی متنفر شدم.به زور تقلب و حتی حفظ کردن کدها دروس برنامه نویسی را با نمره های پایین پاس کردم و حتی کلاسهای آموزشی بیرون هم کمک زیادی نکرد.ظاهرا همه فقط به فکر جیب خودشان هستند.تا به حال کتابهای مختلفی خوانده ام، مطالب آموزشی سایتهای دیگر حتی سایتهای خارجی را مطالعه کردم اما تنها جایی که مطالب را درک میکنم و با علاقه دنبال میکنم سایت شماست.آموزشها خیلی دقیق و کاربردی است و واقعا دلسوزانه زحمت کشیده اید. از همه دوستان دانشجو و تازه کاری که نظر من را میخوانند میخواهم که برای یادگیری برنامه نویسی سی شارپ وقت و هزینه خود را جای دیگری هدر نکنید و اگر با اراده فقط با مطالب همین سایت که آقای درویشیان زحمتش را کشیده اند جلو بروید حتما سی شارپ را به اندازه ای که نیاز شما را بعدها برای بازار کار رفع کند یاد میگیرید
mina
13 November 2016
وااااااااااااااااااااااااااااااای چقدر خوب توضیح دادین!!!!!مگه داریم انقد خوب؟؟
خیلییییی عااااااالی بود قشنگ مطلب جا افتاد :)
واقعا ممنون از زحمتاتون خدا قوت،شاد و پر انرژی و سلامت باشید