PDA

View Full Version : نکته ای جالب در مورد Ref در C#‎



r00tkit
شنبه 30 مرداد 1389, 13:01 عصر
سلام

وقتی یه value type رو به یه متود می فرستید تغییرات روی این مقدار در داخل متود روی متغیر اصلی هیچ اثری ایجاد نمی کنه( خوب اینو که همه می دونن)




وقتی یه reference type رو به متودی می فرستیم به علت فرستاده شدن خود reference( منظور ادرسی هستش که به اصل شی اشاره می کنه)
تغییرات داخل متود به متغیر اثر می زاره


مثال:



public void Sample()
{
Person person = new Person() { Name = "geek" };

CallByValue( person);


Console.WriteLine("Name: {0}", person.Name);
}

public void CallByValue(Person person)
{
person.Name = "1998";
}

حالا اینو نگاه کنید به نظر شما خروجی چیه؟:



class sample
{
static public void Sample()
{

Person person1 = new Person() { Name = "geek" };

CallByValue( person1);


Console.WriteLine("Name: {0}", person1.Name);
}

static public void CallByValue( Person person2)
{

person2=new Person(){Name="1982"};
}
static void Main(string[] args)
{
Sample();
}
}



با کمال تعجب خروجی geek هستش چون موقع ارسال این reference type خود reference فرستاده شده بود
و داخل تابع ما با یه new باعث ایجاد یه شی دیگه شدیم پس ان ادرس داخل heap عوض شد
حالا شی داخل تابع به یه جای دیگه اشاده می کنه شی ای که به تابع فرستاده شد به جای دیگه یعنی person2 با person1 دیگه فرق می کنه

حالا اگه ما این reference type رو با ref بفرستیم ان موقع خروجی چی می شه؟




class sample
{
static public void Sample()
{

Person person1 = new Person() { Name = "geek" };

CallByValue(ref person1);


Console.WriteLine("Name: {0}", person1.Name);
}

static public void CallByValue(ref Person person2)
{

person2 = new Person() { Name = "1982" };
}
static void Main(string[] args)
{
Sample();
}
}

خروجی می شه :1982 چرا؟

توی این مثال استفاده از ref این امکان رو به ما می ده یه شی دیگه درست کنیم با new در حالی که متغیر caller هم به این ادرس جدید اشاره کنه

میلاد قاضی پور
شنبه 30 مرداد 1389, 14:05 عصر
عالی بود مدتها بود میخواستم بدونم چطور میشه همچین کاری کرد . کاش زودتر میدونستم .

r00tkit
شنبه 30 مرداد 1389, 14:19 عصر
احتمالا به این روش می گن

call by object
یا
call by sharing
یا
call by object-sharing

r00tkit
دوشنبه 19 مهر 1389, 18:06 عصر
تو C++‎‎‎هم یه چیزی مثل این داریم




void ptrswap(int *&v1, int *&v2)
{
int *tmp = v2;
v2 = v1;
v1 = tmp;
}
بدون & ما نمی تونیم pointer هارو تغییر بدیم (منظور شی ای که بهش اشاره می شه نیست)
دقیقا" مثل سی شارپ بدون ref نمی شه مقدار reference تایپ ها رو تغییر داد ( برای در ک بیشتر پست 1 رو بخونید)