PDA

View Full Version : مبتدی: ارسال آرایه به یک متد در C#‎‎



pidexx
یک شنبه 07 اردیبهشت 1393, 22:14 عصر
با سلام
در زبان c/C++‎‎ برای ارسال یک ارایه به داخل یک تابع
در واقع اسم آرایه خودش یه اشاره گره که به عنوان یه آرگومان تابع استفاده میشه
و میشه مثلا اندازه آرایه را هم به عنوان آرگومان دوم تابه استفاده کرد.
سوالم اینچاست که توی سی شارپ چطوریه؟ یعنی یه راهی شبیه زبان c/C++‎‎
که سریع باشه؟ کلا در این باره در زبان سی شارپ یکی راهنمایی کنه؟(آموزش بده)
با تشکر فراوان

m4prog
یک شنبه 07 اردیبهشت 1393, 22:33 عصر
سلام فکر کنم منظورت این باشه:



برای مثال متغیر نوشتاری a را با “salam” مقدار دهی می کنم و به صورت پیغامی نشان می دهم.

string a;a="salam"

MessageBox.Show(a);

این کد را در رویداد load فرم خود را درون کلید خود می توانید بنویسید.
حال اگر در برنامه تعداد زیادی متغیر از یک نوع بخواهیم چه؟ آیا لازم است که به تعداد آن ها یکی یکی متغیر تعریف کنیم؟! نه ! می توانیم یک متغیر چند بعدی تعریف کینم . متغیر چند بعدی مانند یک جدول از متغیر های هم نوع عمل می کند .
ابتدا به آرایه تک بعدی می پردازیم:

