آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

آموزش Anonymous Type و متغیرهای از نوع نامشخص در C#

دوره های مرتبط با این مقاله

آموزش Anonymous Type و متغیرهای از نوع نامشخص

به طور کلی یک آبجکت برای اینکه بتواند property و فیلدهای اختصاصی داشته باشد، نوع آن اول باید تعیین شود. حال anonymous type ها این امکان را برای آبجکت فراهم می کند که بدون اینکه نوع آن صراحتا مشخص شده باشد، تعدادی property با سطح دسترسی readonly را کپسوله سازی کند. لازم به ذکر است که نوع هر property توسط کامپایلر حدس زده می شود.

تعریف و ایجاد آبجکت هایی از نوع Anonymous type

برای ایجاد یک آبجکت از نوع نامشخص/Anonymous کافی است از کلیدواژه ی New و دستور مقداردهی اولیه/ایجاد آبجکت (object initializer) استفاده نمایید.

var anonymousType = new { Property = "count", Value = 1 };  
Console.WriteLine(anonymousType.Property, anonymousType.Value);

در دستور جاری، زمانی که مکان نمای موس را بر روی anonymousType.Property و anonymousType.Value معلق نگه می دارید، می بینید که کامپایلر نوع آن ها را به عنوان string و int حدس می زند.

در تکه کد بالا، همان طور که می بینید یک متغیر با نوع نامشخص (کلیدواژه ی var) تعریف کردیم که اسم دو فیلد عضو آن به ترتیب Property و Value می باشد. کامپایلر نوع فیلدهای عضو آبجکت/متغیر anonymousType را خود به صورت ضمنی حدس می زند. لازم به ذکر است که توسعه دهنده می بایست اسم property که در حافظه مقداردهی اولیه می شود (initialize) را مانند نمونه ی فوق، به وسیله ی عبارت مربوطه مشخص کند.

همچنین لازم است دقت داشته باشید که سایر اعضای معمول یک کلاس نظیر event ها و متدها نمی توانند، عضو یک آبجکت با نوع نامشخص باشند. این نوع آبجکت ها فقط می توانند یک یا چند property که با سطح دسترسی readonly تعریف شده اند را در خود کپسوله سازی نمایند. عبارتی (expression) که برای مقداردهی اولیه یک property بکار می رود، نمی تواند null، یک تابع بی نام (anonymous function) یا نوع pointer باشد.

سناریو دیگری که به کرات با آن مواجه می شویم، مقداردهی اولیه ی یک آبجکت از نوع anonymous با property های یک آبجکت دیگر می باشد. در مثال زیر، متغیر student یک آبجکت از جنس کلاس Student است که علاوه بر دو property به نام Id و Name، چندین property دیگر نیز دارد. هنگامی که ما آبجکت از نوع نامشخص یا anonymous type را با property هایی از student، بدون اینکه اسم property های آبجکت مزبور را مشخص کرده باشیم، مقداردهی اولیه و پر کنیم، در آن صورت کامپایلر اسم اعضایی که با مقدار آن پر می شوند را نیز همان اسم property تنظیم می کند. به همین جهت آبجکت anonymousType نیز دو property به نام های Id و Name خواهد داشت.

class Student  
{  
    public int Id { get; set; }  
    public string FirstName { get; set; }  
    public string LastName { get; set; }  
    public string City { get; set; }  
}  
class Program  
{  
    static void Main(string[] args)  
    {  
        Student student = new Student { Id = 1, Name = "Gaurav Gahlot" };              
        var anonymousType = new { student.Id, student.FirstName };  
        Console.WriteLine(anonymousType.FirstName);  
        // flags a build error, as it is read only   
        anonymousType.LastName = "someValue";    
        // flags a build error, as initializer cannot be a null  
        var anyType = new { PropOne = null, PropTwo = 108 };  
    }  
}

استفاده از متغیرهای از نوع نامشخص/Anonymous Type در LINQ

از Anonymous type معمولا در دستور select از یک query expression (دستور حاوی کوئری) جهت واکشی زیرمجموعه ای از property ها از هر آّبجکت موجود در sequence منبع (ورودی) استفاده می شود. فرض کنید studentsList، مجموعه ای از آبجکت های کلاس Student می باشد. ما می توانیم یک متغیر resultSet از نوع نامشخص (anonymous) با استفاده از عبارت حاوی دستور (query expression) select به همراه collection یا مجموعه ی studentsList مانند زیر ایجاد کنیم:

