زنگ سی شارپ – قسمت پنجاه (قسمت پایانی)

آشنایی با Event، Delegate، Lambda Expression و List در سی‌شارپ


۵۲ دیدگاه سی شارپ سه شنبه, ۲۷ام اسفند , ۱۳۹۲ 44673 بازدید

زنگ سی‌شارپ - قسمت پنجاه

استفاده از Method Group Conversion

از نسخه‌ی ۲، یک ویژگی به سی‌شارپ اضافه شد که به‌شکل قابل توجهی اختصاص‌دهی method‌ به delegate را ساده می‌کرد. این ویژگی method group conversion نام دارد و به شما اجازه می‌دهد تا به سادگی، نام یک متد را به delegate اختصاص دهید بدون این‌که نیاز داشته باشید از کلمه‌ی کلیدی new استفاده کنید یا constructor‌ مربوط به delegate را فراخوانی کنید.

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

using System;

class Program
{
    delegate string UppercaseDelegate(string input);

    static string UppercaseFirst(string input)
    {
        char[] buffer = input.ToCharArray();
        buffer[0] = char.ToUpper(buffer[0]);
        return new string(buffer);
    }

    static string UppercaseLast(string input)
    {
        char[] buffer = input.ToCharArray();
        buffer[buffer.Length - 1] = char.ToUpper(buffer[buffer.Length - 1]);
        return new string(buffer);
    }

    static string UppercaseAll(string input)
    {
        return input.ToUpper();
    }

    static void WriteOutput(string input, UppercaseDelegate del)
    {
        Console.WriteLine("Your string before: {0}", input);
        Console.WriteLine("Your string after: {0}", del(input));
    }

    static void Main()
    {
        // using method group conversion
        WriteOutput("perls", UppercaseFirst);
        WriteOutput("perls", UppercaseLast);
        WriteOutput("perls", UppercaseAll);
    }
}

/* Output
 
Your string before: perls
Your string after: Perls
Your string before: perls
Your string after: perlS
Your string before: perls
Your string after: PERLS
 
 */

این مثال را در قسمت قبل نیز مشاهده کردید با این تفاوت که در این مثال از ویژگی Method group conversion استفاده شده است.

دقت کنید که در مثال‌های قبل، از متدهای static استفاده می‌کردید. در مثال بعد مشاهده می‌کنید که می توانید از متدهای یک شیء استفاده کنید که static نیستند (instance methods).

using System;
delegate string StrMod(string str);
class StringOps
{
    // Replaces spaces with hyphens.
    public string ReplaceSpaces(string s)
    {
        Console.WriteLine("Replacing spaces with hyphens.");
        return s.Replace(' ', '-');
    }
}
class DelegateTest
{
    static void Main()
    {
        StringOps so = new StringOps(); // create an instance of StringOps
        // Initialize a delegate.
        StrMod strOp = so.ReplaceSpaces;
        string str;
        // Call methods through delegates.
        str = strOp("This is a test.");
        Console.WriteLine("Resulting string: " + str);
    }
}

همان‌طور مشاهده می‌کنید، ابتدا از روی کلاس مربوطه یک شیء ساخته و سپس از طریق آن شیء، متد را صدا زده‌ایم. دقت کنید که در مثال بالا نیز از method group conversion استفاده شده است.

متدهای بی‌نام (Anonymous Methods)

یک anonymous method راهی برای ساختن یک بلوک کد بدون نام است که به یک delegate instance اختصاص می‌یابد. به مثال زیر توجه کنید:

using System;
delegate void CountIt();
class AnonMethDemo
{
    static void Main()
    {
        CountIt count = delegate
        {
            for (int i = 0; i <= 5; i++)
                Console.WriteLine(i);
        }; // notice the semicolon
        count();
    }
}

/* Output

۰
۱
۲
۳
۴
۵

*/

