بررسی Anonymous Type ها در زبان برنامه نویسی سی شارپ

بررسی Anonymous Type ها در زبان برنامه نویسی سی شارپ

در این پست از وبسایت پرووید، در رابطه با بررسی Anonymous Type ها در زبان برنامه نویسی سی شارپ صحبت خواهیم کرد. به ادامه ی مطلب بروید.

در این قسمت از این آموزش از وبسایت پرووید قصد داریم در رابطه با Data Type های بی نام یا اصطلاحاً Anonymous Type ها صحبت کنیم. می‌دانیم که Anonymous Type ها در واقع Data Type هایی هستند که برای استفاده از آنها نیازی به تعریف کردن Type مورد نظر نیست. به عبارت دیگر در سی شارپ می‌توانیم با استفاده از کلمه کلیدی var یک Object از یک Data Type را زمانی که آن Data Type در یک کلاس تعریف نشده است استفاده کنیم. با استفاده از کلمه کلیدی var که برای تعریف یک متغیر به روش Implicitly Typed می باشد و در یک مطلب با عنوان بررسی var در زبان برنامه نویسی سی شارپ از وبسایت پرووید در رابطه با آن صحبت کرده ‌ایم اقدام به تعریف کردن Anonymous Type ها می کنیم. لطفاً کد زیر را بررسی کنید.

var myAnonymousType = new { firstProperty = "First", 
    secondProperty = 2, 
    thirdProperty = true 
};

در کدی که در قسمت بالا مشاهده می کنید ما یک Anonymous Type با نام myAnonymousType را با کلمه کلیدی new تعریف کرده ایم. در مطلب بررسی Keyword های رزور شده در زبان سی شارپ در رابطه با کلمات کلیدی در سی شارپ صحبت کرده ایم. ضمناً برای مقدار دادن به Property های Anonymous Type ها از روش Object Initialization که بعداً در رابطه با آن بیشتر صحبت می‌کنیم استفاده شده است.

یک Anonymous Type یک Data Type موقت یا اصطلاحاً Temporary می باشد که داده های درون آن با استفاده از Object Initialization مقدار دهی می شوند. دقت کنید که Property های یک Anonymous Type فقط خواندنی یا اصطلاحاQ Read Only می باشند. پس نمی توان مقدار آنها را تغییر داد. نکته دیگر اینکه Intellisense در ویژوال استودیو به طور کامل از Anonymous Type ها پشتیبانی می کند. این موضوع در تصویر زیر نشان داده شده است.

موضوع دیگر اینکه کامپایلر بر اساس مقداری که در درون هر کدام از Property های Anonymous Type قرار می دهید Data Type آن Property را مشخص می‌کند. به عبارت دیگر در مثال ما پروپرتی firstProperty از نوع string و secondProperty از نوع int و نهایتاً thirdProperty از نوع bool می باشد.

اتفاقی که در پشت پرده در زمان تعریف یک Anonymous Type رخ می دهد این است که کامپایلر به صورت خودکار یک Type جدید را تولید می کند. شما می توانید این موضوع را در کد زیر مشاهده کنید.

static void Main(string[] args)
{
    var myAnonymousType = new { firstProperty = "First", 
                                secondProperty = 2, 
                                thirdProperty = true 
                              };

    Console.WriteLine(myAnonymousType.GetType().ToString());
}

خروجی کد زیر شبیه به تصویر زیر می باشد.

همانطور که در خروجی این کد مشاهده می کنید کامپایلر یک Type را با استفاده از یک نام رمز گونه برای ما ساخته است تا بتواند این Anonymous Type را مورد استفاده قرار بدهد. اگر با ابزارهای Reflector به این Anonymous Type نگاه کنید تصویر زیر را مشاهده خواهید کرد.

نکته مهمی که در این تصویر باید به آن دقت کرد این است که این Anonymous Type از System.Object ارث بری کرده و یک کلاس Sealed می باشد و تمامی Property های آن نیز به صورت Read Only تعریف شده‌اند.

