سی شارپ 2.0

عنوان صحیح این مقاله C# 2.0 است. جایگزینی علامت # به دلیل محدودیت‌های فنی انجام شده است.
زبان برنامه‌نویسی کامپیوتر، C#، ویژگی‌های جدیدی را در نسخه 2.0 معرفی می‌کند )که با نسخه سوم استاندارد ECMA-334 و فریم ورک .NET 2.0 مطابقت دارد(. این ویژگی‌ها عبارت‌اند از:
## ویژگی های سی شارپ 2.0:
#### کلاس جزئی:
کلاس‌های جزئی اجازه می‌دهند که پیاده‌سازی یک کلاس در چندین فایل پخش شود، به‌طوری که هر فایل شامل یک یا چند عضو کلاس باشد. این ویژگی به‌طور اصلی زمانی مفید است که بخش‌هایی از یک کلاس به‌صورت خودکار تولید می‌شوند. به عنوان مثال، این ویژگی توسط طراحان رابط کاربری کد‌تولید کننده در Visual Studio به‌طور فراوان استفاده می‌شود.
file1.cs: 
```csharp
public partial class MyClass
{
public void MyMethod1()
{
// Manually written code
}
}
```

file2.cs:


```csharp
public partial class MyClass
{
public void MyMethod2()
{
// Automatically generated code
}
}
```

#### ژنریک ها:
ژنریک‌ها، یا انواع پارامتری یا چندریختی پارامتری، ویژگی‌ای در .NET 2.0 است که توسط C# و Visual Basic پشتیبانی می‌شود. برخلاف قالب‌های C++، انواع پارامتری .NET در زمان اجرا نمونه‌سازی می‌شوند و نه توسط کامپایلر؛ بنابراین می‌توانند چندزبانه باشند در حالی که قالب‌های C++ نمی‌توانند. آن‌ها برخی از ویژگی‌ها را که به‌طور مستقیم توسط قالب‌های C++ پشتیبانی نمی‌شوند، مانند محدودیت‌های نوع در پارامترهای ژنریک با استفاده از رابط‌ها(اینترفیس)، پشتیبانی می‌کنند. از سوی دیگر، C# پارامترهای ژنریک غیرنوعی را پشتیبانی نمی‌کند. برخلاف ژنریک‌ها در جاوا، ژنریک‌های .NET از تجسم استفاده می‌کنند تا انواع پارامتری را به عنوان اشیاء کلاس اول در ماشین مجازی CLI قرار دهند، که امکان بهینه‌سازی و حفظ اطلاعات نوع را فراهم می‌کند
.

#### کلاس های استاتیک:
“کلاس‌های استاتیک، کلاس‌هایی هستند که نمی‌توانند با استفاده از کلمه کلیدی new نمونه‌سازی شوند یا از آن‌ها به‌عنوان کلاس‌های پدر به‌دست آمده شود و تنها اعضای استاتیک را مجاز می‌کنند. هدف آن‌ها مشابه ماژول‌ها در بسیاری از زبان‌های رویه‌ای است.

#### Generator functionality:

با اجازه ی فریم ورک NET 2.0 سیشارپ توانست یک تکرار کننده(iterator) را معرفی کند که قابلیت تولید کنندگی را فراهم میکند، با استفاده از ساختار yield return  مشابه  yield در پایتون. با yield return، تابع بصورت خودکار وضعیت خود را در طول تکرار نگه میدارد

```csharp
// Method that takes an iterable input (possibly an array)
// and returns all even numbers.
public static IEnumerable<int> GetEven(IEnumerable<int> numbers)
{
foreach (int i in numbers)
{
if (i % 2 == 0)
yield return i;
}
}
```

همچنین دستور yield break وجود دارد، که کنترل به‌طور بی‌شرط به فراخواننده تکرارکننده باز می‌گردد. در پایان هر تابع تولید کننده نیز یک yield break  ضمنی وجود دارد
 
#### اشاره گر ناشناس:

