SajjadKhati (08-12-19)
درود
صبح بخیر استاد
فقط من آخر تفاوت های بین ref و out رو نفهمیدم و اگه تفاوتی هم هست توی چه موقعیت هایی کاربرد دارن که دوست دارم با مثال های ساده و یک متغیره و نهایتا دو متغیره که ترجیحا از یک نوع باشن مثلا int توضیح بدی.
مثلا همین کد رو در نظر بگیر من چه با out و چه با ref بنویسم هر دو یک جواب رو برمی گردونن. البته هدف اصلی این دو تا رو می دونم که ارسال با ارجاع هستن اما تفاوت بین اینکه دو کلمه کلیدی متفاوت برای ارسال با ارجاع در نظر گرفتن رو متوجه نمی شم و کاربردهاشون
چه با ref چه با out هیچ فرقی ندارن. یک کتاب دایتل هم خریدم اونجا که اصلا اون چیزهایی که گفتی رو اصلا توضیح نداده و اونجا هم مثال هاش فرقی با هم ندارن. منظورم اینه باز شما 10 برابر از اون کتاب که بهترین کتاب سی شارپه بیشتر توضیح دادی.کد:private void button1_Click(object sender, EventArgs e){ int a = 10; int b = Method1(out a); MessageBox.Show(b.ToString()); } int Method1(out int x) { x = 50; return x; }
آخرین ویرایش توسط Speed Racer در تاریخ 08-12-19 انجام شده است
SajjadKhati (08-12-19)
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط Arshan935 برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
بعد از ظهر بخیر برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
سجاد .
پسوند و پیشوند هم که قبلا گفتم .
برای یک متد ، یه return گذاشتی اما برات کافی نیست . میخوای بیشتر از یه نوع خروجی را برگردونی اما return (همونطور که میدونی) ، فقط یک مقدار را میتونه برگردونه . در این جور مواقع (که میخوای در یک متد ، بیشتر از یک خروجی داشته باشی) ، از کلمه ی کلیدی out میتونی استفاده کنی.
کلمه ی کلیدی ref ، تفاوت اساسی اش 2 چیز هست نسبت به کلمه ی کلیدی out :
1) موقع ارسالِ یک متغییری که کلمه ی کلیدی ref داره ، به آرگومان یک متد ، مثل متغییر strBld در کد زیر :
کد:private void Button4_Click(object sender, EventArgs e) { StringBuilder strBld = new StringBuilder("salam"); Method_1(ref strBld); MessageBox.Show(strBld.ToString()); } private void Method_1(ref StringBuilder par1) { par1 = new StringBuilder("khodahafez"); }
اگه درونِ اون متد (متد Method_1 در کد بالا) ، اشاره گرِ اون متغییر (متغییر par1 در کد بالا) ، تغییر کنه (مثلا مثل همین کد بالا ، شی جدیدی بهش اختصاص داده شده باشه) ، اشاره گرِ متغییری که موقع فراخونیِ این متد ، براش ارسال کردیم (اشاره گرِ متغییر strBld در کد بالا) هم به همون مقدار (جدیدی که در اون متد Method_1 تغییر داده بودیم) ، تغییر میکنه .
بنابراین با تغییر مقدار متغییری که کلمه ی کلیدیِ ref داره ، در متدِ صدا زده شده (متد با نام Method_1 در کد بالا) ، چون اشاره گرِ هر دو متغییری که کلمه ی کلیدیِ ref دارن (متغییر par1 و سپس متغییر strBld) تغییر میکنه و هر دو به یک مقدار اشاره میکنن ، هر دو ، یک مقدار را دارن و بنابراین در کد بالا ، بجای اینکه متغییر strBld ، مقدار salam را نمایش بده ، مقدارش به khodahafez تغییر میکنه و مقدار khodahafez را نمایش میده .
2) برخلاف out که جایز نیست برای ارسال مقدار به یک متد ازش استفاده بشه ، از ref میشه برای اینکه مقداری را به متدی ارسال کنیم ، استفاده کنیم .
کاربردش توی هر متدی میتونه باشه که برنامه نویس دوست داره با تغییرِ مقدارِ متغییر توی اون متد (مثل متد Method_1 در کد بالا) ، مقدار اصلی (مقداری که اون متغییر ، قبل از فراخونیِ متد داشت) هم تغییر کنه .
توی نوع های استراکچرها ، بیشتر کاربرد داره . معمولا برای ساخت تنظیمات یک برنامه ، یه استراکچری برای برنامه در نظر میگیرن . میتونه مثلا مقدار یک متغییری که یک تنظیم خاص را ذخیره میکنه ، با تغییر توی یک متد ، مقدار اصلی اش هم تغییر کنه . معمولا توی تنظیمات برنامه ای که دکمه ی ok نداره ، این جور موارد کاربرد داره .
البته فقط به این حد کاربردش محدود نمیشه . قضیه ی تنظیمات ، فقط یه مثال بود .
توی api های ویندوز و ... هم میتونه کاربرد داشته باشه و ... . بسته به برنامه نویس داره دیگه .
کلمه ی کلیدی ref را در قسمت 23 از دقیقه ی 50 تا دقیقه ی 1 ساعت و 20 دقیقه توضیح دادم . مخصوصا از دقیقه ی 1 ساعت و 11 دقیقه تا 1 ساعت و 17 دقیقه که اصل موضوعِ ref گفته شد .
کلمه ی کلیدی out ، اصلا برای ارسال مقداری استفاده نمیشه که حالا بخواد ارسال با ارجاع باشه یا ارسال با مقدار باشه . اسم out اصلا روش هست . یعنی خروجی . یعنی فقط کار return در متد را میکنه .برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط Arshan935 برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
کد زیر را تست کن :
ارور میده .کد:private void Button4_Click(object sender, EventArgs e) { int myInt = 10; Method_1(out myInt); MessageBox.Show(myInt.ToString()); } private void Method_1(out int par1) { MessageBox.Show(par1.ToString()); }
در متد Method_1 میگه متغییر par1 را هنوز مقداردهی نکردی که بخوای فراخونی اش کنی .
با اونکه براش مقدار 10 را فرستاده بودی .
دانلود فیلم آموزش برنامه نویسی Visual Studio C#.Net
فیلم آموزش کامل Autoplay Media Studio
وقتی انسان ، حیوان هست ، پس قیمت میتونی براش بذاری ولی وقتی انسان حَیّ مُتِاَلِّه هست که قیمت نداره ، بها داره. "دکتر حسن عباسی"
Speed Racer (08-12-19)
با سلام خدمت همگی،
آرشان جان بنده پیش تر هم از شما خواهش کرده بودم که برای هر سوال یه موضوع جدید ایجاد کنید. این طوری جریان بحث ها منسجم باقی میمونه. الان در این تاپیک پست اول ارتباطی به پست آخر نداره! لطفا رعایت کنید. ممنونم.
تاپیک قفل میشه.
'چو ایران نباشد، تن من مباد
Dim Armin As Iranian
If Iran.Enabled = False Then Armin.Enabled = False
Speed Racer (10-12-19)
1 کاربر در حال مشاهده این موضوع. (0 عضو و 1 میهمان)
Bookmarks