بررسی Anonymous Type های تو در تو یا Nested

در سی شارپ Anonymous Type های تو در تو یا Nested به معنی تعریف یک Anonymous Type در درون یک Anonymous Type دیگر به عنوان یک Property می باشد. این موضوع در کد زیر نشان داده شده است.

var myAnonymousType = new
                        {
                            firstProperty = "First",
                            secondProperty = 2,
                            thirdProperty = true,
                            anotherAnonymousType = new { nestedProperty = "Nested"}
                        };

جالب است که بدانید این نوع از Anonymous Type ها هم توسط Intellisense در ویژوال استودیو پشتیبانی می شوند.

بررسی Scope مربوط به یک Anonymous Type

یک Anonymous Type همیشه به صورت محلی یا Local در درون متدی که در درون آن تعریف شده است استفاده می شود.

بسته ی آموزش ویدئویی مباحث پیشرفته در برنامه نویسی سی شارپ

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی مباحث پیشرفته در برنامه نویسی سی شارپ دیدن کنید.

به عبارت دیگر متدها اغلب یک Anonymous Type را به به عنوان پارامتر به یکدیگر پاس نمی دهند. اما می توان این کار را زمانی که پارامتر مربوط به متد مقصد از نوع Dynamic می باشد انجام داد. این موضوع در کد زیر نشان داده شده است.

static void Main(string[] args)
{

    var myAnonymousType = new
                            {
                                firstProperty = "First Property",
                                secondProperty = 2,
                                thirdProperty = true               
                            };

    DoSomethig(myAnonymousType);
}

static void DoSomethig(dynamic param)
{
    Console.WriteLine(param.firstProperty);
}

لطفاً دقت کنید که پاس دادن Anonymous Type ها با استفاده از Dynamic اغلب توصیه نمی‌شود. خروجی این کد شبیه به تصویر زیر می باشد.

استفاده از Anonymous Type ها در LINQ

یکی از کاربردهای بسیار مهم Dynamic ها در استفاده از LINQ می باشد. در رابطه با استفاده از LINQ توصیه می کنیم که از بسته ی آموزش ویدئویی LINQ در سی شارپ استفاده کنید. دستور Select در LINQ که Projection انجام می‌دهد با استفاده از Anonymous Type ها نتایج یک Query را در درون Property های مختلفی که در هیچ کلاسی تعریف نشده اند قرار می دهد. لطفاً کد زیر را ببینید.

public class Student
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public int age { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        IList<Student> studentList = new List<Student>() { 
                        new Student() { StudentID = 1, StudentName = "John", age = 18 } ,
                        new Student() { StudentID = 2, StudentName = "Steve",  age = 21 } ,
                        new Student() { StudentID = 3, StudentName = "Bill",  age = 18 } ,
                        new Student() { StudentID = 4, StudentName = "Ram" , age = 20  } ,
                        new Student() { StudentID = 5, StudentName = "Ron" , age = 21 } 
                    };

        var studentNames = from s in studentList
                           select new { StudentID = s.StudentID, 
                                        StudentName = s.StudentName 
                                      };
    }
}

همانطور که در کد بالا نیز مشاهده میکنید کلاس Student حاوی Property های متعددی می باشد. دقت کنید که یک دستور LINQ و Select انجام شده است تا یک Anonymous Type تشکیل شود که فقط شامل StudentId و StudentName باشد و تمامی Property های کلاس Student در خروجی کار لحاظ نشود. این روش برای مدیریت کردن حافظه و جلوگیری کردن از داده های غیر ضروری بسیار مناسب است. پس این Collection که به عنوان خروجی این Query در نظر گرفته شده است فقط حاوی دو تا از Property های Student می باشند که در قالب یک Anonymous Type تعریف می شود. تصویر زیر این موضوع را نشان می‌دهد.

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

مرتضی گیتی
بدون نظر

ارسال نظر

نظر
نام
ایمیل
وب سایت