نوع آرایه ][ نام آرایه;مثل :
int [] arrvar;
حالا تعداد خانه ها را اینطور مشخص می کنیم:
arrvar = new int[5];
حالا 5 خونه در آرایه arrvar در اختیار داریم.
حالا اگر بخواهیم به هر یک از خانه ها مقداری بریزیم یا به مقدار درون آن دسترسی داشته باشیم اینطور عمل می کنیم.


arrvar[1] = 10
درون خانه دوم از آرایه arrvar مقدار 10 را قرار دادیم.
نکته: خانه های آرایه از ۰ شروع می شود / اولین خانه ۰ است



می توان تعداد خانه ها را از ابتدا نیز تایین کرد :int var2 = new int [6];
متغیر var2 با تعداد 6 خانه...
البته می توان از ابتدا نیز مقادیری را درون خانه ها ذخیره کرد.
int var3 = new int [5]{1,2,3,4,5};




اگر بعد از نام آرایه .length قرار دهیم تعداد خانه های آرایه را بر می گرداند.
مانند:

MessageBox.Show{a.length.tostring());
در کد بالا یک tostring() نیز می بینیم! یادتان هست که گفتیم در مسیج باکس ها باید از متغیر های نوشتاری استفاده کنیم؟ .length یک مقدار عددی را بر می گرداند . پس هر کجا خواستیم مقدار عددی را به نوشتاری تبدیل کنیم یک .tostring() به آن اضافه می کنیم.

اما می توان آرایه ها را چند بعدی کرد . مثل آرایه دو بعدی زیر :


int [,] var2d = new [2,3]{1,2,3,4,5,6};آرایه var2d دارای دو خط و سه ستون ... برای مقدار دهی اولیه 1 2 و 3 در خط اول قرار می گیریند و 4 و 5 و 6 در خط دوم.
برای دسترسی به هر خانه نیز اینگونه عمل می کنیم:
var2d[2,2];
خط دوم ، خانه دوم.
فکر می کنم تا اینجای کار کافی باشد … اما نکته ای دیگر … از تولباکس یک کنترل label به فرم خود اضافه کنید و از منوی خصوصیات ، خصوصیت name را به label1 تغییر دهید .
در برنامه ها برای ارائه اطلاعات به کاربر از این کنترل استفاده می کنیم .برای مثال به جای استفده از مسیج باکس اینگونه عمل می کنیم:



label1.text = var2d[2,2];
زمانی که این کد اجرا شود محتوی خانه 2در2 را نشان می دهد .

plus
یک شنبه 07 اردیبهشت 1393, 23:15 عصر
با سلام
در زبان c/C++‎‎ برای ارسال یک ارایه به داخل یک تابع
در واقع اسم آرایه خودش یه اشاره گره که به عنوان یه آرگومان تابع استفاده میشه
و میشه مثلا اندازه آرایه را هم به عنوان آرگومان دوم تابه استفاده کرد.
سوالم اینچاست که توی سی شارپ چطوریه؟ یعنی یه راهی شبیه زبان c/C++‎‎
که سریع باشه؟ کلا در این باره در زبان سی شارپ یکی راهنمایی کنه؟(آموزش بده)
با تشکر فراوان

آرایه در #C یک نوع Reference Type هست.وقتی یک شی آرایه رو به یک متد ارسال میکنید، یک Reference به اون شی به متد ارسال میشه.به این معنیه که تغییرات در متد، روی همون شی ارسالی اعمال میشه و کپی ای در کار نیست. (چیزی شبیه Reference ها در ++C). طول آرایه هم توسط متد Length آرایه در دسترس هست.

esafb52
یک شنبه 07 اردیبهشت 1393, 23:25 عصر
و در تکمیل مطالب بالا میتونی یه آرایه رو با کلمه params با طول نا مشخص هم پاس کنی و جالبتر اینکه با تعیین نوع object میتونی هرچی دوست داشتی روپاس کنی
public void yourobjec(params object[] grade)
{
//.......
}

یا نه یه متد معمولی بنویسی مثلا
public double averge(params double[] grade)
{
//.......
double tem=0;
int ctr = 0;
foreach (double d in grade)
{
tem += d;
ctr++;

}
double result = tem/ctr;
return result;
}

pidexx
دوشنبه 08 اردیبهشت 1393, 10:40 صبح
آرایه در #C یک نوع Reference Type هست.وقتی یک شی آرایه رو به یک متد ارسال میکنید، یک Reference به اون شی به متد ارسال میشه.به این معنیه که تغییرات در متد، روی همون شی ارسالی اعمال میشه و کپی ای در کار نیست. (چیزی شبیه Reference ها در ++C). طول آرایه هم توسط متد Length آرایه در دسترس هست.

گرفتم.حالا اگر بخوام یه کپی از آرایه بفرستم که تغییرات اعمالی روی آرایه ی درون تابع, باعث تغییر توی آرایه اصلی نشه چکار کنم؟

pidexx
دوشنبه 08 اردیبهشت 1393, 10:45 صبح
و در تکمیل مطالب بالا میتونی یه آرایه رو با کلمه params با طول نا مشخص هم پاس کنی و جالبتر اینکه با تعیین نوع object میتونی هرچی دوست داشتی روپاس کنی
public void yourobjec(params object[] grade)
{
//.......
}

یا نه یه متد معمولی بنویسی مثلا
public double averge(params double[] grade)
{
//.......
double tem=0;
int ctr = 0;
foreach (double d in grade)
{
tem += d;
ctr++;

}
double result = tem/ctr;
return result;
}
آیا منظورت اینه که اگر برنامه را مثل اون سه خط اول بنویسیم اونوقت میتونیم هم یه آرایه مثلا int بفرستیم هم یه آرایه مثلا bool
مثل این؟؟؟

public void yourobjec(params object[] grade) {
//.......
}

int[] iArray=new int[5];
bool[] bArray=new bool[20]
any code here....
yourobj(iArray[]);
yourobj(bArray[]);


شکل استفادش همینطوره؟؟؟؟

یونس ابراهیمی
دوشنبه 08 اردیبهشت 1393, 10:56 صبح
سلام ...این دو مطلب رو هم بخونید :
http://www.w3-farsi.com/%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-%D8%A8%D9%87-%D8%B9%D9%86%D9%88%D8%A7%D9%86-%D8%A2%D8%B1%DA%AF%D9%88%D9%85%D8%A7%D9%86/



http://www.w3-farsi.com/%DA%A9%D9%84%D9%85%D9%87-%DA%A9%D9%84%DB%8C%D8%AF%DB%8C-params/

plus
دوشنبه 08 اردیبهشت 1393, 14:41 عصر
گرفتم.حالا اگر بخوام یه کپی از آرایه بفرستم که تغییرات اعمالی روی آرایه ی درون تابع, باعث تغییر توی آرایه اصلی نشه چکار کنم؟
باید با استفاده از متد CopyTo یک کپی از آرایه تهیه کنید و به متد مورد نظر ارسال کنید:

int[] array = new int[10] { ... };
int[] copyArray = new int[10];
array.CopyTo(copyArray, 0);
someMethod(copyArray);

pidexx
جمعه 12 اردیبهشت 1393, 07:49 صبح
باید با استفاده از متد CopyTo یک کپی از آرایه تهیه کنید و به متد مورد نظر ارسال کنید:

int[] array = new int[10] { ... };
int[] copyArray = new int[10];
array.CopyTo(copyArray, 0);
someMethod(copyArray);

مثل زبان qbasic که با byVal میشه اینکارو کرد , توی C# هم راهی هست؟

plus
جمعه 12 اردیبهشت 1393, 08:33 صبح
مثل زبان qbasic که با byVal میشه اینکارو کرد , توی C# هم راهی هست؟
تا اونجا که من میدونم غیر.برعکسش هست یعنی میتونید با استفاده از کلمه کلیدی ref، متغیرهای از نوع value-type رو به صورت ارجاعی بفرستید، ولی اینکه یک reference-type رو بخواین به صورت by-value بفرستید فکر نمیکنم راهی باشه.