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

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


مسعود درویشیان 62 دیدگاه سی شارپ Tuesday, 18th March , 2014 115512 بازدید

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

استفاده از 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

0
1
2
3
4
5

*/

در این برنامه ابتدا یک 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

0
1
2
3
0
1
2
3
4
5

*/

همان‌طور که می‌بینید، 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:
-10 -8 -6 -4 -2 0
Use isEven lambda expression:
2 is even.
4 is even.
6 is even.
8 is even.
10 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

2
3
5
7

2
3
5
7

*/

در این مثال، ابتدا یک 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
 
0
3
 
*/

همان‌طور که در مثال بالا مشاهده می‌کنید، 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

3

*/

همان‌طور که می‌بینید، می‌توانید یک آرایه‌ی از پیش آماده شده را مستقیماً درون یک 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

23

*/

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

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



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

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


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


  1. بیژن
    19 March 2014

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



    • سلام. الان احتمالاً این سوال واسه همه پیش اومده که چرا 50 قسمت؟ مگه قرار نبود 100 قسمت باشه؟
      وقتی شروع به نوشتن زنگ سی‌شارپ کردم، همزمان با انتشار هر قسمت، قسمت بعد در حال آماده‌سازی بود و این‌طور بود که مقاله‌ها کامل نوشته نشده بودن و تخمین می‌زدم اگه بخوام همه‌ی سرفصل‌های مهم سی‌شارپ رو بگم حدوداً ممکنه 100 قسمت بشه تا اینکه به قسمت 50 رسیدیم و با توجه به اینکه حجم هر قسمت حدود 10 صفحه بود و سریع پیش رفتیم، دیدم که الان همه‌ی سرفصل‌های مهم رو گفتم و عملاً چیزه اساسی دیگه‌ای نمونده و اگه بخوام تا 100 بگم باید وارد جزییاتی بشم که هدفم واسه نوشتن این مقاله، اون جزییات نیستن! من اگه بخوام می‌تونم تا 500 قسمت هم مطلب بنویسیم و باز هم تموم نمی‌شه و مطلب هست که بگم. الان همین 50 قسمت رو اگه یه کتاب در نظر بگیرید، یه کتاب 500 صفحه‌ای می‌شه که واسه یادگیری برنامه‌نویسی مناسبه!
      توی این 50 قسمت تمام سرفصل‌های مهم و ضروری سی‌شارپ رو گفتم و هرکسی که این 50 قسمت رو خوب تمرین کنه و بفهمه، راحت می‌تونه یه پلتفرم رو انتخاب کنه و شروع به یادگیری و کدنویسی روی اون پلتفرم بکنه و وارد بازار کار بشه. البته همیشه و مطلب واسه یادگیری هست و این 50 قسمت صرفاً یه شروع خوب واسه ورود به دنیای برنامه‌نویسی و سی‌شارپ هست اما تمام برنامه‌نویسی نیست و حالا حالاها باید یاد بگیرید و تمرین کنید تا تخصص پیدا کنید. امیدوارم که این مجموعه واسه شروع برنامه‌نویسی براتون مفید واقع بشه
      توی سال 93 هم آموزش‌های زیادی رو سعی می‌کنم توی سایت قرار بدم
      موفق باشید.




      • شیوا
        4 May 2014

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




  2. فرزاد
    19 March 2014

    خيلي خيلي ممنون به قول خودتون همين واسه شروع كار كافي هست ولي من اميدوارم بازم آموزش هاي خوبتون رو براي سال 93 داشته باشيم و اميدوارم سال 93 سالي پر از موفقيت براي شما همراه با شادي و سلامتي در كنار خانوادتون باشه
    بي نهايت متشكرم.




  3. نسیم
    20 March 2014

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




  4. بیژن
    20 March 2014

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




  5. داود حاجی پور
    20 March 2014

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




  6. elmo
    20 March 2014

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




  7. مدافع
    21 March 2014

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



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




  9. فرزاد
    1 April 2014

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




  10. Arian
    18 April 2014

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



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




  11. مهدی شکری
    21 April 2014

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




  12. اسماعیل
    23 April 2014

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




  13. مریم
    24 May 2014

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




  14. تشک بادی
    25 May 2014

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



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




  16. alireza
    21 July 2014

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




  17. طراحی سایت
    18 August 2014

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




  18. مسعود
    30 August 2014

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




  19. طراحی سایت
    22 October 2014

    بسیار ممنون



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




  21. AliScan
    13 December 2014

    سلام

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

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

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




  22. حسن نادی
    22 December 2014

    سلام دوستان خسته نباشید
    کسی سورس یا آموزش رسم لوزی با ستاره رو در سی شارپ نداره
    واقعان برام مهمه اگر دارید به این ایمیل برام بفرستید
    [email protected]




  23. پویا
    26 December 2014

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




  24. آپلود عکس
    20 January 2015

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




  25. دالاهو 
    27 January 2015

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



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




  27. میلاد
    15 March 2015

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




  28. پرشین نایس
    25 March 2015

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



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




  30. هادی
    10 April 2015

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




  31. امین
    3 May 2015

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




  32. سجاد
    20 May 2015

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




  33. fmoasher
    3 June 2015

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




  34. منصوره
    21 June 2015

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




  35. علیرضا
    9 July 2015

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




  36. رضا
    17 July 2015

    با سلام آقای مهندس یا دوست عزیزم ممنونم از اموزشی که
    ذاشته بودید قرار بود در سال 93 و 94 ادامه ی قسمت های سی شارپ از قسمت 51 به بعد را هم بزاری ممنون میشم اینکار را کنی تا ما هم از این اطلاعاتون استفاده کنیم




  37. فرهاد
    21 July 2015

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




  38. کامران
    9 August 2015

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

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

    درسته ؟



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




  40. mahsa
    17 September 2015

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




  41. جواد بابایی
    9 October 2015

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




  42. طراحی سایت
    22 October 2015

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




  43. بچینگ پلانت
    19 November 2015

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




  44. میثم
    14 December 2015

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




  45. حمید
    3 July 2016

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




  46. سامان
    7 July 2016

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




  47. hossein
    14 September 2016

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




  48. Soltani
    27 September 2016

    با درود
    عالی بود , خیلی دنبال این نوشتارها بودم ,
    همیشه موفق و سرفراز باشید




  49. علیرضا
    11 October 2016

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




  50. ماه
    22 November 2016

    سلام خدمت جناب مهندس درویشیان خیلی خیلی ازتون ممنونم ازتون میخوام این آموزش ادامه پیدا کنه.کمتر کسی مثه شما با جزئیات کامل و بصورت قابل درک مطلب مینویسه.امیدوارم موفق و سربلند باشین همیشه




  51. محمد
    6 February 2017

    با عرض سلام و خسته نباشید ،، من واقعن از سایت و آموزش هایی خیلیی معرکه و خوبی که حتی پی دی افش رو برا دانلود قرار دادین خیلییییی ممنون و سپاس گذارم هم لذت بردم هم کارم راه افتاد خیلیی مرسییییی ، ان شالله همینجوری که با این کار خیرخواهانه باعث شدید گره کار عده ای باز بشه امیدوارم که در زندگی و کارتون هیچوقت گره ای نباشه و اگر هم خدایی نکرده بود از خدا میخوام که سبب بسازه تا خیلی راحت مشکلاتتون حل بشه و همیشه در زندگی و کارتون شاد و موفق و سربلند باشید @–>–




  52. حمید
    4 April 2017

    ممنون از آموزش خوب شما




  53. عطاوالله
    24 May 2017

    Ring Buffer میشه لطف کنید در بار این موضوع کمی توضحی دهید.




  54. ratin
    30 July 2017

    با تشکر از آموزش خوبتون




  55. سبحان
    8 December 2017

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




  56. امین شمس الهی
    22 February 2018

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




  57. حامد
    17 December 2018

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




  58. رضا
    23 October 2019

    ای کاش 500 قسمت بود . تا قسمت 47 آموزشتونو سال 92 همراهی کردم بعد اینهمه سال باز یادی کردم دیدم چندقسمت دیگه اضافه شده . آموزشا ساده و کاربردی بود .فوق العاده . متشکر



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





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

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

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

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

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



کلیه حقوق مادی و معنوی برای وب سایت وب تارگت محفوظ است ©2024 وب‌تارگت

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