در این برنامه ابتدا یک delegate type به اسم CountIt تعریف کرده‌ایم. درون متد اصلی، یک instance از این delegate تعریف کرده و آن را با یک بلوک کد مساوی قرار داده‌ایم که قبل از آن بلوک، کلمه‌ی کلیدی delegate را می‌بینید. این بلوک کد، anonymous method است که بعد از فراخوانی count، اجرا می‌شود. به semicolon انتهای بلوک نیز توجه داشته باشید.

به مثال بعد توجه کنید:

using System;
// Notice that CountIt now has a parameter.
delegate void CountIt(int end);
class AnonMethDemo2
{
    static void Main()
    {
        // Here, the ending value for the count
        // is passed to the anonymous method.
        CountIt count = delegate(int end)
        {
            for (int i = 0; i <= end; i++)
                Console.WriteLine(i);
        };
        count(3);
        Console.WriteLine();
        count(5);
    }
}

/* Output

۰
۱
۲
۳
۰
۱
۲
۳
۴
۵

*/

همان‌طور که می‌بینید، CountIt در مثال بالا شامل یک integer argument است. پارامتر نیز بعد از کلمه‌ی کلیدی delegate مشخص شده است.

سی‌شارپ دو نوع از anonymous function را تعریف می‌کند که عبارتند از anonymous method و lamba expression. تا این‌جا با anonymous method آشنا شدید. در ادامه با lamba expression آشنا خواهید شد.

Lambda Expression

Lambda expression راهی دیگر برای ساخت anonymous function است. از این‌رو، lambda expression می‌تواند به delegate اختصاص داده شود. به‌دلیل این‌که lambda expression راحت‌تر از anonymous method معادل است، پیشنهاد می‌شود که تقریبا در همه‌ی موارد از lambda expression استفاده شود.

تمامی lambda expression ها از lambda operator استفاده می‌کنند که عبارت است از: <=

این operator یک lambda را به دو قسمت تقسیم می‌کند. در سمت چپ، پارامترهای ورودی و در سمت راست، بدنه‌ی lambda مشخص می‌شود.

به مثال زیر توجه کنید:

using System;

delegate int Incr(int v);
delegate bool IsEven(int v);

class SimpleLambdaDemo
{
    static void Main()
    {
        // A lambda expression that increases its parameter by 2.
        Incr incr = count => count + 2;

        Console.WriteLine("Use incr lambda expression: ");
        int x = -10;
        while (x <= 0)
        {
            Console.Write(x + " ");
            x = incr(x); // increase x by 2
        }
        Console.WriteLine("\n");

        // a lambda expression that returns true if its parameter
        // is even and false otherwise.
        IsEven isEven = n => n % 2 == 0;

        Console.WriteLine("Use isEven lambda expression: ");
        for (int i = 1; i <= 10; i++)
            if (isEven(i)) Console.WriteLine(i + " is even.");
    }
}

/* Output
 
se incr lambda expression:
-۱۰ -۸ -۶ -۴ -۲ ۰
Use isEven lambda expression:
۲ is even.
۴ is even.
۶ is even.
۸ is even.
۱۰ is even.
 
*/

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

Incr incr = count => count + 2;
IsEven isEven = n => n % 2 == 0;

عبارت اول به incr‌ یک lambda expression را اختصاص می‌دهد که مقدار فرستاده شده به count‌ را با ۲ جمع کرده و نتیجه را return‌ می‌کند. این عبارت می‌تواند به Incr delegate‌ اختصاص یابد زیرا با تعریف Incr تطابق دارد. در عبارت دوم، اگر حاصل lambda یک عدد زوج باشد، مقدار true و اگر حاصل عددی فرد باشد، مقدار false را return خواهیم کرد.

به مثال زیر توجه کنید:

using System;

delegate int IntOp(int end);

class StatementLambdaDemo
{
    static void Main()
    {
        IntOp fact = n =>
        {
            int r = 1;
            for (int i = 1; i <= n; i++)
                r = i * r;
            return r;
        };

        Console.WriteLine("The factorial of 3 is " + fact(3));
        Console.WriteLine("The factorial of 5 is " + fact(5));
    }
}

/* Output

The factorial of 3 is 6
The factorial of 5 is 120

*/

