۱۳۸۸ خرداد ۹, شنبه

System.Nullable : متغیرها هم میتوانند نال بپذیرند

سلام
گاهی اوقات ما متغیرهایی از نوع Numeric ، Bool ، DateTime داریم که علاوه بر مقادیر مناسبی که ممکنه بگیرن میتونن Null هم بگیرن. خوب همه شما میدونین که اگر کد زیر رو بنویسیم به ارور برمیخوریم:


Int32 myVar = null; //error: myVar cannot be set to null

این خطا به این دلیله که در حالت عادی این گونه متغیرها نمیتونن مقادریر Null بپذیرن. برای حل این مشکل میتونیم از System.Nullable استفاده کنیم که علاوه بر مقدیر مناسب Datatype میشه Null رو هم بهش نسبت داد.
شکل کلی تعریف یک متغیر به صورت Nullable به دوصورت زیر است:

Nullable<T> myVar = null;

یا


T? myVar = null;

که در اینجا T یک Datytype هست.مثال:

Nullable<Int32> myVar = null;

یا

Int32? myVar = null;

اگر بخواهیم یک متغیر Nullable رو به یک متغیر عادی تسبت بدیم باید از عملگر ?? استفاده کنیم تا بتونیم به متغیر نال پذیر مقدار پیش فرض بدیم.به مثال زیر دقت کنید:


// ?? operator example.

int? x = null;

// y = x, unless x is null, in which case y = -1.

int y = x ?? -1;


در اینجا میگیم اگر x نال نبود که هیچی اما اگر نال بود بجاش -1 رو بریز تو y.
چند مثال:

System.Nullable<int> i1 = 0;

System.Nullable<int> i2 = null;

int i3 = 0;

if (i1 == i2)

{
System.Console.WriteLine("i1 and i2 are the same");
}
else
{
System.Console.WriteLine("i1 and i2 are different");


}

if (i1 == i3)
{
System.Console.WriteLine("i1 and i3 are the same");
}
else
{
System.Console.WriteLine("i1 and i3 are different");
}

خروجی قطعه کد بالا بصورت زیر هست:

i1 and i2 are different

i1 and i3 are the same


مثال 2:


System.Nullable<int> i1 = null;

try

{

System.Console.WriteLine("The value is {0}", i1.Value);

}

catch

{

System.Console.WriteLine("null causes an exception");

}

i1 = 1;

try

{

System.Console.WriteLine("The value is {0}", i1.Value);

}

catch

{

System.Console.WriteLine("1 causes an exception");

}


خروجی بصورت زیر است:




null causes an exception

The value is 1


مثال 3: نسبت دادن یک مقدار متغیر نال پذیر در صورتی که نال باشد:



int DefaultIfNull(System.Nullable<int> i)

{

int retVal;

if (i.HasValue)

{

retVal = i;

}

else

{

retVal = 1;

}

return retVal;

}

int DefaultIfNull(System.Nullable<int> i)

{

return i ?? 10;

}


تابع HasValue چک میکنه که آیا یک متغیر نال پذیر مقدار نال دارد یا خیر.
مثال 4: پارامتر نال پذیر:


private void button1_Click(object sender, EventArgs e)

{

bool b=true;

b = nima(null);

MessageBox.Show(b.ToString());

b = nima(2);

MessageBox.Show(b.ToString());

}

private bool nima(int? i)

{

if (i == null)

return false;

else

return true;

}


نکته 1: از نوع string نمیشه در متغیرهای نال پذیر استفاده کرد چون استرینگ یک رفرنس هست به رشته ای از کاراکترها
نکته 2: یکی از بهترین استفاده های این متغیرها وقتی است که شما میخواین از ستونی در جدولتون اطلاعات بخونین که میتونه مثادیر نال داشته باشه.

۱۳۸۸ اردیبهشت ۲۷, یکشنبه

یه مثال از MultiThreading

سلام یه مثال کوچیک از مالتی تردینگ که به دو صورت UI رو آپدیت میکنه

MultiThreading