PDA

View Full Version : تغییر شی ای که با ref ارسال نشده



alibeirami
سه شنبه 21 فروردین 1386, 21:00 عصر
سلام

من یک فرم دارم که یک پارامتر از جنسی میگیره که خودم تعریف کردم(فرض کنیدOrder). این هم تعریف سازنده اش.





public FrmOrder(Order order)
{

{




حالا یک شی از نوع Order بهش پاس میدم که از قبل بهش مقدار دادم.(در اینجا selectedOrder)





FrmOrder frm = new FrmOrder(selectedOrder);
frm.ShowDialog();


با اینکه با رفرنس selectedOrder رو نفرستادم ولی بعد از اجرای دو خط بالا مقدارش تغییر پیدا میکنه.به نظر شما چطوری ممکنه؟

ghafoori
سه شنبه 21 فروردین 1386, 21:31 عصر
دوست عزیز من نحوه کامپایل برنامه های سی شارپ رو نمی دونم که چطور این مشکل بوجود می اید این کار مخصوصا داخل داده های تعریفی مثل رکورد و جدول اتفاق می افتد من همیشه این کار را می کنم متغییر را متد clone خود می فرستم در این صورت حتما یک کپی از ان داده به متد فرستاده می شود مثلا


FrmOrder frm = new FrmOrder(selectedOrder.clone());

PC2st
سه شنبه 21 فروردین 1386, 22:46 عصر
من یک فرم دارم که یک پارامتر از جنسی میگیره که خودم تعریف کردم(فرض کنیدOrder)


اگر Order رو از نوع کلاس تعریف کنید، بصورت Reference Type خواهد بود، اگر میخواهید که مقدارش پاس بشه (نه ارجاعش) از نوع ساختار (struct) تعریفش کنید.

alibeirami
چهارشنبه 22 فروردین 1386, 00:02 صبح
اگر Order رو از نوع کلاس تعریف کنید، بصورت Reference Type خواهد بود، اگر میخواهید که مقدارش پاس بشه (نه ارجاعش) از نوع ساختار (struct) تعریفش کنید.

سلام.

ممنون از جوابتون.ولی با این حساب نمیشه بوسیله مقدار چیزی رو در C# پاس داد؟(که از نوع کلاس باشه؟)

alibeirami
چهارشنبه 22 فروردین 1386, 01:02 صبح
[جواب رو پیدا کردم.


سلام.

ممنون از جوابتون.ولی با این حساب نمیشه بوسیله مقدار چیزی رو در C# پاس داد؟(که از نوع کلاس باشه؟)

نه .نمیشه.

کلید واژه ref هم برای فرستادن یک تایپ مقداری(مانند int) بصورت رفرنس هست.

PC2st
چهارشنبه 22 فروردین 1386, 22:14 عصر
بصورت عادی نمیشه همچنین کاری کرد، چون یک کلاس، reference Type هست و نمیشه اون رو به یک Value Type (مثل همون int) تبدیل کرد. البته یک int رو به object و یک object رو (در صورت امکان) میشه به یک int تبدیل کرد، با توجه به اینکه object یک reference Type هست.
بعضی از کلاسهای دات نت دارای متدی به نام Clone هستند، کار این متد ایجاد یک کپی از شئ هست تا داده های شئ در شئ دیگری پاس داده بشه. البته اگر خودتون یک کلاس ایجاد کردید، میتونید یک متد به همین نام (Clone) در آن ایجاد کنید (بهتره که در اینصورت کلاستون از اینترفیس System.ICloneable به ارث برده بشه، اگر کلاستون از این اینترفیس استفاده کنه، در اینصورت در کلاستون باید متد Clone رو Override کنید و دستورات (کدهای) لازم رو برای این متد پیاده سازی نمائید)

rasoul_ras
دوشنبه 27 فروردین 1386, 15:21 عصر
عزیزم کلیه پارامتر ها در C# بای ریفرنسند

SabaSabouhi
سه شنبه 28 فروردین 1386, 13:51 عصر
عزیزم کلیه پارامتر ها در C# بای ریفرنسند

با سلام
خیر دوست عزیز اینطور نیست به صورت پیش فرض کلیه پارامترها Call by value هستند.

صبا صبوحی