تفاوت مثال بالا با مثال قبل، این است که در این مثال، lambda شامل بدنه است.

Events

Event یکی دیگر از ویژگی‌های مهم سی‌شارپ است که بر اساس delegate می‌باشد. یک object می‌تواند برای یک event تعدادی event handler را register کند و هنگامی‌که یک event اتفاق می‌افتد، تمامی handler های register شده، فراخوانی می‌شوند. Event handler ها باید مطابق با delegate باشند.

Event ها اعضای کلاس هستند و توسط کلمه‌ی کلیدی event تعریف می‌شوند. فرم آن به شکل زیر است:

event event-delegate event-name;

در این‌جا، event-delegate نام آن delegate است که این event را support می‌کند و event-name نام همین event object است که تعریف کرده‌ایم.

به مثال زیر توجه کنید:

using System;
delegate void MyEventHandler();
class MyEvent
{
    public event MyEventHandler SomeEvent;
    public void OnSomeEvent()
    {
        if (SomeEvent != null)
            SomeEvent();
    }
}
class EventDemo
{
    static void Handler()
    {
        Console.WriteLine("Event Occurred!");
    }
    static void Main()
    {
        MyEvent evt = new MyEvent();
        evt.SomeEvent += Handler;
        evt.OnSomeEvent();
    }
}

/* Output

Event Occurred!

*/

این برنامه با تعریف delegate type برای event handler شروع می‌شود:

delegate void MyEventHandler();

تمام event ها از طریق delegate فعال می‌شوند. از این‌رو، event delegate type، نوع بازگشتی و signature را برای event مشخص می‌کند.

سپس، کلاس MyEvent تعریف شده که درون آن، یک event به نام SomeEvent تعریف شده است:

public event MyEventHandler SomeEvent;

همچنین، درون کلاس MyEvent یک متد به نام ()OnSomeEvent وجود دارد که برای fire کردن event استفاده می‌شود. یعنی این همان متدی است که وقتی event اتفاق می‌افتد، فراخوانی می‌شود. این متد، event handler را از طریق SomeEvent delegate فراخوانی می‌کند:

if (SomeEvent != null)
            SomeEvent();

دقت کنید که handler درصورتی فراخوانی می‌شود که SomeEvent برابر با null نباشد. درون کلاس EventDemo یک متد به اسم ()Handler وجود داردکه درون متد ()Main به‌عنوان handler برای event شیء تعریف شده، register می‌شود:

MyEvent evt = new MyEvent();
evt.SomeEvent += Handler;

دقت کنید که handler از طریق += افزوده شده است. event ها فقط از += و -= پیشتیبانی می‌کنند. در نهایت می‌بینید که event به‌صورت زیر fire شده است:

evt.OnSomeEvent();

فراخوانی ()OnSomeEvent موجب می‌شود تا تمامی event handler های register شده، فراخوانی شوند. در این مورد تنها یک handler را register کرده بودیم اما می‌توانید تعداد بیشتری را نیز register کنید.

در مثال زیر نحوه‌ی استفاده از lambda expression با event را می‌بینید:

using System;
delegate void MyEventHandler(int n);
class MyEvent
{
    public event MyEventHandler SomeEvent;
    public void OnSomeEvent(int n)
    {
        if (SomeEvent != null)
            SomeEvent(n);
    }
}
class LambdaEventDemo
{
    static void Main()
    {
        MyEvent evt = new MyEvent();

        // Use a lambda expression as an event handler.
        evt.SomeEvent += (n) =>
        Console.WriteLine("Event received. Value is " + n);

        // Raise (fire) the event twice.
        evt.OnSomeEvent(1);
        evt.OnSomeEvent(2);
    }
}

/* Output

Event received. Value is 1
Event received. Value is 2

*/

استفاده از List در سی‌شارپ

یک آرایه به‌صورت پویا اندازه‌اش تغییر نمی‌کند اما List به‌صورت پویا resize می‌شود. با استفاده از List دیگر نیاز ندارید تا اندازه‌ی آن را ابتدای کار مشخص کنید و در واقع با استفاده از List آرایه‌ای می‌سازید که اندازه‌ی محدود نیست.

