قصد دارم در این مقاله و مقاله بعدی خود، به معرفی برخی ویژگی های جدید Csharp 3.0 پپردازم. بزودی بخش جدیدی در مورد Linq یا همان Language Integrated Query به سایت اضافه خواهد شد که پیش نیاز یادگیری، آن برخی ویژگی های جدیدی می باشند که در این دومقاله آنها رو معرفی خواهم نمود.
لذا اگر در برخی موارد، متوجه کاربرد این ویژگی ها در پروژه های خود نشدید، کمی صبر کنید تا نوبت به مقالات Linq برسد.
در این مقاله به معرفی ویژگی های زیر خواهم پرداخت.
- Automatic Properties
- Initializers
- Type Inference
- Anonymous Types
- Generics
Automatic Properties :
اولین ویژگی جالبی که قصد دارم معرفی کنم، Automatic Properties نام دارد که در برخی مراجع نیز با نام Auto-Implemented Properties معرفی شده است.
نوشتن خصوصیات (Properties)، یکی از کارهای معمول در نوشتن برنامه های کاربردی می باشد که دارای یک روال مشخص بوده و در پروژه های متوسط و بزرگ باعث اتلاف وقت زیادی برای برنامه نویسان می شود.
به خصوص هنگام نوشتن برنامه هایی که با پایگاه داده ارتباط دارند، معمولا برای هر موجودیت در پایگاه داده باید یک کلاس بنویسیم که خصوصیات آن موجودیت (معمولا نام ستون های یک جدول در پایگاه داده) را نگهداری می کند.
یک خصوصیت (Property) معمولی در زبان سی شارپ به شکل زیر نوشته می شود.
private int _UserId;
public int UserId
{
get
{
return _UserId;
}
set
{
_UserId = value;
}
}
|
با استفاده از Automatic Properties ، می توانیم خصوصیت بالا را به شکل زیر بنویسیم که بسیار خلاصه تر می باشد.
public int UserId { get;set; }
|
دو خصوصیت بالا عملکرد یکسانی دارند. می بینید که چقدر نوشتن خصوصیات آسان تر شده و نیاز به زمان بسیار کمتری نیز دارد.
من کلاسی به نام Users را با استفاده از خصوصیات معمولی و خصوصیات خودکار (Automatic Properties) نوشته ام که می توانید آنها را با هم مقایسه کنید.
با استفاده از خصوصیات معمولی :
class Users
{
private int _UserId;
public int UserId
{
get
{
return _UserId;
}
set
{
_UserId = value;
}
}
private string _FirstName;
public string FirstName
{
get
{
return _FirstName;
}
set
{
_FirstName = value;
}
}
private string _LastName;
public string LastName
{
get
{
return _LastName;
}
set
{
_LastName = value;
}
}
}
|
با استفاده از خصوصیات خودکار :
public class Users
{
public int UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
|
خصوصیات خودکار دارای محدودیت هایی نیز می باشند.
خصوصیات خودکار را نمی تواند به شکل فقط نوشتنی (write only) و یا فقط خواندنی (read only) نوشت. برای انجام این کار باید قسمت get یا set یک خصوصیت خودکار را به شکل private تعریف کرد.
خصوصیت خودکار زیر به شکل فقط خواندنی تعریف شده است.
public int UserId { get; private set; }
|
بدیهی می باشد که قسمتی که با دسترسی private تعریف شده است باید جایی مقدار دهی شود. این عمل معمولا توسط Initializer ها انجام می شود که در ادامه مقاله خواهید دید.
متاسفانه خصوصیات خود کار در زبان VB قابل استفاده نیستند.
خصوصیات خودکار در هنگام استفاده از زبان Linq کاربرد فراوانی دارند.
Initializers :
Initializers ها که در برخی مراجع با نام Object Initializers نیز معرفی شده اند، نیز یکی از ویژگی های جدید Csharp 3.0 می باشند. این ویژگی یک راه خلاصه و بهینه جهت ایجاد کردن یک نمونه (Instance) از یک کلاس و مقداردهی به آن می باشد.
مقدار دهی به یک کلاس به طور معمول به شکل زیر انجام می شود.
Users user = new Users();
user.UserId = 1;
user.FirstName = "Morteza";
user.LastName = "Sahragard";
|
با استفاده از Initializers می توانیم قطعه کد بالا را به شکل زیر بنویسیم.
Users user = new Users {UserId = 1, FirstName = "Morteza", LastName = "Sahragard"};
|
همانطور که ملاحظه نمودید که با استفاده از Initializers ها عمل نمونه سازی و مقداردهی در یک خط انجام شد ولی در قطعه کد اول که از روش کلاسیک استفاده می کرد، این عمل در 4 خط انجام شد.
عملکرد Initializers در این حالت شبیه استفاده از سازنده ها (Constructor) ها در کلاس می باشد. ولی با این تفاوت که با استفاده از Initializers ما نیازی به تعریف سازنده در کلاس و مقدار دهی داخل آن نداریم. ضمنا هنگام استفاده از Initializers ما می توانیم تنها یک یا چند خصوصیت خاص را مقدار دهی کنیم و نه تمام آن ها را.
برای انجام این کار توسط سازنده کلاس ها، باید چندین Overload برای سازنده بنویسیم.
به طور مثال در قطعه کد زیر ما فقط شناسه کاربر را هنگام ایجاد نمونه ای از کلاس، مقداردهی نموده ایم.
Users user = new Users { UserId = 1 };
|
Initializers نیز کاربرد زیادی در Linq دارد.
Type Inference :
Type Inference نیز یکی از ویژگی های جدید اضافه شده به Csharp 3.0 می باشد. برای برنامه نویسانی که با زبان های پویا مانند جاوا اسکریپت کار کرده اند، این ویژگی بسیار آشنا می باشد.
در برخی مراجع، Type Inference با نام Implicitly Typed معرفی شده است. همانطور که می دانید به دلیل اینکه زبان سی شارپ از زبان های نوع دار قوی (strongly typed) می باشد، باید حتما متغیر هایی که در این زبان تعریف می شوند دارای یک نوع مشخص باشند.
با استفاده از Type Inference می توانیم متغیر ها را به شکل زیر تعریف کنیم.
var IntegertValue = 1;
var StringValue = "www.30sharp.com";
var ListValue = new List<int>();
|
همانطور که ملاحظه می نمایید ما از کلمه کلیدی var هنگام تعریف متغیر ها استفاده نموده ایم. کامپایلر سی شارپ نوع این متغیرها در هنگام کامپایل (compile time) تعیین می نماید در نتیجه این عمل به شکل late bound صورت نمی گیرد و نیاز نیست نگران راندمان و کارایی برنامه خود باشید.
به یاد داشته باشید که در زبان سی شارپ، هنگام استفاده از Type Inference باید تعریف متغیر و مقدار دهی آن در یک دستور انجام شود و در نتیجه قطعه کد زیر هنگام کامپایل با خطا روبرو می شود.
// Error when compile time
var StringValue;
StringValue = "www.30sharp.com";
|
Type Inference نیز کارایی اصلی خود را در هنگام استفاده از Linq نمایش می دهد.
Anonymous Types :
نوع های بی نام (Anonymous Types) هم یکی از امکانات جالب Csharp 3.0 می باشد. این ویژگی نیز برای افرادی که با زبان های پویا مانند جاوا اسکریپت کار کرده باشند، بسیار آشناست.
به قطعه کد زیر توجه کنید.
var product = new { ProductID = 100, ProductName = "Software" };
|
عملکرد قطعه کد بالا شبیه این است که ما یک کلاس جدید ایجاد نموده و یک آبجکت از نوع آن به نام product ایجاد کرده ایم. کلاس دارای دو خصوصیت به نام های ProductId و ProductName می باشد که هر دوی آن ها مقداردهی نیز شده اند.
تمام این اعمال در یک خط دستور اتفاق افتاده است !!!
و به شکل زیر می توان از این آبجکت استفاده کرد.
int productId = product.ProductID;
string productName = product.ProductName;
|
Anonymous Types ها نیز در Linq مورد استفاده قرار می گیرند.
Generics :
جنریک ها ویژگی جدیدی در Csharp 3.0 نیستند و در حقیقت این ویژگی بسیار جالب در DotNet Framework 2.0 ارائه شد. در سایت 30sharp.com نیز چندین مقاله در این مورد نوشته شده است که در صورت تمایل می توانید آن ها رو مطالعه نمایید.
یکی از محدودیت هایی که جنریک ها داشتند، این بود که در هنکام تعریف لیست های جنریک، نمی توانستیم به آنها مقدار دهی کنیم. مثلا اگر می خواستیم یک لیست از نوع int ایجاد نموده و چهار عدد را به آن اضافه کنیم ، باید به شکل زیر عمل می کردیم.
List<int> intValues = new List<int>();
intValues.Add(100);
intValues.Add(200);
intValues.Add(300);
intValues.Add(400);
|
امکان جدیدی که در Csharp 3.0 وجود دارد به ما امکان می دهد که قطعه کد بالا را در یک خط به شکل زیر بنویسیم.
List<int> intValues=new List<int>{100,200,300,400};
|
این ویژگی نیز در Linq کاربرد وسیعی دارد.
در مقاله بعدی خود به معرفی چندین ویژگی باقی مانده می پردازم.
موفق باشید.