نوع های بی نام و یا همان Anonymous Type ها انواعی هستند که فاقد نامند. در واقع سی شارپ به اجازه میدهد اشیایی را تعریف کنیم که قبلا برای آنها کلاسی را تعریف نکرده ایم. در این فصل با نوع های بی نام در سی شارپ آشنا میشویم.
نوع های بی نام
یک نوع بی نام همانطور که از نامشان پیداست انواعی هستند که فاقد نامند. زبان سی شارپ به ما اجازه خواهد داد که شی ایی را با استفاده از کلمه new
ایجاد کنیم که قبلا کلاسی برای آن تعریف نشده است. از کلمه کلیدی var
برای نگهداری ارجاعی از این شی استفاده میشود :
static void Main(string[] args)
{ var myAnonymousType = new { firstProperty = "First", secondProperty = 2, thirdProperty = true };
}
در نمونه مثال بالا یک شی بی نام و سه پرو پرتی تعریف شده و در متغیر myAnonymousType
قرار گرفته است. پروپرتی های تعریف شده در یک نوع بی نام فقط خواندنی هستند و نمی توان مقادیر آنها را تغییر داد. نوع های بی نام در اینتلیسنس ویژوال استودیو پشتیبانی میشوند :
دقت داشته باشید که کامپایلر برحسب مقادیر پروپرتی ها نوع آنها را تعیین خواهد کرد. برای نمونه در مثال بالا firstProperty
دارای نوع string و secondProperty
دارای نوع int است. کامپایلر به صورت خودکار یک نوع جدید را برای انواع بی نام تولید خواهد کرد. می توان نوع یک نوع بی نام را به شکل زیر بررسی کرد :
static void Main(string[] args)
{
var myAnonymousType = new { firstProperty = "First",
secondProperty = 2,
thirdProperty = true
};
Console.WriteLine(myAnonymousType.GetType().ToString());
}
خروجی مثال بالا به شکل زیر است :
<>f__AnonymousType0'3[System.String,System.Int32,System.Boolean]
انواع بی نام تو در تو
یک نوع بی نام میتواند به عنوان پروپرتی شامل نوع بی نام دیگری باشد :
var myAnonymousType = new
{
firstProperty = "First",
secondProperty = 2,
thirdProperty = true,
anotherAnonymousType = new { nestedProperty = "Nested"}
};
حوزه دسترسی برای یک نوع بی نام
یک نوع بی نام در همان متدی که تعریف شده است قابل استفاده خواهد بود. معمولا نمی توان یک نوع بی نام را به متد دیگری ارسال کرد. با این حال میتوان انواع بی نام را به متدهایی که دارای پارامتری از نوع 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);
}
مثال بالا به شکل زیر است :
First Property