فرم کلی List به شکل زیر است:

List list-name = new List();

در این‌جا، کلمه‌ی کلیدی List بیان‌کننده‌ی این امر است که قصد ساخت یک collection از نوع List را داریم. type مشخص‌کننده‌ی جنس List است که می‌تواند int و string و … باشد.

در مثال زیر ابتدا یک List از جنس int تعریف می‌کنیم (بدون مشخص کردن اندازه) و سپس مقادیری را به آن می‌افزاییم. مقادیر به همان ترتیبی که افزوده شده‌اند در List ذخیره می‌شوند:

using System;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        List list = new List();
        list.Add(2);
        list.Add(3);
        list.Add(5);
        list.Add(7);

        foreach (int item in list) {
            Console.WriteLine(item);
        }

        // Or
        Console.WriteLine();

        // Count property on the List type, is equal to Length on arrays.
        for (int i = 0; i < list.Count; i++) {
            Console.WriteLine(list[i]);
        }

    }
}

/* Output

۲
۳
۵
۷

۲
۳
۵
۷

*/

در این مثال، ابتدا یک List از جنس int تعریف کرده و سپس با فراخوانی متد ()Add مقادیر مختفی را در list ذخیره کرده‌ایم. در ادامه می‌بینید که با استفاده از حلقه foreach می‌توانید به‌سادگی مقادیر درون list را نمایش دهید. هچنین مشاهده می‌کنید که توسط حلقه‌ی for نیز می‌توانید به مقادیر درون list دسترسی داشته باشید. نکته مورد توجه در حلقه‌ی for برای استفاده از list، Count property است که معادل length property در هنگام استفاده از آرایه می‌باشد.

به مثال بعد توجه کنید:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<bool> list = new List<bool>();
        list.Add(true);
        list.Add(false);
        list.Add(true);
        Console.WriteLine(list.Count); // 3

        list.Clear();
        Console.WriteLine(list.Count); // 0
    }
}

/* Output
 
۰
۳
 
*/

همان‌طور که در مثال بالا مشاهده می‌کنید، list.Count تعداد عناصر ذخیره شده در List است. بعد از فراخوانی ()Clear تمامی عناصر ذخیره شده در List از بین می‌روند.

به مثال بعد توجه کنید:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        int[] arr = new int[3]; // New array with 3 elements
        arr[0] = 2;
        arr[1] = 3;
        arr[2] = 5;
        List list = new List(arr); // Copy to List
        Console.WriteLine(list.Count);       // 3 elements in List
    }
}

/* Output

۳

*/

همان‌طور که می‌بینید، می‌توانید یک آرایه‌ی از پیش آماده شده را مستقیماً درون یک List کپی کنید.

به مثال زیر توجه کنید:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List list = new List(new int[] { 19, 23, 29 });

        // Finds first element greater than 20
        int result = list.Find(item => item > 20);

        Console.WriteLine(result);
    }
}

/* Output

۲۳

*/

یکی دیگر از متدهای List متد ()Find است که غالباً از lambda expression استفاده می‌کند.

List شامل متدهای بسیاری است که برای مطالعه‌ی آن‌ها می‌توانید این لینک را ببینید.



نویسنده / مترجم : مسعود درویشیان

علاقه مند به موسیقی و برنامه نویسی بازی


