PDA

View Full Version : چگونگی کپی کردن یک شی از یک کلاس



alireza1384
شنبه 18 آبان 1387, 09:39 صبح
سلام. من کلاسی دارم فرضا به اسم clsTest. حال یک Object ازاین کلاس به نام Obj1 ایجاد می کنم. فرض یک تابع نیز دارم که یک پارامتر از نوع همین کلاس می گیرد (param1) سپس تعدادی از فیلدهای آن را تغییر می دهد. می خواهم این تغییرات در Obj1 اعمال نشود - فقط درداخل تابع تغییرات صورت گیرد - چگونه می توانم این کاررابکنم ؟:خجالت:

Amir Oveisi
شنبه 18 آبان 1387, 10:16 صبح
می خواهم این تغییرات در Obj1 اعمال نشود - فقط درداخل تابع تغییرات صورت گیرد -
منظورتون از فقط در داخل تابع چیه؟

alireza1384
شنبه 18 آبان 1387, 10:36 صبح
همانطورکه همه دوستان مطلعند دو نوع ارسال پارامتر به تابع داریم : یک ارسال با refrence که مانند Pointer عمل می کند و یک ارسال معمولی که هر تغییری در تابع برروی متغییر انجام شود متغییر اصلی راکه درزمان فراخوانی به تابع ارسال می شود تحت تاثیرقرارنمی دهدومقدار قبلی خودرا دارد. اما اشیای ایجاد شده از کلاس در زمان ارسال به تابع مانند یک pointer عمل می کنند. یعنی اگر درداخل تابع فیلدی از param1 را تغییر دهی درست مانند این است که فیلدی از obj1 را تغییرداده ای . من می خواهم عکس این موضوع اتفاق بیافتد. یعنی هر تغییردرداخل تابع برروی پارامتر هیچ تاثیری روی obj1 ایجاد نکند.

Salar Ashgi
شنبه 18 آبان 1387, 22:03 عصر
سلام ، اگر این تابع شما یک تابع عضو کلاس است ، حتما اعضای داده ای شی مورد نظر را تغییر خواهد

داد و اگر تابع ، تابع عضو کلاس نیست ، عموما فیلد های مربوطه private تعریف شده اند ، و نمی تواند

به آنها دسترسی داشته باشد !!!

rostamkhani
یک شنبه 19 آبان 1387, 00:18 صبح
سلام

داخل کلاس System.Object متدی هست بنام MemberwiseClone که این کار را انجام میده .

شما میتونین از این متد داخل کلاس خود به شکل زیر استفاده کنید.


class Class1
{
public string str;
// برای کپی گرفتن از ابجکتی از همین کلاس
public Class1 CloneOBJ()
{
return (Class1)this.MemberwiseClone();
}
}



کد داخل فرم برای تست کلاس بالا


public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Class1 c1 = new Class1();
c1.str = "Ali";
ChangeFild(c1);
MessageBox.Show(c1.str);
}
private void ChangeFild(Class1 p1)
{
p1 = p1.CloneOBJ();
p1.str = "Hasan";
MessageBox.Show(p1.str);
}

}


منبع
جستجو Copy+Object در Codeproject
http://www.codeproject.com/info/search.aspx?artkw=Copy+object
=> پنجمین سورس http://www.codeproject.com/KB/cs/ShallowVsDeepCopy.aspx

سورس 1 کلاس بالا
سورس 2 نمونه Codeproject

Amir Oveisi
یک شنبه 19 آبان 1387, 09:00 صبح
به چه دلیلی نباید تغییری تو بارامتر ارسالی به وجود نیاد؟
شما که قرار نیست اونو بصورت رفرنس ارسال کنید بنابراین مشکلی نخواهید داشت.