PDA

View Full Version : ایجاد یک کپی از یک شی به صورت مقدار



khosro hoseini
سه شنبه 06 دی 1390, 11:42 صبح
با سلام.
من به یک مشکل برخوردم.
من یک کلاس دارم به صورت روبرو
public class moalefe
{
private string moalefename;
public moalefe[] outputs = new moalefe[100];
public moalefe[] inputs = new moalefe[100];
public int numberofoutputs;
public int numberofinputs;
public bool state = true;
public void AddInput(moalefe newinput)
{
inputs[numberofinputs++] = newinput;
}
public void AddOutput(moalefe newoutput)
{
outputs[numberofoutputs++] = newoutput;
}
public string MoalefeName
{
get
{
return moalefename;
}
set
{
moalefename = value;
}
}
public moalefe(string NameOfMoalefe)
{
moalefename = NameOfMoalefe;
}
public moalefe[] Outputs
{
get
{
return outputs;
}
set
{
}
}
}


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

private void button2_Click(object sender, EventArgs e)
{
moalefe a = new moalefe("a");
moalefe b = new moalefe("b");
b = a;
b.MoalefeName = "bbb";
MessageBox.Show(a.MoalefeName);
}
با وجود اینکه من نام شی A رو تغییر ندادم , ولی چون B رو تغییر دادم اونم تغییر کرده
من میخوام یک کپی از A بریزم توی B ولی نمیخوام پس از تغییر دادن B این تغییرات به A هم اعمال بشه

mmd2009
سه شنبه 06 دی 1390, 13:06 عصر
با سلام

خب همونطور که مشخصه همه ی کلاس ها در سی شارپ reference types هستند و شما دارید به b میگید که به a ارجعاع کنه و بلعکس

پس شما باید کدتون رو به این صورت بنویسید :


moalefe a = new moalefe("a");
moalefe b = new moalefe("b") {MoalefeName = "bbb"};
MessageBox.Show(a.MoalefeName);


یعنی ارجاع رو بردارید. اگر هم خیلی به این موضوع وابسته هستید اینجارو (http://msdn.microsoft.com/en-us/library/ms173116.aspx)بخونید

در مورد کلاستون هم چند نکته رو بگم فرضا برای کد زیر :


public string MoalefeName
{
get
{
return moalefename;
}
set
{
moalefename = value;
}
}


شما اینو به صورت auto-property بنویسید

و در مورد کد زیر :


public moalefe[] Outputs
{
get
{
return outputs;
}
set
{
}
}


وقتی شما چیزی رو نیاز ندارید Set کنید پس اصلا نیازی به نوشتن کدش نیست.

موفق باشید

rahmatr
سه شنبه 06 دی 1390, 13:11 عصر
شما در خط اول یک نمونه از کلاس moalefe ساختید و متغییر a که به اون اشاره می کند.
در خط دوم یک نمونه دیگر از کلاس moalefe ساختید و متغییر b که به اون اشاره می کند.
در خط سوم b=a باعث میشود که متغییر b هم مثل a به کلاس اولی اشاره کند. در واقع با این کار دیگر به کلاس دومی دسترسی ندارید.
در خط چهارم عبارت b.MoalefeName مثل a.MoalefeName عمل می کند. زیرا هر دو a و b به یک کلاس اشاره می کنند.

اگر به عمل کپی نیاز دارید باید داخل کلاس یک متد مثلا به اسم CopyTo بنویسید و دستی این کار را انجام دهید.

موقع نوشتن این پست، پست بالایی نبود و گرنه پست بالایی به اندازه کافی واضح است.