۵۲ دیدگاه برای این نوشته ثبت شده است


  1. بیژن
    ۲۸ اسفند ۱۳۹۲

    سلام
    قرار بود صد قسمت باشد چرا در نوشتید قسمت پایانی؟




    • مسعود درویشیان
      ۲۸ اسفند ۱۳۹۲

      سلام. الان احتمالاً این سوال واسه همه پیش اومده که چرا ۵۰ قسمت؟ مگه قرار نبود ۱۰۰ قسمت باشه؟
      وقتی شروع به نوشتن زنگ سی‌شارپ کردم، همزمان با انتشار هر قسمت، قسمت بعد در حال آماده‌سازی بود و این‌طور بود که مقاله‌ها کامل نوشته نشده بودن و تخمین می‌زدم اگه بخوام همه‌ی سرفصل‌های مهم سی‌شارپ رو بگم حدوداً ممکنه ۱۰۰ قسمت بشه تا اینکه به قسمت ۵۰ رسیدیم و با توجه به اینکه حجم هر قسمت حدود ۱۰ صفحه بود و سریع پیش رفتیم، دیدم که الان همه‌ی سرفصل‌های مهم رو گفتم و عملاً چیزه اساسی دیگه‌ای نمونده و اگه بخوام تا ۱۰۰ بگم باید وارد جزییاتی بشم که هدفم واسه نوشتن این مقاله، اون جزییات نیستن! من اگه بخوام می‌تونم تا ۵۰۰ قسمت هم مطلب بنویسیم و باز هم تموم نمی‌شه و مطلب هست که بگم. الان همین ۵۰ قسمت رو اگه یه کتاب در نظر بگیرید، یه کتاب ۵۰۰ صفحه‌ای می‌شه که واسه یادگیری برنامه‌نویسی مناسبه!
      توی این ۵۰ قسمت تمام سرفصل‌های مهم و ضروری سی‌شارپ رو گفتم و هرکسی که این ۵۰ قسمت رو خوب تمرین کنه و بفهمه، راحت می‌تونه یه پلتفرم رو انتخاب کنه و شروع به یادگیری و کدنویسی روی اون پلتفرم بکنه و وارد بازار کار بشه. البته همیشه و مطلب واسه یادگیری هست و این ۵۰ قسمت صرفاً یه شروع خوب واسه ورود به دنیای برنامه‌نویسی و سی‌شارپ هست اما تمام برنامه‌نویسی نیست و حالا حالاها باید یاد بگیرید و تمرین کنید تا تخصص پیدا کنید. امیدوارم که این مجموعه واسه شروع برنامه‌نویسی براتون مفید واقع بشه
      توی سال ۹۳ هم آموزش‌های زیادی رو سعی می‌کنم توی سایت قرار بدم
      موفق باشید.




      • شیوا
        ۱۴ اردیبهشت ۱۳۹۳

        خواهشا برام ی برنامه بزار دانلود کنم سی شارپ باشه لطفا




  2. فرزاد
    ۲۸ اسفند ۱۳۹۲

    خیلی خیلی ممنون به قول خودتون همین واسه شروع کار کافی هست ولی من امیدوارم بازم آموزش های خوبتون رو برای سال ۹۳ داشته باشیم و امیدوارم سال ۹۳ سالی پر از موفقیت برای شما همراه با شادی و سلامتی در کنار خانوادتون باشه
    بی نهایت متشکرم.




  3. نسیم
    ۲۹ اسفند ۱۳۹۲

    سلام
    ممنون آقای درویشیان
    خدا قوت …..
    آموزش ها حقیقتا عالی است.
    امیدوارم سال خوب و پربرکتی داشته باشید.




  4. بیژن
    ۲۹ اسفند ۱۳۹۲

    سال نو را تبریک عرض میکنم واز زحمات شما برای آموزش زبان سی شارپ تشکر میکنم




  5. داود حاجی پور
    ۲۹ اسفند ۱۳۹۲

    جناب آقای مهندس درویشیان واقعا خسته نباشید از این پنجاه قسمت بنحو احسن استفاده بردم واقعا عالی بود ، بی صبرانه منتظرم که تو سال ۱۳۹۳ می خوایین چه شاهکاری بکنین .
    شاهکار از این بابت که واقعا سایت های ایرانی چیزی برای آموزش اونم تو این سطح و بروز شده ندارن و واقعا کار شما شاهکار بود بازم تشکر و سالی پر از کامیابی و ثروت برات آرزومندم ، قربانت داود




  6. elmo
    ۲۹ اسفند ۱۳۹۲

    سلام مهندس
    واقعا کارت عالی بود
    امیدوارم سال ۹۳ سال خوبی برات باشه




  7. مدافع
    ۱ فروردین ۱۳۹۳

    مقاله خیلی خوبی بود/




  8. فروشگاه عروسک
    ۳ فروردین ۱۳۹۳

    ممنون مقاله جالبیه به درد بخور و کامل




  9. فرزاد
    ۱۲ فروردین ۱۳۹۳

    سلام خسته نباشید خیلی دوست دارم یه سوالی به پرسم به این مطلب مربوط نیست ولی دیگه نمیدونستم باید کجا بپرسم
    خواستم بگم سایت به این خوبی چرا بخش های دیگه سایت فعال نیست مثل ایده و خلاقیت چرا دیگه بقیه نویسنده ها مطلبی نمیذارن؟ حتی ببخشید که میگم ولی C# هم خیلی دیر به دیر به روز رسانی میشد من نمیخوام قدر نشناس باشم واقعا متشکرم ولی خواستم بگم دوست دارم این سایت بیشر فعال باشه همین.




  10. Arian
    ۲۹ فروردین ۱۳۹۳

    سلام خدمت شما جناب آقای درویشیان
    امیدوارم خوب باشید…
    لطفا میشه راهنمایی کنید برای ادمه سی شارپ چه عملی باید انجام دهیم؟
    من به خاطر این همه زحمات شما سپاسگزارم.
    امیدوارم موفق وپیروز باشید.




    • مسعود درویشیان
      ۲۹ فروردین ۱۳۹۳

      سلام ممنون از لطف‌تون
      اول این‌که سعی کنید به مطالب ارائه شده تسلط کافی پیدا کنید و بعد تصمیم بگیرید که روی چه پلتفرمی دوست دارین بیشتر فعالیت کنین. مثلاً اگه به برنامه‌نویسی server-side علاقه دارین می‌تونین ASP.NET (با توجه به این‌که سی‌شارپ بلدین) کار کنید یا اگه به برنامه‌نویسی موبایل علاقه داشته باشید می‌تونین واسه همون پلتفرم برنامه بنویسید یا هر چیزه دیگه. چیزی که خیلی مهمه این هست که باید پیوسته در حال کتاب خوندن در زمینه برنامه‌نویسی باشید و زیاد تمرین کنید. به‌علاوه اینکه زبان انگلیسی‌تون هم قوی کنید چون کتاب فارسی درست حسابی تو زمینه‌ی برنامه‌نویسی معمولاً پیدا نمی‌شه!
      در کل بعد از اینکه سی‌شارپ رو در حد قابل قبولی یاد گرفتین، باید پلتفرم مورد علاقه‌تون رو پیدا کنید و در موردش کتاب بخونید و تمرین کنید.




  11. مهدی شکری
    ۱ اردیبهشت ۱۳۹۳

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




  12. اسماعیل
    ۳ اردیبهشت ۱۳۹۳

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




  13. مریم
    ۳ خرداد ۱۳۹۳

    خسته نباشید این برنامه ها ماله دات نت چنده؟




  14. تشک بادی
    ۴ خرداد ۱۳۹۳

    سلام و خسته نباشید.با تشکر از سایت خوبتون.
    خدا قوت




  15. تور ترکیه
    ۱۳ خرداد ۱۳۹۳

    خدا خیرتون بده




  16. alireza
    ۳۰ تیر ۱۳۹۳

    سلام جناب مهندس.خدا خیرتون بده.خیلی مطالتون عالی بود .واقعا حال کردن.جناب مهندس آموزش asp.net رو هم امکانش هست آموزش بدید؟
    خیلی خیلی ممنون




  17. طراحی سایت
    ۲۷ مرداد ۱۳۹۳

    متشکرم از سایت خوشگلتون.




  18. مسعود
    ۸ شهریور ۱۳۹۳

    با سلام
    احتراما” از لطف جتابعالی کمال تشکر را دارم . بهتر است محیط گرافیکی را تدریس قرمایید تا کار شروع شده نیمه تمام نماند .




  19. طراحی سایت
    ۳۰ مهر ۱۳۹۳

    بسیار ممنون




  20. کوتاه کننده لینک
    ۳۰ آبان ۱۳۹۳

    بسیار عالی بود ممنون از زحماتتون سایت بسیار پر محتوایی دارید و قابل استفاده امیدوارم راهتون رو ادامه بدید




  21. AliScan
    ۲۲ آذر ۱۳۹۳

    سلام

    من تمام آموزشهاتون رو دانلود کردم،گفتم حداقل کاری که می تونم بکنم تشکره،خواستم ازتون تشکر کنم بابت زحمتی کشیدین واسه این آموزش

    اگه همین کد نویسی رو تو زمینه بازیسازی،انجینی مثل یونیتی هم آموزش بدین دیگه ترکوندین☺

    با تـــــــــشکر♥




  22. حسن نادی
    ۱ دی ۱۳۹۳

    سلام دوستان خسته نباشید
    کسی سورس یا آموزش رسم لوزی با ستاره رو در سی شارپ نداره
    واقعان برام مهمه اگر دارید به این ایمیل برام بفرستید
    hnadi35@yahoo.com




  23. پویا
    ۵ دی ۱۳۹۳

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




  24. آپلود عکس
    ۳۰ دی ۱۳۹۳

    آموزش خیلی مفید و کاملی بود ، یک دنیا ممنون !




  25. دالاهو 
    ۷ بهمن ۱۳۹۳

    سلام ، آموزش خیلی خوبی بود
    ممنون از سایت خوبتون
    لطفا در صورت امکان آموزش گام به گام css رو در سایت قرار بدید




  26. ماشین ظرفشویی
    ۱۸ بهمن ۱۳۹۳

    عالی بود ، با سپاس فراوان از زحمات شما




  27. میلاد
    ۲۴ اسفند ۱۳۹۳

    ممنون، خیلی به درد خورد مهندس…




  28. پرشین نایس
    ۵ فروردین ۱۳۹۴

    عالی بود سایت بسیار خوبی دارید با تشکر از شما




  29. برنامه نویس
    ۱۱ فروردین ۱۳۹۴

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




  30. هادی
    ۲۱ فروردین ۱۳۹۴

    خیلی خیلی عالی بود واقعا خسته نباشید .




  31. امین
    ۱۳ اردیبهشت ۱۳۹۴

    ممنون از مقاله بسیار خوب و آموزندتون




  32. سجاد
    ۳۰ اردیبهشت ۱۳۹۴

    “علاقه مند به موسیقی و برنامه نویسی بازی”
    با عرض سلام
    ممنون میشم برنامه نویسی بازی هم آموزش بدید
    اگه آموزش اسکیریپت نویسی با C# تو موتور unity رو بذارید خیلی عالی میشه (مخصوصا الان که آموزش سی شارپ تموم شده) :)




  33. fmoasher
    ۱۳ خرداد ۱۳۹۴

    باسلام وخسته نباشید
    مدت زیادی بود دنبال همچین سایت اموزشی میگشتم واقعا ازتون ممنونم
    خیلی واسم مفید بود…




  34. منصوره
    ۳۱ خرداد ۱۳۹۴

    ممنون اجرتون با خدا
    البته من هنوز جلسه ۱۰ هستم ولی واقعا دارم لذت میبرم




  35. علیرضا
    ۱۸ تیر ۱۳۹۴

    خیلی ممنون آموزش بسیار مفید بود یه دنیا ممنون.




  36. رضا
    ۲۶ تیر ۱۳۹۴

    با سلام آقای مهندس یا دوست عزیزم ممنونم از اموزشی که
    ذاشته بودید قرار بود در سال ۹۳ و ۹۴ ادامه ی قسمت های سی شارپ از قسمت ۵۱ به بعد را هم بزاری ممنون میشم اینکار را کنی تا ما هم از این اطلاعاتون استفاده کنیم




  37. فرهاد
    ۳۰ تیر ۱۳۹۴

    سلام و درود و خسته نباشید
    مهندس درویشیان ممنون بابت آموزش سی شارپی که ارایه دادین
    اول خوشحالم از اینکه در قسمت پایانی خداحافظی نکردید :)
    این به معنی این هست که بازم شما مطلب آموزشی سی شارپ خواهید گذاشت عایا ؟
    اگه در سایت دیگه ای فعالیت میکنید به منم خبر بدید
    من سی شارپ رو میخوام در سطح پیشرفته دنبال کنم و پیگیر هم هستم
    لطفا راهنمایی کنید
    با تشکر




  38. کامران
    ۱۸ مرداد ۱۳۹۴

    به نظرم در قسمت اموزش List این خط اشتباه نوشته شده

    List list = new List();
    فکر کنم باید جنریک باشه
    به این صورت
    List list = new List(); //Generic

    درسته ؟




  39. فروشگاه عروسک
    ۱۴ شهریور ۱۳۹۴

    واقعا اموزش مفیدی بود من که خیلی وقته سی شارپ کار می کنم از این مقالات چیزهای مفیدی یاد گرفتم ممنون




  40. mahsa
    ۲۶ شهریور ۱۳۹۴

    واقعا دستتون درد نکنه
    خیلی عالی بودن مطالب
    مفید و قابل درک




  41. جواد بابایی
    ۱۷ مهر ۱۳۹۴

    سلام دوستان این اموزش ادامه داره؟
    آقا من می خوام برنامه های گرافیکی بنویسم مهندس اگر میشه اونا رو هم توضیح بدین مثلا کار کردن با pen چرخوندن اشکال نوشتن ربات یکسری برنامه های گرافیکی باید از کجا شروع کرد؟




  42. طراحی سایت
    ۳۰ مهر ۱۳۹۴

    بسیار عالی بود، ممنون بابت به اشتراک گذاری




  43. بچینگ پلانت
    ۲۸ آبان ۱۳۹۴

    بسیار عالی بود مرسی




  44. میثم
    ۲۳ آذر ۱۳۹۴

    سلام ممنون از مقالات خوبی که گذاشتین
    من یک سوال داشتم که خیلی دنبالش گشتم ولی نتونستم جایی پیدا کنم
    سوالم اینه که وقتی تو سی شارپ بخواییم از روی یک فایل داده ها رو بخونیم و کاراکتر به کاراکتر پیمایش کنیم چیکار باید کنیم؟یعنی چطور میشه داده های روی یک خط و به متغیر های تعریف شده منتسب کنیم؟؟
    ممنون میشم جوابمو بدین




  45. حمید
    ۱۳ تیر ۱۳۹۵

    خسه نباشی جوون




  46. سامان
    ۱۷ تیر ۱۳۹۵

    واقعا که عالی بود مرسی




  47. hossein
    ۲۴ شهریور ۱۳۹۵

    بسیار بسیار عالی بود ممنون




  48. علیرضا
    ۲۰ مهر ۱۳۹۵

    سلام خسته نباشید
    بسیار عالی بود ..
    فقط سوالم این هستش که آیا الگوریتم و فلوچارت رو هم میشه به صورت شی گرا نوشت یا باید به روش معمول نوشت و موقع کد کردن شی گرا بنویسیم؟!
    خیلی ممنون میشم پاسخ بدین …



دیدگاه خود را بنویسید





نشانی ایمیل شما منتشر نخواهد شد.

کامنت های شما بعد از تأیید توسط نویسنده وبلاگ، منتشر خواهند شد.

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

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

برای قرار دادن کدهای نمونه می توانید از تگ های [php] ، [html] ، [css] و [js] استفاده کنید.
به عنوان مثال کدهای php را می توان به صورت زیر قرار داد:
[php] var $whoLoveIranians = "WebTarget!"; [/php]



کلیه حقوق مادی و معنوی برای وب سایت وب تارگت محفوظ است ©2017 webtarget.ir

استفاده از مطالب وب سایت در سایر وب سایت‌ها و نشریات چاپی با ذکر منبع آزاد است.