PDA

مشاهده نسخه کامل : سوالات مرتبط با سی شارپ



Speed Racer
25-08-19, 18:46
سلام آقا سجاد

شما گفتی که void اگه بذاریم یعنی مقداری فراخونی نمی شه ولی طبق عکس زیر شما اینجا خودت گفتی که Method1 رو فراخونی می کنیم.


22960

SajjadKhati
25-08-19, 22:00
سلام گلپسر عزیز .
نمیدونم کجا همچین جمله ای گفتم ولی دقت کن که من گاها حواسم توی جمله بندی پرت میشه (این قدر حجم زمانی آموزش بالا بود و ان شاء ا... در آینده هم خواهد بود) اما مثلا یه کم جلوتر یا عقب تر اش را نگاه کنی ، جمله ی درست اش را میگم . کلا منظورم اینه که اگه همچین جمله ای گفته بودم ، جزء اشتباهات کلامی ام بود.

اگه اون جمله را گفتم ، عذرخواهی میکنم . منظورم این بود که اگه void بذاریم ، اون تابع یا متد ، مقداری را برنمیگردونه .

کلا برای اشتباهات کلامی ، کلِ اون قسمت را ببینی ، متوجه شون میشی که کجا اشتباهات کلامی بود.

Speed Racer
26-08-19, 19:07
سلام گلپسر عزیز .
نمیدونم کجا همچین جمله ای گفتم ولی دقت کن که من گاها حواسم توی جمله بندی پرت میشه (این قدر حجم زمانی آموزش بالا بود و ان شاء ا... در آینده هم خواهد بود) اما مثلا یه کم جلوتر یا عقب تر اش را نگاه کنی ، جمله ی درست اش را میگم . کلا منظورم اینه که اگه همچین جمله ای گفته بودم ، جزء اشتباهات کلامی ام بود.

اگه اون جمله را گفتم ، عذرخواهی میکنم . منظورم این بود که اگه void بذاریم ، اون تابع یا متد ، مقداری را برنمیگردونه .

کلا برای اشتباهات کلامی ، کلِ اون قسمت را ببینی ، متوجه شون میشی که کجا اشتباهات کلامی بود.

منظور من اینه که شما گفتی مقداری رو بر نمی گردونه ولی می بینیم که رشته داخل MessageBox.Show برگردونده می شه. اگه منظورت از مقدار عدد باشه که خوب من می تونم کاری کنم که MessageBox.Show عدد برگردونه بنابراین Method1 با اینکه void است ولی داره یک مقداری بر می گردونه.

SajjadKhati
26-08-19, 22:37
منظور من اینه که شما گفتی مقداری رو بر نمی گردونه ولی می بینیم که رشته داخل MessageBox.Show برگردونده می شه. اگه منظورت از مقدار عدد باشه که خوب من می تونم کاری کنم که MessageBox.Show عدد برگردونه بنابراین Method1 با اینکه void است ولی داره یک مقداری بر می گردونه.


سلامی مجدد
نه.
اصلا منظور از برگردوندن تابع ، این چیزی نیست که فکر میکنی.
نوشتنِ یک مقدار داخل تابعِ MessageBox.Show که برابر نیست با برگردوندن .
برگردوندن به این معنا هست که وقتی اسم تابعی (یا حالا اسم پروپرتی یا متغییر و ...) را که نوشتی ، بتونی اون تابع را داخلِ یک متغییر ذخیره کنی و بعدا استفاده کنی .
الان شما میتونی در کدی که در پست اول دادی ، درونِ رویداد button58_Click ، همچین کد زیر را بنویسی ؟ :



string a = Method1();


یعنی کلا این جوری بنویسی (بجای نوع string در کد بالا ، هر نوعِ دیگه ای خواستی ، بده) :



private void button58_Click(object sender, EventArgs e)
{
string a = Method1();
}


private void Method1()
{
MessageBox.Show("داخل تابع Mrthod1");
}


نه نمیشه . چون تابع Method1 ، چیزی را برنمیگردونه .
اصلا کاری به درونِ تابع و کدهایی که داخلِ تابعِ 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 گرفتم.

Speed Racer
29-08-19, 17:55
سلامی مجدد

درود

امکان داره بشه آرگومان ها رو در همون تابع بدیم و در متد آرگومانی نیاریم. این کد خطا میده. مشکلش کجاست


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());
}

SajjadKhati
29-08-19, 21:53
درود

امکان داره بشه آرگومان ها رو در همون تابع بدیم و در متد آرگومانی نیاریم. این کد خطا میده. مشکلش کجاست


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) ، هیچ مقداری به این دو تا ورودی ندادی.

Speed Racer
01-11-19, 15:12
درود

یک متد ریاضی جدید خودم نوشتم ولی قدر مطلق داره. این علامت های قدر مطلق میذارم جواب نمیده. ( | | ) . چیکار باید کنم

مثلا می خوام بنویسم قدر مطلق a این چطوری نوشته می شه

SajjadKhati
01-11-19, 16:15
درود

یک متد ریاضی جدید خودم نوشتم ولی قدر مطلق داره. این علامت های قدر مطلق میذارم جواب نمیده. ( | | ) . چیکار باید کنم

مثلا می خوام بنویسم قدر مطلق a این چطوری نوشته می شه

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

C# operators - C# reference | Microsoft Docs (Only the registered members can see the link)

یا

C# Operators: Arithmetic, Comparison, Logical and more. (Only the registered members can see the link)

اون علامت | که در ریاضی به عنوان قدر مطلق معنا داره ، توی سی شارپ ، به عنوان عملگر اور (یا همون عملگر OR) معنا داره که ربطی به قدر مطلق نداره .
برای عملیات ریاضی ، یا باید از متدهای آماده که در کلاس Math هست استفاده کنی :

Math Class (System) | Microsoft Docs (Only the registered members can see the link)

عملیات قدر مطلق را متد Abs در این کلاس انجام میده :

Math.Abs Method (System) | Microsoft Docs (Only the registered members can see the link_Math_Abs_System_Int32_)

اگه متدهای بیشتری نیاز داری ، یا باید در اینترنت ، دنبالش بگردی یا اینکه خودت بنویسی .
برای اینکه خودت همچین متد و کد (قدر مطلق) را بنویسی ، باید ببینی از چه دستورات اون زبان میتونی استفاده کنی . مثلا از طریق شرط if هم میشه نوشت . شاید یا عملگر هم باقی مانده هم بشه نوشت و ... .
در زیر ، با شرط if ، متد قدر مطلق را برات میذارم :



int Absulate(int digit)
{
if (digit < 0)
digit = digit - (2 * digit);

return digit;
}


توضیحش اینکه میگه اگه عدد منفی بود ، همون عدد را دو برابر کن و ازش کم کن (چون عدد منفی هه ، کم کردیم که دو علامتِ عدد منفی ، تبدیل به علامت مثبت میشه و باعث میشه جمع کنه . همون قضیه ی منفی در منفی که میشه مثبت)

Speed Racer
01-11-19, 16:39
سلام بر گلپسر عزیز .
علامت قدر مطلق (همین علامت | | ای که نوشتی) ، در ریاضی ، معنا و مفهوم داره . موقع برنامه نویسی ، فقط محدود به این هستی که عملگرهای در اون برنامه (در اینجا ، عملگرها در زبان سی شارپ) را استفاده کنی . یعنی ، فقط میتونی از عملگرهای (علامت ها) زیر ، استفاده کنی :

C# operators - C# reference | Microsoft Docs (Only the registered members can see the link)

یا

C# Operators: Arithmetic, Comparison, Logical and more. (Only the registered members can see the link)

اون علامت | که در ریاضی به عنوان قدر مطلق معنا داره ، توی سی شارپ ، به عنوان عملگر اور (یا همون عملگر OR) معنا داره که ربطی به قدر مطلق نداره .
برای عملیات ریاضی ، یا باید از متدهای آماده که در کلاس Math هست استفاده کنی :

Math Class (System) | Microsoft Docs (Only the registered members can see the link)

عملیات قدر مطلق را متد Abs در این کلاس انجام میده :

Math.Abs Method (System) | Microsoft Docs (Only the registered members can see the link_Math_Abs_System_Int32_)

اگه متدهای بیشتری نیاز داری ، یا باید در اینترنت ، دنبالش بگردی یا اینکه خودت بنویسی .
برای اینکه خودت همچین متد و کد (قدر مطلق) را بنویسی ، باید ببینی از چه دستورات اون زبان میتونی استفاده کنی . مثلا از طریق شرط if هم میشه نوشت . شاید یا عملگر هم باقی مانده هم بشه نوشت و ... .
در زیر ، با شرط if ، متد قدر مطلق را برات میذارم :



int Absulate(int digit)
{
if (digit < 0)
digit = digit - (2 * digit);

return digit;
}


توضیحش اینکه میگه اگه عدد منفی بود ، همون عدد را دو برابر کن و ازش کم کن (چون عدد منفی هه ، کم کردیم که دو علامتِ عدد منفی ، تبدیل به علامت مثبت میشه و باعث میشه جمع کنه . همون قضیه ی منفی در منفی که میشه مثبت)
ممنونم استاد عزیز

همین Math.Abs استفاده کردم که آسونتر بود و درست شد.

Speed Racer
05-11-19, 21:53
دورود
س1) الان آخرین خطی که اجرا می شه MessageBox هه یا Method6

23102

س2) این IntoMethod اصولش اینه بالای متد باشه (اون متد داخلی) یا پایین متد هر چند فرقی نداره. اصولش باید به چه صورت باشه

س3) اگه نوع متد استراکت باشه هم بدنه اون درون هیپ قرار می گیره یا فقط وقتی که نوعش کلاس باشه

SajjadKhati
06-11-19, 15:41
دورود
س1) الان آخرین خطی که اجرا می شه MessageBox هه یا Method6

23102

س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 ات . اگه منظورت نوعِ خروجیِ متد هست که استراکچر باشه ، وقتی که یه شیِ استراکچر برگردونده میشه مثل کد زیر :



int global = 5;

int ReturnStruct()
{
return global;
}


private void Button1_Click(object sender, EventArgs e)
{
int number = ReturnStruct();
}





اولا اینکه استراکچر global که از نوع int هست و میدونی که 32 بیت (4 بایت) ، حافظه اشغال میکنه .
دوما وقتی که کد ، در رویداد Button1_Click ، اجرا میشه (یا به عبارت دیگه ، کد return global در متد ReturnStruct اجرا میشه) ، چون مقدار استراکچر را return کرد و برگردوند ، هر چقدر که متغییری را که از نوع استراکچر بود ، حافظه اشغال کرده بود (یعنی متغییر global که 32 بیت هست) ، به همون اندازه از حافظه (یعنی 32 بیت) در حافظه ی جدیدی براش فضا اشغال میکنه . در واقع ، حافظه کپی میشه و 2 تا میشه . بنابراین در کد بالا ، یه حافظه ی 32 بیت برای متغییر سراسریِ global و یه حافظه ی 32 بیتِ دیگه هم برای متغییر محلیِ number داریم .

بدنه هم ربطی به نوع بازگشتی نداره . وقتی هر بار که متدی را فراخونی میکنیم (حتی اگه از درون همون متد ، همون متد را مجددا فراخونی کنیم) ، یه حافظه ی جدیدی براش در نظر گرفته میشه که با تمام شدنِ بلاکِ متد ، از بین میره

Speed Racer
07-11-19, 17:16
اولا اینکه استراکچر global که از نوع int هست و میدونی که 32 بیت (4 بایت) ، حافظه اشغال میکنه .
دوما وقتی که کد ، در رویداد 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);
}

SajjadKhati
07-11-19, 19:49
درود استاد

چون منو توی هیپ و استک درگیر کردی دیگه تا آخرش باید برم :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 میتونه خیلی مفید باشه . اما دونستنِ همین قضیه ی اشاره گرها تا زمانی که فقط از کدهای سی شارپ ، اون هم تا حد متوسط استفاده میکنیم ، کاربردی نداره.


به هر حال اگه هم خیلی اصرار به این قضیه داری ، من دقیق نمیتونم راهنمایی کنم . چون اطلاعات کاملی فعلا ندارم .
یا بذار ، مهندس آرمین عزیز بیان ، نظرشون رو جویا شو.

Speed Racer
10-11-19, 19:20
الان به این 10 میگن مقداردهی اولیه یا مقداردهی پیش فرض. کدومش درست تره


void Method8 (int mypar1 = 10)

SajjadKhati
10-11-19, 20:27
الان به این 10 میگن مقداردهی اولیه یا مقداردهی پیش فرض. کدومش درست تره


void Method8 (int mypar1 = 10)

فکر کنم مقدار پیش فرض بگن . بازم دقیق نمیدونم .

ravegoat
11-11-19, 15:43
درود استاد

چون منو توی هیپ و استک درگیر کردی دیگه تا آخرش باید برم :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);
}

سلام آرشان،

این دو پیوند رو مطالعه کنید:
C# Heap(ing) Vs Stack(ing) In .NET - Part One (Only the registered members can see the link)

C# Heap(ing) Vs Stack(ing) In .NET - Part Two (Only the registered members can see the link)
اگر سوالی بود بعدش، هستم در خدمتت.

آرمین :11():

Speed Racer
07-12-19, 18:54
فکر کنم مقدار پیش فرض بگن . بازم دقیق نمیدونم .
درود

(نقل قول گرفتم که ببینی ولی ربطی به این نداره)

من جواب این سوالم رو هنوز نگرفتم (لطفا عجله ای جواب ندید که یک وقت اشتباه بشه می خوام پاسخ درست باشه)

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 رو نصب کنه.

SajjadKhati
07-12-19, 21:20
درود

(نقل قول گرفتم که ببینی ولی ربطی به این نداره)

من جواب این سوالم رو هنوز نگرفتم (لطفا عجله ای جواب ندید که یک وقت اشتباه بشه می خوام پاسخ درست باشه)

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 (چه express و enterprise و ...) رو اگه بخوای در سیستم طرف اجرا کنی ، توی سیستم اون طرف ، موتور اون نسخه یا موتور نسخه ی بالاتر از اون sql باید نصب باشه.

احتمالا باید بشه در نرم افزارهایی که برای نصب نام بردی ، کاری کرد که اتوماتیک موتور sql را در سیستم کاربر نهایی ، نصب کنه .




اگه با SQL Server 2019 پایگاه داده ایجاد کنم طرف مقابل می تونه با SQL Server 2016 پایگاه داده من رو استفاده کنه و یا بر عکس این موضوع.


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



کلا تا چه نوع نرم افزارهایی SQL Server داخلی خود سی شارپ جواب میده و از چه مرحله ای به بعد باید از نسخه نصبی Enterprise یا Standard استفاده کنیم. خود اینکه کجا از Standard . کجا از Enterprise هم استفغاده کنیم یک بحث دیگه است.


معمولا اگه برنامه نویس ، قطعا بخواد توی سیستم کاربر نهایی (کاربری که برنامه ، توی سیستم اش اجرا میشه) ، موتور sql را نصب کنه یا از نصب شدنش اطمینان داشته باشه ، از sql server (نسخه های مختلف اش) استفاده میکنه اما اگه برای برنامه نویس ، مهم باشه که موقع نصب برنامه اش ، نمیخواد موتور sql در سیستم کاربر نهایی نصب شه ، از sqllite استفاده میکنه .

sqlite قدرت کمتری داره اما خوبی اش اینه که لازم به نصب موتور در سیستم کاربر نهایی نداره اما برای اجرای sql server در سیستم کاربر نهایی ، حتما باید موتورش در سیستم کاربر نهایی نصب باشه یا نصب بشه . این از قضیه ی دیتابیس sqlite . البته sqlite ، محدودیت های دیگه مثل سرعت کمتر ، تعداد رکورد کمتر (میگن حداکثر تا یک میلیون رکورد) و همچنین پشتیبانی نکردن برای پاسخگویی همزمان به چند نخ را هم داره .

حالا توی نسخه های مختلف sql server ، اگه بخوان در سطح سرور و شبکه ارتباطی برقرار کنن ، از نسخه ی sql server enterprise استفاده میکنن . تعداد بسیار بسیار زیادی از رکودها را بدون کاهش قدرت و سرعتش میتونه در خودش جای بده .
اگه قرار نباشه در سطح شبکه استفاده بشه ، معمولا از sql express استفاده میکنن . البته محدودیت های دیگه هم فکر کنم نسبت به sql server enterprise فکر کنم داشته باشه .
درباره ی sql standard خبر ندارم .



یک نرم افزار دیگه به نام SQL Server Management Studio است که نمی دونم تفاوتش با SQL Server 2019 چیه و از نظر کاربرد چه فرقی می کنه

****************************************


نمیدونم .



برای ویندوز 10 باید .Netframewok 3.5 نصب بشه اما روی ویندوز 7 مثل اینکه از قسمت Programs and Features و Turn Windows features باید تیک نصبش رو بزنیم. (شاید هم اشتباه می کنم) توی بعضی از ویندوز های 7 نسخه 3.5 داره و توی بعضی 3.5.1. اینا چه فرقی دارن


تفاوت نسخه های مختلف دات نت ، توی msdn نوشته .
البته پیشنهاد من اینه که برنامه را تحت نسخه ی دات نت 4.0 بنویسی . چون توی نسخه ی 4.0 ، تغییرات زیاد بوده . قضیه ی نخ ها و کلاس های مختلف اش ، بسیار توی این نسخه ، بهتر شده . حالا میتونی تغییرات را توی سایتش ببینی .
هم اینکه نسخه ی 4.0 چون مال 10 سال پیش هست ، اون قدر قدیمی هست که حتی در ویندوز xp (آخرین آپدیت هاش) هم پشتیبانی بشه (برای کسایی که میخوان توی همه ی ویندوز برنامه شون اجرا بشه) .



اگه من .Netframework 4.8 نصب کنم اصلا نیازه که نسخه 1.1 تا 4 رو هم نصب کنم یا اینکه فقط تا نسخه 4 رو باید نصب کنم. مثلا نسخه 4.8 از نسخه 4 پشتیبانی نمی کنه. اگه پشتیبانی نمی کنه تا چه نسخه ای رو پشتیبانی می کنه مثلا تا 4.5.2 پشتیبانی می کنه.


1.1 تا 2.0 تا حتی 3.0 که دیگه خیلی منسوخ شدن . هر چند 2.0 به بعد ، توی سیستم عامل ها پشتیبانی میشن .
عمده تغییرات ، حداقل ، توی نسخه ی 3.5 و 4.0 یا بالاتر بوده .
بنابراین برنامه های روز و حداقل چند سال پیش تا حالا را حداقل من ندیدم که زیرِ نسخه ی دات نت 3.5 بسازن .

از طرفی هم با نصب ویندوز ، آخرین نسخه ی دات نت نسبت به آپدیت همون ویندوز هم همراه ویندوز ، نصب میشه . بنابراین نیاز به نصب نسخه های قبل تر اش نیست .
دقیق نمیدونم اما فکر کنم هر سری ، اگه بالاترین نسخه شو نصب کنی ، نسخه ی پایین تر اش دیگه لازم نیست . مثلا اگه دات نت 4.8 را نصب کنی ، دات نت 4.7 و 4.6 لازم نیست . دقیق نمیدونم . بپرس .



یک جایی خوندم اگه می خوای نرم افزار بنویسی از نسخه .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 رو نصب کنه.


البته اگه میدونی که برنامه ات نمیخوای توی 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 جواب میده .
بله میشه نصب اتوماتیک انجام داد.

Speed Racer
08-12-19, 00:01
فکر کنم مقدار پیش فرض بگن . بازم دقیق نمیدونم .

داداش سجاد این کد چرا کار نمی کنه


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){
}

البته من نمی دونم کجاها باید اصول رو زیر پا بذاریم کلی گفتم

SajjadKhati
08-12-19, 07:06
داداش سجاد این کد چرا کار نمی کنه


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;
}

یعنی ویژوال استودیو من خراب شده و درست کار نمی کنه.


بخاطر اینکه متغییرِ 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;
}






یک نکته است که به نظرت وقتی مقدار بازگشتی متد مثلا string هست درسته نوع پارامترش int باشه ایا بهتر نیست که همه نوع ها یکی باشن. مثلا شما اینجوری کد می نویسی


string Method1(int a, double b){
}

به نظرت اصولی تر این نیست که اینطوری بنویسیم که قاطی نشه


double Method2(double a, double b){
}


البته من نمی دونم کجاها باید اصول رو زیر پا بذاریم کلی گفتم


نه .
ربطی به اصولی بودن یا نبودن نداره .
در هر متد ، هر تعداد پارامتر با هر نوعی طرف نیاز داشت ، میتونه بنویسه .
در یک پارامتر از متد ، ممکنه نوعِ int و در پارامترِ دیگه ی همون متد ممکنه نوع double و در پارامترِ دیگه ی همون متد ممکنه نوع short و در پارامترِ دیگه ی همون متد ممکنه نوع float و در پارامترِ دیگه ی همون متد ممکنه هر نوع دیگه ای را لازم داشته باشه که میتونه تعریف و استفاده کنه .

Speed Racer
08-12-19, 09:13
درود

صبح بخیر استاد

فقط من آخر تفاوت های بین ref و out رو نفهمیدم و اگه تفاوتی هم هست توی چه موقعیت هایی کاربرد دارن که دوست دارم با مثال های ساده و یک متغیره و نهایتا دو متغیره که ترجیحا از یک نوع باشن مثلا int توضیح بدی.

مثلا همین کد رو در نظر بگیر من چه با out و چه با ref بنویسم هر دو یک جواب رو برمی گردونن. البته هدف اصلی این دو تا رو می دونم که ارسال با ارجاع هستن اما تفاوت بین اینکه دو کلمه کلیدی متفاوت برای ارسال با ارجاع در نظر گرفتن رو متوجه نمی شم و کاربردهاشون



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;
}

چه با ref چه با out هیچ فرقی ندارن. یک کتاب دایتل هم خریدم اونجا که اصلا اون چیزهایی که گفتی رو اصلا توضیح نداده و اونجا هم مثال هاش فرقی با هم ندارن. منظورم اینه باز شما 10 برابر از اون کتاب که بهترین کتاب سی شارپه بیشتر توضیح دادی.

SajjadKhati
08-12-19, 15:11
درود

صبح بخیر استاد

فقط من آخر تفاوت های بین ref و out رو نفهمیدم و اگه تفاوتی هم هست توی چه موقعیت هایی کاربرد دارن که دوست دارم با مثال های ساده و یک متغیره و نهایتا دو متغیره که ترجیحا از یک نوع باشن مثلا int توضیح بدی.



بعد از ظهر بخیر :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 و چه با ref بنویسم هر دو یک جواب رو برمی گردونن. البته هدف اصلی این دو تا رو می دونم که ارسال با ارجاع هستن اما تفاوت بین اینکه دو کلمه کلیدی متفاوت برای ارسال با ارجاع در نظر گرفتن رو متوجه نمی شم و کاربردهاشون



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;
}

چه با ref چه با out هیچ فرقی ندارن.


کلمه ی کلیدی 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 را فرستاده بودی .

ravegoat
09-12-19, 18:52
با سلام خدمت همگی،

آرشان جان بنده پیش تر هم از شما خواهش کرده بودم که برای هر سوال یه موضوع جدید ایجاد کنید. این طوری جریان بحث ها منسجم باقی میمونه. الان در این تاپیک پست اول ارتباطی به پست آخر نداره! لطفا رعایت کنید. ممنونم.

تاپیک قفل میشه.