سلام آقا سجاد
شما گفتی که void اگه بذاریم یعنی مقداری فراخونی نمی شه ولی طبق عکس زیر شما اینجا خودت گفتی که Method1 رو فراخونی می کنیم.
برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
Printable View
سلام آقا سجاد
شما گفتی که void اگه بذاریم یعنی مقداری فراخونی نمی شه ولی طبق عکس زیر شما اینجا خودت گفتی که Method1 رو فراخونی می کنیم.
برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
سلام گلپسر عزیز .
نمیدونم کجا همچین جمله ای گفتم ولی دقت کن که من گاها حواسم توی جمله بندی پرت میشه (این قدر حجم زمانی آموزش بالا بود و ان شاء ا... در آینده هم خواهد بود) اما مثلا یه کم جلوتر یا عقب تر اش را نگاه کنی ، جمله ی درست اش را میگم . کلا منظورم اینه که اگه همچین جمله ای گفته بودم ، جزء اشتباهات کلامی ام بود.
اگه اون جمله را گفتم ، عذرخواهی میکنم . منظورم این بود که اگه void بذاریم ، اون تابع یا متد ، مقداری را برنمیگردونه .
کلا برای اشتباهات کلامی ، کلِ اون قسمت را ببینی ، متوجه شون میشی که کجا اشتباهات کلامی بود.
منظور من اینه که شما گفتی مقداری رو بر نمی گردونه ولی می بینیم که رشته داخل MessageBox.Show برگردونده می شه. اگه منظورت از مقدار عدد باشه که خوب من می تونم کاری کنم که MessageBox.Show عدد برگردونه بنابراین Method1 با اینکه void است ولی داره یک مقداری بر می گردونه.نقل قول:
نقل قول:
سلامی مجدد
نه.
اصلا منظور از برگردوندن تابع ، این چیزی نیست که فکر میکنی.
نوشتنِ یک مقدار داخل تابعِ MessageBox.Show که برابر نیست با برگردوندن .
برگردوندن به این معنا هست که وقتی اسم تابعی (یا حالا اسم پروپرتی یا متغییر و ...) را که نوشتی ، بتونی اون تابع را داخلِ یک متغییر ذخیره کنی و بعدا استفاده کنی .
الان شما میتونی در کدی که در پست اول دادی ، درونِ رویداد button58_Click ، همچین کد زیر را بنویسی ؟ :
کد:string a = Method1();
یعنی کلا این جوری بنویسی (بجای نوع string در کد بالا ، هر نوعِ دیگه ای خواستی ، بده) :
نه نمیشه . چون تابع Method1 ، چیزی را برنمیگردونه .کد:private void button58_Click(object sender, EventArgs e)
{
string a = Method1();
}
private void Method1()
{
MessageBox.Show("داخل تابع Mrthod1");
}
اصلا کاری به درونِ تابع و کدهایی که داخلِ تابعِ Method1 نوشته شده نداشته باش . فقط ببین که وقتی نامِ اون عضو (در اینجا نام تابع) را فراخونی میکنی ، اولا آیا میتونی توی متغییری ذخیره کنی یا نه و دوما اگه میشه ، توی چه نوع متغییری میتونی ذخیره کنی. این مفهوم ، معنایِ برگردوندنِ تابع هست.
اما در کد زیر ، اون تابع ، در متغییر ذخیره میشه و مشکلی نداره :
کد:private void button58_Click(object sender, EventArgs e)
{
string a = Method1();
}
private string Method1()
{
MessageBox.Show("داخل تابع Mrthod1");
return "salam";
}
به این معنا که وقتی نامِ تابعِ Method1 را فراخونی کردم (صرف نظر از اینکه داخلِ این متد ، چه کدی نوشتم) ، تونستم در متغییر a (درون رویداد button58_Click) ذخیره کنم. چون موقعِ تعریفِ متدِ Method1 ، نوعِ بازگشتی اش را از نوع string گرفتم.
درودنقل قول:
امکان داره بشه آرگومان ها رو در همون تابع بدیم و در متد آرگومانی نیاریم. این کد خطا میده. مشکلش کجاست
کد:private void button1_Click(object sender, EventArgs e){
Method1();
}
void Method1(int myVariable1, int myVariable2)
{
myVariable1 = 10;
myVariable2 = 20;
int a = myVariable1 + myVariable2;
MessageBox.Show(a.ToString());
}
نقل قول:
متوجه ی منظورت نشدم.
ارورش بخاطر اینه که موقع تعریف متد Method1 ، دو تا پارامتر براش در نظر گرفتی اما موقعِ فراخونیِ این متد (درون رویداد button1_Click) ، هیچ مقداری به این دو تا ورودی ندادی.
درود
یک متد ریاضی جدید خودم نوشتم ولی قدر مطلق داره. این علامت های قدر مطلق میذارم جواب نمیده. ( | | ) . چیکار باید کنم
مثلا می خوام بنویسم قدر مطلق a این چطوری نوشته می شه
سلام بر گلپسر عزیز .نقل قول:
علامت قدر مطلق (همین علامت | | ای که نوشتی) ، در ریاضی ، معنا و مفهوم داره . موقع برنامه نویسی ، فقط محدود به این هستی که عملگرهای در اون زبان (در اینجا ، عملگرها در زبان سی شارپ) را استفاده کنی . یعنی ، فقط میتونی از عملگرهای (علامت ها) زیر ، استفاده کنی :
برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
یا
برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
اون علامت | که در ریاضی به عنوان قدر مطلق معنا داره ، توی سی شارپ ، به عنوان عملگر اور (یا همون عملگر OR) معنا داره که ربطی به قدر مطلق نداره .
برای عملیات ریاضی ، یا باید از متدهای آماده که در کلاس Math هست استفاده کنی :
برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
عملیات قدر مطلق را متد Abs در این کلاس انجام میده :
برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
اگه متدهای بیشتری نیاز داری ، یا باید در اینترنت ، دنبالش بگردی یا اینکه خودت بنویسی .
برای اینکه خودت همچین متد و کد (قدر مطلق) را بنویسی ، باید ببینی از چه دستورات اون زبان میتونی استفاده کنی . مثلا از طریق شرط if هم میشه نوشت . شاید یا عملگر هم باقی مانده هم بشه نوشت و ... .
در زیر ، با شرط if ، متد قدر مطلق را برات میذارم :
توضیحش اینکه میگه اگه عدد منفی بود ، همون عدد را دو برابر کن و ازش کم کن (چون عدد منفی هه ، کم کردیم که دو علامتِ عدد منفی ، تبدیل به علامت مثبت میشه و باعث میشه جمع کنه . همون قضیه ی منفی در منفی که میشه مثبت)کد:int Absulate(int digit)
{
if (digit < 0)
digit = digit - (2 * digit);
return digit;
}
ممنونم استاد عزیزنقل قول:
همین Math.Abs استفاده کردم که آسونتر بود و درست شد.
دورود
س1) الان آخرین خطی که اجرا می شه MessageBox هه یا Method6
برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
س2) این IntoMethod اصولش اینه بالای متد باشه (اون متد داخلی) یا پایین متد هر چند فرقی نداره. اصولش باید به چه صورت باشه
س3) اگه نوع متد استراکت باشه هم بدنه اون درون هیپ قرار می گیره یا فقط وقتی که نوعش کلاس باشه
سلام .نقل قول:
خاری برار؟ :Love-ssa~! (1): اولا ، لازم نیست عکسِ کد را بذاری . خود کد رو بذار دیگه . این جوری که راحت تره . دوما دیگه نداره :Love-ssa~! (1):
1) اگه منظورت اینه که وقتی Method6 را اجرا میکنیم (کد در خط اول) ، کدوم خط ، آخر اجرا میشه ، جواب ، Method6 هست (در واقع بلاک ای که Method6 تمام میشه ، هست) . اگه منظورت این باشه وقتی متد IntoMethod اجرا میشه ، خط پایانش کجاست ، جواب ، همون بلاکِ پایانِ IntoMethod یا در واقع ، خطِ بعد از MessageBox) هست .
در خط اول ، یعنی اونجایی که Method6 را فراخونی میکنی ، یه break point بذار و وقتی کد ، در اون خط متوقف شد ، دکمه ی F11 را بزن (تا داخل متد ای که فراخونی شد بره) و به این ترتیب ، میتونی ترتیبِ اجرایِ کدها را ببینی .
2) فرقی نداره .
دقت کن که یک متد را در داخلِ متد یا رویدادِ دیگه ای تعریف کردن ، اصلا اصولی نیست . (من فقط خواستم بگم که سی شارپ ، همچین قابلیتی هم داره وگرنه این کار اصولی نیست و در حد اطلاعات عمومی خواستم که کاربر بدونه . بنابراین استفاده از همچین متدی رو اصلا توصیه نمیکنم . توی فیلم هم فکر کنم گفتم) .
اینکه گفتم اصولی نیست ، منظورم ، فراخونیِ یک متد ، از داخلِ متدِ دیگه نیست ها . منظورم ، تعریفِ یک متد ، در داخلِ متد دیگه هست .
3) منظورت نوعِ خروجیِ متد هست که استراکچر باشه؟
اولا ، استاد (علی) تصحیح کردن که مدیریت کننده ی حافظه در سی شاپ و کلا دات نت ، GC هست و بنابراین اینکه چه چیزی ، در چه نوع حافظه ای قرار میگیره را خود GC فقط مدیریت میکنه (هر چند ، من توی منابع خارجی ، دیدم که این دو حافظه را توی سی شارپ هم جدا کردن ولی بصورت خیلی واضح ، منظور استاد را متوجه نشدم). بنابراین ، بهتره دیگه بجای حافظه ی استک و هیپ ، کلا از اصطلاح "حافظه" استفاده کنیم .
قضیه ی دوما ، باشه . چون میخواستم بگم که GC ، اتوماتیک ، هر وقت خواست ، میتونه حافظه را جابجا کنه (حتی بین رم و پیج فایل) و ... که زیاد ربطی به سئوالت نداره و ممکنه گمراه کننده باشه برات .
برگردیم به جوابِ اصلی سئوالِ 3 ات . اگه منظورت نوعِ خروجیِ متد هست که استراکچر باشه ، وقتی که یه شیِ استراکچر برگردونده میشه مثل کد زیر :
اولا اینکه استراکچر global که از نوع int هست و میدونی که 32 بیت (4 بایت) ، حافظه اشغال میکنه .کد:int global = 5;
int ReturnStruct()
{
return global;
}
private void Button1_Click(object sender, EventArgs e)
{
int number = ReturnStruct();
}
دوما وقتی که کد ، در رویداد Button1_Click ، اجرا میشه (یا به عبارت دیگه ، کد return global در متد ReturnStruct اجرا میشه) ، چون مقدار استراکچر را return کرد و برگردوند ، هر چقدر که متغییری را که از نوع استراکچر بود ، حافظه اشغال کرده بود (یعنی متغییر global که 32 بیت هست) ، به همون اندازه از حافظه (یعنی 32 بیت) در حافظه ی جدیدی براش فضا اشغال میکنه . در واقع ، حافظه کپی میشه و 2 تا میشه . بنابراین در کد بالا ، یه حافظه ی 32 بیت برای متغییر سراسریِ global و یه حافظه ی 32 بیتِ دیگه هم برای متغییر محلیِ number داریم .
بدنه هم ربطی به نوع بازگشتی نداره . وقتی هر بار که متدی را فراخونی میکنیم (حتی اگه از درون همون متد ، همون متد را مجددا فراخونی کنیم) ، یه حافظه ی جدیدی براش در نظر گرفته میشه که با تمام شدنِ بلاکِ متد ، از بین میره
درود استادنقل قول:
چون منو توی هیپ و استک درگیر کردی دیگه تا آخرش باید برم :lol:
توی کدهایی که آوردم شما در اولی گفتی که نام متد در استک و بدنه در هیپ قرار می گیره. حالا من دو تا متد void آوردم با دو نوع متغیر استراکت و کلاس. دو متد هم آوردم با نوع بازگشتی استراکت و کلاس. حالا شما بگو همه نام های این متدها در حافظه استک قرار می گیره و بدنه اون ها در حافظه هیپ یا اینکه برای void و نوع بازگشتی های استراکت و کلاس با هم فرق دارن.
نیازی نیست برای هر کدوم کلی توضیح بدی و مثال بزنی فقط برای هر کدوم از متدها بگو نام در مثلا استک و بدنه در هیپ. همین برای من کافیه.
کد:void IntoMethod(int a)
{
MessageBox.Show(a);
}
void IntoMethod(StringBuilder b)
{
MessageBox.Show(b);
}
double IntoMethod(double c)
{
MessageBox.Show(c);
}
StringBuilder IntoMethod(StringBuilder d)
{
MessageBox.Show(d);
}
سجاد هستم :1. (23):نقل قول:
گفتم که.
همونطور که استاد گفتن ، دیگه به حافظه ی هیپ و استک ، اشاره نکنیم .
من هم ای کاش توی آموزش ، ماجرای هیپ و استک را جدا نمیکردم و فقط به حافظه ، اکتفا میکردم .
همونطور که قبلا گفتم ، منظورم از گفتن حافظه ، فقط درک اشاره گرها و غیر اشاره گرها (حافظه هایی که استراکچرها اشغال میکنن) بود.
به قول استاد ، توی هر کدوم از این حافظه ی استک یا هیپ باشه ، نه دونستن اش ، تاثیری به حال ما داره و نه میتونیم ، تغییرش بدیم.
فقط دونستنِ قضیه ی اشاره گرها ، هست که مخصوصا در ارتباط با کدهای سی پلاس پلاس و کلا کدهای unmanaged میتونه خیلی مفید باشه . اما دونستنِ همین قضیه ی اشاره گرها تا زمانی که فقط از کدهای سی شارپ ، اون هم تا حد متوسط استفاده میکنیم ، کاربردی نداره.
به هر حال اگه هم خیلی اصرار به این قضیه داری ، من دقیق نمیتونم راهنمایی کنم . چون اطلاعات کاملی فعلا ندارم .
یا بذار ، مهندس آرمین عزیز بیان ، نظرشون رو جویا شو.
الان به این 10 میگن مقداردهی اولیه یا مقداردهی پیش فرض. کدومش درست ترهنقل قول:
کد:void Method8 (int mypar1 = 10)
فکر کنم مقدار پیش فرض بگن . بازم دقیق نمیدونم .نقل قول:
سلام آرشان،نقل قول:
این دو پیوند رو مطالعه کنید:
برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
اگر سوالی بود بعدش، هستم در خدمتت.
آرمین :11():
درودنقل قول:
(نقل قول گرفتم که ببینی ولی ربطی به این نداره)
من جواب این سوالم رو هنوز نگرفتم (لطفا عجله ای جواب ندید که یک وقت اشتباه بشه می خوام پاسخ درست باشه)
3 تا SQLServer داریم یکی SQL Server داخلی خود سی شارپ که فکر می کنم بهش میگن Express و دو تای دیگه نرم افزار جدا هست که یکیش SQL Server Enterprise است و یکی دیگه Standard.
اگه من با همون SQL Server داخلی ویژوال استودیو یک نرم افزار ایجاد کنم فکر کنم مشکلی نداره اما اگه با SQL Server 2019 چه نسخه Enterprise و چه نسخه Standard پایگاه داده هایی ایجاد کنم و بعد به نرم افزار ارتباط بدم و در نهایت یک فایل setup مثلا با install shield بسازم آیا سیستم هایی که می خوان نرم افزار من رو نصب کنن حتما باید SQL Server Enterprise یا Standard روشون نصب بشه یا اینکه با همون .NETFramework مشکل حل می شه یا اینکه توی فایل setup که ایجاد می کنم خودش اتوماتیک SQL Server مورد نظر داخلش قرار می گیره.
اگه با SQL Server 2019 پایگاه داده ایجاد کنم طرف مقابل می تونه با SQL Server 2016 پایگاه داده من رو استفاده کنه و یا بر عکس این موضوع.
کلا تا چه نوع نرم افزارهایی SQL Server داخلی خود سی شارپ جواب میده و از چه مرحله ای به بعد باید از نسخه نصبی Enterprise یا Standard استفاده کنیم. خود اینکه کجا از Standard . کجا از Enterprise هم استفغاده کنیم یک بحث دیگه است.
یک نرم افزار دیگه به نام SQL Server Management Studio است که نمی دونم تفاوتش با SQL Server 2019 چیه و از نظر کاربرد چه فرقی می کنه
****************************************
برای ویندوز 10 باید .Netframewok 3.5 نصب بشه اما روی ویندوز 7 مثل اینکه از قسمت Programs and Features و Turn Windows features باید تیک نصبش رو بزنیم. (شاید هم اشتباه می کنم) توی بعضی از ویندوز های 7 نسخه 3.5 داره و توی بعضی 3.5.1. اینا چه فرقی دارن
اگه من .Netframework 4.8 نصب کنم اصلا نیازه که نسخه 1.1 تا 4 رو هم نصب کنم یا اینکه فقط تا نسخه 4 رو باید نصب کنم. مثلا نسخه 4.8 از نسخه 4 پشتیبانی نمی کنه. اگه پشتیبانی نمی کنه تا چه نسخه ای رو پشتیبانی می کنه مثلا تا 4.5.2 پشتیبانی می کنه.
یک جایی خوندم اگه می خوای نرم افزار بنویسی از نسخه .NETFramework 4 استفاده کنیم بهتره چون همه سیستم ها پشتیبانی می کنن اما در ویژوال استودیو من نسخه 2 و 3 و 3.5 و 4.5 و 4.5.2 و 4.6.1 رو در قسمت Framework داره اما نسخه 4 خالی رو نداره. برای نصب نسخه 4 چه فایل هایی رو باید نصب کنم. صرفا .Netframework 4 نصب کنم مشکل حل می شه.
اگه بخوام نرم افزاری بنویسم که در ویندوز 10 ازش پشتیبانی بشه باز هم اگه با نسخه 4 بنویسم در ویندوز 10 جواب میده یا باید با نسخه 4 بنویسم. مثلا امکان داره من با نسخه 4.8 بنویسم ولی setup برنامه رو طوری تنظیم کنم که موقع نصب برنامه خودش اول نسخه 4.8 رو نصب کنه.
سلامی مجددنقل قول:
بله .
تمام نسخه های sql server (چه express و enterprise و ...) رو اگه بخوای در سیستم طرف اجرا کنی ، توی سیستم اون طرف ، موتور اون نسخه یا موتور نسخه ی بالاتر از اون sql باید نصب باشه.
احتمالا باید بشه در نرم افزارهایی که برای نصب نام بردی ، کاری کرد که اتوماتیک موتور sql را در سیستم کاربر نهایی ، نصب کنه .
اگه اشتباه نکنم ، نمیتونه .نقل قول:
زیاد sql کار نکردم .
حالا اگه اشکالی دارم ، آقا آرمین ، زحمت رفع اش را میکشن .
معمولا اگه برنامه نویس ، قطعا بخواد توی سیستم کاربر نهایی (کاربری که برنامه ، توی سیستم اش اجرا میشه) ، موتور sql را نصب کنه یا از نصب شدنش اطمینان داشته باشه ، از sql server (نسخه های مختلف اش) استفاده میکنه اما اگه برای برنامه نویس ، مهم باشه که موقع نصب برنامه اش ، نمیخواد موتور sql در سیستم کاربر نهایی نصب شه ، از sqllite استفاده میکنه .نقل قول:
sqlite قدرت کمتری داره اما خوبی اش اینه که لازم به نصب موتور در سیستم کاربر نهایی نداره اما برای اجرای sql server در سیستم کاربر نهایی ، حتما باید موتورش در سیستم کاربر نهایی نصب باشه یا نصب بشه . این از قضیه ی دیتابیس sqlite . البته sqlite ، محدودیت های دیگه مثل سرعت کمتر ، تعداد رکورد کمتر (میگن حداکثر تا یک میلیون رکورد) و همچنین پشتیبانی نکردن برای پاسخگویی همزمان به چند نخ را هم داره .
حالا توی نسخه های مختلف sql server ، اگه بخوان در سطح سرور و شبکه ارتباطی برقرار کنن ، از نسخه ی sql server enterprise استفاده میکنن . تعداد بسیار بسیار زیادی از رکودها را بدون کاهش قدرت و سرعتش میتونه در خودش جای بده .
اگه قرار نباشه در سطح شبکه استفاده بشه ، معمولا از sql express استفاده میکنن . البته محدودیت های دیگه هم فکر کنم نسبت به sql server enterprise فکر کنم داشته باشه .
درباره ی sql standard خبر ندارم .
نمیدونم .نقل قول:
تفاوت نسخه های مختلف دات نت ، توی msdn نوشته .نقل قول:
البته پیشنهاد من اینه که برنامه را تحت نسخه ی دات نت 4.0 بنویسی . چون توی نسخه ی 4.0 ، تغییرات زیاد بوده . قضیه ی نخ ها و کلاس های مختلف اش ، بسیار توی این نسخه ، بهتر شده . حالا میتونی تغییرات را توی سایتش ببینی .
هم اینکه نسخه ی 4.0 چون مال 10 سال پیش هست ، اون قدر قدیمی هست که حتی در ویندوز xp (آخرین آپدیت هاش) هم پشتیبانی بشه (برای کسایی که میخوان توی همه ی ویندوز برنامه شون اجرا بشه) .
1.1 تا 2.0 تا حتی 3.0 که دیگه خیلی منسوخ شدن . هر چند 2.0 به بعد ، توی سیستم عامل ها پشتیبانی میشن .نقل قول:
عمده تغییرات ، حداقل ، توی نسخه ی 3.5 و 4.0 یا بالاتر بوده .
بنابراین برنامه های روز و حداقل چند سال پیش تا حالا را حداقل من ندیدم که زیرِ نسخه ی دات نت 3.5 بسازن .
از طرفی هم با نصب ویندوز ، آخرین نسخه ی دات نت نسبت به آپدیت همون ویندوز هم همراه ویندوز ، نصب میشه . بنابراین نیاز به نصب نسخه های قبل تر اش نیست .
دقیق نمیدونم اما فکر کنم هر سری ، اگه بالاترین نسخه شو نصب کنی ، نسخه ی پایین تر اش دیگه لازم نیست . مثلا اگه دات نت 4.8 را نصب کنی ، دات نت 4.7 و 4.6 لازم نیست . دقیق نمیدونم . بپرس .
البته اگه میدونی که برنامه ات نمیخوای توی xp پشتیبانی بشه ، بالاتر از 4.0 هم بنویسی (مثل 4.8) هم مشکلی نداره . ولی xp حداکثر تا 4.0 را ساپورت میکنه .نقل قول:
البته 4.8 اگه بنویسی ، ویندوز 7 طرف برای نصب دات نت 4.8 ، نیاز به آخرین آپدیت داره . بنابراین اگه پشتیبانی از ویندوز 7 در نظر هه ، بهتر هه که بالاتر از 4.6.2 نباشه .
نسخه ی 4.0 را نداره؟!
موقع نصب ، در ستاپ اش ، شاید 4.0 وجود داشته باشه . بررسی کن اگه وجود داره ، تیک شو زدی یا نه؟
بازم دلیل شو نمیدونم .
قبل از این کار ، همون کاری که گفتی یعنی نصب دات نت فریم وورک 4.0 runtime را انجام بده ببین درست میشه . نمیدونم .
بله 4.8 جواب میده .
بله میشه نصب اتوماتیک انجام داد.
داداش سجاد این کد چرا کار نمی کنهنقل قول:
یا این کد:کد:private void button1_Click(object sender, EventArgs e){
int a = Method1(out x);
MessageBox.Show(a.ToString());
}
int Method1(out int x)
{
x = 10;
return x;
}
یعنی ویژوال استودیو من خراب شده و درست کار نمی کنه.کد:private void button2_Click(object sender, EventArgs e){
int d = Method1(out a, out b);
MessageBox.Show(d.ToString());
}
int Method1(out int a, out int b)
{
a = 10;
b = 20;
int c = a + b;
return c;
}
یک نکته است که به نظرت وقتی مقدار بازگشتی متد مثلا string هست درسته نوع پارامترش int باشه ایا بهتر نیست که همه نوع ها یکی باشن. مثلا شما اینجوری کد می نویسی
به نظرت اصولی تر این نیست که اینطوری بنویسیم که قاطی نشهکد:string Method1(int a, double b){
}
البته من نمی دونم کجاها باید اصول رو زیر پا بذاریم کلی گفتمکد:double Method2(double a, double b){
}
بخاطر اینکه متغییرِ out ، که میخوای توی آرگومان ، برای متدی ارسال کنی (یعنی موقع فراخونی متد) ، باید قبل اش متغییر را تعریف کنی .نقل قول:
ولی در کد اول ، موقع فراخونی متد Method1 ، مدر آرگومانش نوشتی out x ، بدون اینکه متغییر x را قبل اش تعریف کرده باشی .
باید قبل اش متغییر x را تعریف میکردی یعنی در کد اول :
و در کد دوم :کد:private void button1_Click(object sender, EventArgs e){
int x;
int a = Method1(out x);
MessageBox.Show(a.ToString());
}
int Method1(out int x)
{
x = 10;
return x;
}
کد:private void button2_Click(object sender, EventArgs e){
int a,b;
int d = Method1(out a, out b);
MessageBox.Show(d.ToString());
}
int Method1(out int a, out int b)
{
a = 10;
b = 20;
int c = a + b;
return c;
}
نه .نقل قول:
ربطی به اصولی بودن یا نبودن نداره .
در هر متد ، هر تعداد پارامتر با هر نوعی طرف نیاز داشت ، میتونه بنویسه .
در یک پارامتر از متد ، ممکنه نوعِ int و در پارامترِ دیگه ی همون متد ممکنه نوع double و در پارامترِ دیگه ی همون متد ممکنه نوع short و در پارامترِ دیگه ی همون متد ممکنه نوع float و در پارامترِ دیگه ی همون متد ممکنه هر نوع دیگه ای را لازم داشته باشه که میتونه تعریف و استفاده کنه .
درود
صبح بخیر استاد
فقط من آخر تفاوت های بین 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;
}
نقل قول:
بعد از ظهر بخیر :Love-ssa~! (1):
سجاد .
پسوند و پیشوند هم که قبلا گفتم .
برای یک متد ، یه 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 در متد را میکنه .نقل قول:
کد زیر را تست کن :
ارور میده .کد: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 را فرستاده بودی .
با سلام خدمت همگی،
آرشان جان بنده پیش تر هم از شما خواهش کرده بودم که برای هر سوال یه موضوع جدید ایجاد کنید. این طوری جریان بحث ها منسجم باقی میمونه. الان در این تاپیک پست اول ارتباطی به پست آخر نداره! لطفا رعایت کنید. ممنونم.
تاپیک قفل میشه.