به عنوان مقدمه‌ای برای توابع لامبدا معرفی شده در C# 3.0، C# 2.0 اشاره‌گرهای ناشناس را اضافه کرد. این‌ها قابلیتی شبیه به closure را به C# ارائه می‌دهند. کد داخل بدنه یک اشاره‌گر ناشناس دسترسی کامل به متغیرهای محلی، پارامترهای متد و اعضای کلاس در دامنۀ اشاره‌گر دارد، به جز پارامترهای out و ref. به عنوان مثال:

int SumOfArrayElements(int[] array)
{
int sum = 0;
Array.ForEach(array,
delegate(int x)
{
sum += x;
}
);
return sum;
}


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

مثال:

```csharp
string status = string.Empty;

public string Status
{
get { return status; }             // anyone can get value of this property,
protected set { status = value; }  // but only derived classes can change it
}
```

#### Nullable value types:

انواع مقادیر Nullable (نشان داده شده توسط علامت سوال، به عنوان مثال int؟ i = null؛)که امکان اضافه کردن مقدار null به مجموعه‌ای از انواع مقادیر برای هر نوع مقدار را فراهم می‌کند. این باعث بهبود تعامل با پایگاه داده‌های SQL می‌شود که می‌توانند ستون‌های Nullable با انواعی که با انواع ابتدایی C# مطابقت دارند داشته باشند: یک نوع ستون SQL INTEGER NULL به طور مستقیم به int? در C# ترجمه می‌شود.
انواع مقادیر قابل تهیه دریافت شد. یک بهبود در اواخر ماه اوت 2005، کوتاه قبل از راه‌اندازی رسمی، برای بهبود ویژگی‌های جعبه‌گذاری آن‌ها صورت گرفت: یک متغیر قابل تهیه که به آن مقدار null اختصاص داده شده است در واقع یک مرجع تهی نیست، بلکه یک نمونه از ساختار Nullable با خصوصیت HasValue برابر با false است. هنگام جعبه‌گذاری، خود نمونه Nullable جعبه‌گذاری می‌شود و نه مقدار ذخیره شده در آن، بنابراین مرجع حاصل همواره غیر-تهی خواهد بود، حتی برای مقادیر null. کد زیر نقطۀ ضعف اصلاح شده را نشان می‌دهد:.


```csharp
int? i = null;
object o = i;
if (o == null)
System.Console.WriteLine("Correct behaviour - runtime version from September 2005 or later");
else
System.Console.WriteLine("Incorrect behaviour - pre-release runtime (from before September 2005)");
```

وقتی مقادیر از نمونه‌های قابل تهیه‌شدن به اشیاء کپی می‌شوند، نسخه‌ی رسمی مقادیر را از نمونه‌های قابل تهیه‌شدن جعبه‌گذاری می‌کند، بنابراین مقادیر null و مراجعه‌های null به عنوان مساوی در نظر گرفته می‌شوند. زمان دیر انجام این تصحیح برخی از جدال‌ها را به دنبال داشت، زیرا نیاز به تغییرات هسته‌ی CLR داخلی داشت که نه تنها .NET2 را تحت تأثیر قرار داد، بلکه تمام فناوری‌های وابسته (شامل C#، VB، SQL Server 2005 و Visual Studio 2005) را نیز تحت تأثیر قرار داد.
#### Null-coalescing operator:
اوپراتور ؟؟ ، null coalescing operator خوانده میشودو برای تعریف یک متغیر دیفالت برای متغیر های nullable و رفرنس تایپ استفاده میشود. این عملوند چپ را برمیگردانند اگر خالی نباشد وگرنه غملوند راست را برمیگردانند

```csharp
object nullObj = null;
object obj = new Object();
return nullObj ?? obj; // returns obj
```

استفاده ی اصلی از این اوپراتور، تخصیص به یک نوع غیر قابل تهیه شدن با یک دستور آسان است 

```csharp
int? i = null;
int j = i ?? 0; // If i is not null, initialize j to i. Else (if i is null), initialize j to 0.
```


## References

رده:خانواده زبان‌های برنامه‌نویسی سی شارپ