var groupedList = _paymentList.GroupBy(payment => new { PaymentId = payment.PaymentType })  
.Select(      
        g => new   
             {   
                 PaymentTypeId = g.Key.PaymentId,  
                  SumPaymentAmount = g.Sum(row => row.PaymentAmount)   
              })      
.ToList();
  • خط 1 کد – در این خط ما المان های _paymentList را بر اساس آبجکتی که نوع آن مشخص نیست/ anonymous گروه بندی می کنیم.
  • خط 2 کد – در این مرحله تک تک المان ها را انتخاب کرده و یک آبجکت anonymous جدید از property های آن ایجاد می کنیم.
  • خط 4 کد – در این خط از کد مجموعه ای از آبجکت های از نوع anonymous را در قالب یک لیست بازیابی می کنیم.

در کد بالا، اگر property های آبجکت مورد نیاز تغییر کرد و ما مجبور شدیم که داده های بیشتر/کمتری را واکشی کنیم، آیا کد بالا جواب گو می باشد؟ آیا بایستی یک کلاس جدید ایجاد کنیم یا کلاس جاری را بروز رسانی نماییم؟ بهترین گزینه جهت پاسخ به این نیاز استفاده از متغیرهایی با نوع نامشخص یا anonymous type می باشد.

از آنجایی که ما آبجکت مورد نیاز را در لحظه (در زمان اجرای برنامه) ایجاد می کنیم، امکان استفاده از static typing یا تعریف متغیر هایی از نوع static برای ما وجود ندارد. در اینجا است که کلیدواژه ی var به کمک ما می آید. بدین صورت که ما با استفاده از کلیدواژه ی var قبل از متغیر مورد نظر، آن را به صورت یک متغیر محلی که نوع آن دقیقا مشخص نیست (نوع آن ضمنی تعریف شده) اعلان می کنیم. اسم نوع نمی تواند به طور صریح در خط اعلان متغیر مشخص شود چراکه تنها کامپایلر قابلیت دسترسی به اسم اصلی و دقیق نوع نامشخص/anonymous type را دارد.

در زیر لیستی از نکات مهم در خصوص anonymous type، تعریف و استفاده از آن را مشاهده می کنید:

  • برای تعریف یک متغیر که نوع آن مشخص نیست و نمی دانیم چه مقداری قرار است در آن ذخیره شود، ما با استفاده از کلیدواژه ی var قبل از اسم متغیر مورد نظر، یک متغیر محلی با نوع anonymous یا ضمنی تعریف می کنیم.
  • از آنجایی که تنها کامپایلر می تواند به اسم دقیق و اصلی نوع متغیر anonymous دسترسی داشته باشد (نوع آن را با توجه به شرایط و بستر جاری حدس بزند)، نمی توان اسم نوع متغیر را به صورت صریح در زمان اعلان متغیر قید کرد.
  • به خاطر داشته باشید که تعریف متغیر از نوع نامشخص یا anonymous با کلیدواژه ی new آغاز می شود.
  • متغیرهای anonymous در حقیقت از جنس کلاس/class type هستند که به طور مستقیم از object مشتق می شوند و امکان تبدیل آن به هیچ نوعی غیر از خود object وجود ندارد.
  • به منظور ارسال یک پارامتر از نوع anonymous، یا یک collection که متغیرهای از نوع anonymous دارند، به عنوان آرگومان به یک متد، بایستی پارامتر را از نوع object تعریف نمایید و سپس به متد مورد نظر ارسال کنید.
  • Equals و GetHashCode : تابع Equals() بررسی می کند آیا دو آبجکت با هم برابر هستند یا خیر. تابع GetHashCode() ورودی را رمزنگاری می کند. دو نمونه از جنس یک آبجکت واحد anonymous تنها زمانی برابر هستند که تمامی property های عضو آن ها، بر اساس (با توجه به) خروجی این دو تابع، نیز برابر باشند.
  • 6860
  •    2184
  • تاریخ ارسال :   1396/05/12

دانلود PDF دانلود سورس کد دانلود فیلم آموزشی دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
آموزش Anonymous Type و متغیرهای از نوع نامشخص در C#
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .