anonymous type

تفاوت نوع داده ای var با  anonymous type چیست ؟

نوع var با C# 3.0 معرفی شد . این نوع داده برای تعریف نوع متغیر ضمنی ( متغیر محلی) معرفی شده است. در هنگام استفاده از این نوع در واقع به کامپایلر دستور می دهیم که هنگام کامپایل نوع داده را کشف ( استخراج ) بکند. این نوع از داده ها باید هنگام تعریف مقدار دهی شوند.

var i = 20; //متغیر ضمنی

int i = 20; //متغیر صریح

 

var str = “1”; //تعریف و مقداردهی

;var num = 0

string s = “string”; //متغیر صریح

var s2 = s; //متغیر ضمنی

اساساً نوع var یک نوع ناشناس (anonymous type) می باشد بنابراین هر زمانی که جنس خروجی را نمی دانیم ویا ناشناس می باشد از این نوع استفاده می کنیم. فرض کنید می خواهید 2 جدول را با یکدیگر join  کرده و ترکیبی از اطلاعات 2 جدول را مورد استفاده قرار دهید. در این حالت نوع خروجی ناشناس می باشد و با استفاده از var به کامپایلر اعلام می شود زمان کامپایل نوع این داده را تشخیص بدهد

using (DataContext myContext = new DataContext())

{

var q = (from e in myContext .Employee

join d in myContext .Department on e.DeptID equals d.DeptID

select new {

e.EmpID,

e.FirstName,

d.DeptName,

d.DeptLocation

});

}

ولی Anonymous Type یک نوع داده ناشناس بوده و بصورت یک class (اتوماتیک ساخته شده توسط کامپایلر) جهت ذخیره اطلاعات مورد استفاده قرار می گیرد. استفاده از نوع داده var و کلمه “new” موجب تولید متغیر از نوع ناشناس می شود.

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

var emp = new { Name = “reza”, Address = “rtwo”, Salary = 21000 };

در هنگام کامپایل ، کامپایلر یک کلاس بصورت زیر تولید می کند

class __Anonymous1 {

private string name;

private string address;

int salary;

public string Name { get { return name; } set { name=value } }

public string Address { get { return address; } set { address = value; } }

public int Salary { get { return salary; } set { salary = value; } }

}

 

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

using (DataContext myContext = new DataContext())

{

var result = from book in myContext.Books

where book.Price > 200

orderby book.IssueDate descending

select new {

Name = book.Name,

IssueNumber = “#” + book.Issue

};

}

متد بی نام (anonymous method) چیست؟

مفهوم متد بی نام برای اولین بار همزمان با C# 2.0 ارائه شد. متد بی نام یک تابع inline و بدون نام می باشد. این توابع با استفاده از delegate ساخته می شود ، بدون نام و بدون نوع خروجی می باشد.  در C# 3.0  عبارت های Lambda شکل بهتری به متد های بی نام دادند.

 در این روش تابع بدون نام و پارامتر ورودی و نوع خروجی می باشد. در واقع فقط بدنه تابع را داریم.

class Program {

delegate int del(int x, int y);

static void Main(string[] args)

{

//anonymous method using delegate keyword

del d1 = delegate(int x, int y) { return x * y; };

int z1 = d1(2, 3);

Console.WriteLine(z1);

}

}

//output: 6

نکات کلیدی درباره توابع ناشناس :

1-از درون متد بی نام می توان به متغییرهایی که بیرون از تابع تعریف شده اند دسترسی داشت.

2- متغییرهای تعریفی در داخل متد بی نام از بیرون قابل دسترس نیست.

3- برای مدیریت رویدادها از توابع ناشناس استفاده می کنیم.

4- یک متد بی نام که بدون پارانتز تعریف شده باشد می تواند به هر delegate منتسب کرد

5-متد بی نام به متغیرهایی از نوع ref و یا out که در بیرون از تابع وجود دارند دسترسی ندارد.

درباره‌ رضا رحیمی

رضا رحیمی
در زندگی‌ام هیچ‌چیز را هیجان‌انگیزتر از آموختن نمی‌دانم . به xp , اسکرام ، تست ، برنامه نویسی ، تدریس ، تجارت های آنلاین و هر آنچه که به اینترنت مربوط می باشد علاقمندم. این سایت محل یادداشت های شخصی بنده می باشد

جوابی بنویسید

ایمیل شما نشر نخواهد شدخانه های ضروری نشانه گذاری شده است. *

*