گفتگو هایی در باب سی شارپ

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام استاد علی

تشکر از شما و آقا سجاد برای پاسخ ها


1- چرا باید حتما از متد BigInteger.Multiply برای ضرب کردن استفاده کنیم؟ مثلا من کد رو اینجوری می نویسم خطا می گیره


کد:
BigInteger temp = Bigfactorial(n - 1) * new BigInteger(n));
یا گلپسر ، سلام (کلا من میگم ، استاد هر جا موردی دیدن ، تصحیح کنن که دیگه گفتن نداره) .

1) چون وقتی میتونی عملگرها (مثل همین جمع و ضرب و ...) را برای نوع داده ای ای بکار ببری که اون عملگر برای اون نوع داده ای ، تعریف (overload) شده باشه . حالا یا در سطح زبان سی شارپ یا در سطح clr و ... .
اگه این کد ، ارور میده و انجام نمیشه ، بخاطر اینه که عملگر مورد نظر برای این نوع داده ای (BigInteger) ، پیاده سازی نشد .

کد اصلی هم که اینطوریه


کد:
  BigInteger temp = BigInteger.Multiply(Bigfactorial(n - 1), new BigInteger(n));

2- حالا اگه BigInteger.Multiply() رو در نظر بگیریم می تونیم بگیم که Multiply یک متد از استراکچر BigInteger ئه چون اگه بگیم عضوش هست ولی انگار مثل یک متد داره کاری انجام میده.

اصلا من آخرش نفهمیدم متد یک کلاس بودن چه فرقی با عضو یک کلاس یا استراکچر بودن داره مثل همین Multiply . اصلا عضو با متد فرقش چیه.
بله . Multiply ، یک عضو (عضوِ متد) از استراکچر BigInteger هست .
متد ، یکی از انواع مختلف از عضوهای یک کلاس هست .
یک کلاس (یا استراکچر و ...) ، میتونن انواع مختلفی از اعضا را داشته باشن . میتونن ، متد داشته باشن ، میتونن پروپرتی داشته باشن . میتونن فیلد داشته باشن ، میتونن آرایه داشته باشن ، میتونن ایندکسر داشته باشن . میتونن رویداد و خلاصه خیلی از اعضا را داشته باشن که متد ، یکی از انواعِ این اعضا هست (البته هر عضوی که کلاس داشته باشه ، استراکچر یا اینترفیس ها ، نمیتونن همه ی اون نوع اعضا را داشته باشن) .
 

the_king

مدیرکل انجمن
سلام استاد علی

تشکر از شما و آقا سجاد برای پاسخ ها


1- چرا باید حتما از متد BigInteger.Multiply برای ضرب کردن استفاده کنیم؟ مثلا من کد رو اینجوری می نویسم خطا می گیره


کد:
BigInteger temp = Bigfactorial(n - 1) * new BigInteger(n));
حتما نباید از BigInteger.Multiply استفاده کنید، می توانید از عملگر * استفاده کنید، چون در BigInteger عملگر * تعریف شده و عملگر * خودش Multiply رو فراخوانی می کنه.
کدتون خطا میده چون اون پارانتر بسته آخر سطر اضافیه و برایش پارانتز باز ای نبوده، اگر دیدید در کدی تعداد پارانتز باز با تعداد پارانتز بسته برابر نیست، قطعا یک جای کار اشتباه کرده اید.
تناسب تعداد پارانتز ها رو رعایت کنید تا مشکل حل بشه :
C#:
BigInteger temp = Bigfactorial(n - 1) * new BigInteger(n);
2- حالا اگه BigInteger.Multiply() رو در نظر بگیریم می تونیم بگیم که Multiply یک متد از استراکچر BigInteger ئه چون اگه بگیم عضوش هست ولی انگار مثل یک متد داره کاری انجام میده.
عضو در زبان #C تعریفش مشخصه، به هر نوع موجودیتی که داخل بدنه اون struct یا class تعریف شده باشن میگن عضو. فیلد ها، متد ها، رخداد ها، عملگر ها و ... کلا هر چیزی که داخل ساختار BigInteger تعریف شده باشه عضوی از BigInteger ئه. اینجا توصیف عضو و انواع عضو ها هست:

پس متد Multiply عضوی از BigInteger محسوب میشه، چرا؟ چون Multiply داخل بدنه ساختار BigInteger تعریف شده.

اصلا من آخرشنفهمیدم متد یک کلاس بودن چه فرقی با عضو یک کلاس یا استراکچر بودن داره مثل همین Multiply . اصلا عضو با متد فرقش چیه.
تضادی با هم ندارن. اعضاء خانواده رو در نظر بگیرید، میتونه پدر باشه، مادر باشه، دختر باشه، پسر باشه، مادربزرگ باشه و ... همه این انواع عضو هستند.
من عضوی از خانواده ام هستم، پسر خانواده هم هستم، پسر بودنم با عضو بودنم تضادی نداره. دلیلی نداره که چون پسر خانواده هستم پس عضو خانواده نباشم، یا چون عضو خانواده هستم پس پسر خانواده نباشم. هر دوشون درسته. عضو انواع مختلفی داره که یکی از این انواع متد ئه. عضو الزاما متد نیست، عضو میتونه فیلد باشه، رخداد باشه، متد باشه، یک کلاس یا ساختار درونی دیگه باشه و ...
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد (همچنین تشکر بابت اون تاپیک های مشاوره) :rose:
استاد ، فرق بین Debug و Release در ویژال استودیو چیه؟
در اینجا میگه معمولا Release را (آخرین باری که میخوان) پروژه را بسازن ، روی این حالت میذارن :


همچنین استاد ، اگه منابعی (فایل xaml و دیتابیس و حتی شاید تصویر و ...) را بخوام اضافه کنم ، بهتره توی کدوم پوشه بریزم؟ توی پوشه ای که فایل .sln و پروژه مون توشه یا اینکه توی پوشه ی Debug ؟ (پروژه ام wpf هه) .
فرقی هم داره که منابع مون را توی کدوم پوشه بریزیم؟ اگه آره ، فرقش چیه؟
تشکر استاد
 
آخرین ویرایش:

the_king

مدیرکل انجمن
خیلی ممنون استاد (همچنین تشکر بابت اون تاپیک های مشاوره) :rose:
استاد ، فرق بین Debug و Release در ویژال استودیو چیه؟
خروجی Debug اصولا با تنظیماتی ایجاد میشه که مناسب Debug کردن و رفع اشکال کد ئه و مناسب خود برنامه نویس و پیش از اتمام پروژه است.
خروجی Release اصولا با تنظیماتی ایجاد میشه که مناسب کاربر نهایی است که دیگه نیازی به اطلاعات جانبی جهت Debug نداره و به همین خاطر ممکنه حجم خروجی فایل کمتری هم داشته باشه.

در اینجا میگه معمولا Release را (آخرین باری که میخوان) پروژه را بسازن ، روی این حالت میذارن :

بله، البته تنظیمات دست شما است. می توانید کاری کنید که Debug مشابه تنظیمات Release باشه یا برعکس یا حتی چند Configuration جدید در Configuration Manager با اسامی دیگری بسازید که تنظیمات متفاوتی داشته باشند. Release و Debug صرفا Configuration های پیشفرض ئه که یک تنظیمات پیشفرضی هم از قبل دارند که در هر پروژه قابل تغییر ئه.

همچنین استاد ، اگه منابعی (فایل xaml و دیتابیس و حتی شاید تصویر و ...) را بخوام اضافه کنم ، بهتره توی کدوم پوشه بریزم؟ توی پوشه ای که فایل .sln و پروژه مون توشه یا اینکه توی پوشه ی Debug ؟ (پروژه ام wpf هه) .
فرقی هم داره که منابع مون را توی کدوم پوشه بریزیم؟ اگه آره ، فرقش چیه؟
کاملا به سلیقه و سبک کاری خودتون بستگی داره. تاثیر اجرایی نداره اما اگر سلیقه بخرج بدهید بر اساس گروه بندی خاصی پوشه میسازید تا فایل ها قاطی پاتی نباشن.
 

SU-57

Member
سلام

ببخشید سوالاتم بر اساس مرور سررسیدمه و مخلوطه و بیشتر مفهومیه. شایدم بعضی هاشو قبلا پرسیده باشم یادم نیست.


1- اعداد اعشاری در سی شارپ به طور پیش فرض double در نظر گرفته میشن پس چرا باید جلوی این اعداد D بذاریم. اگه تو ضرب و تقسم هم باشه بالاخره double هستند و فرقی برای کامپایلر نداره.

2- سرعت پایین تر برنامه های سی شارپ به نسبت C++ به خاطر چیه؟ فقط به خاطر کدهای میانیه. امکان داره تا یکی دو سال آینده مایکروسافت بتونه با تغییراتی در کدهای سی شارپ یا NETFramework سرعت برنامه های سی شارپ رو به سطح C++ برسونه یا اصلا این امکان وجود نداره و این محدودیت همیشگیه و قابل درست شدن نیست.

3- اگه مقدار یک کلاس null بشه آیا توسط gc از حافظه رم پاک می شه. البته می دونم مدیریت دست CLr ئه ولی گفتم شاید اینجوری زودتر پاک بشه.

سوال دیگه این هست که من یک متد ایجاد می کنم یا رویداد. وقتی این متد یا رویداد به پایان برسه تمامی متغیرها و عضوهایی که توش هست بلافاصله از حافظه رم پاک می شه با باز باید صبر کنیم CLR تصمیم بگیره.

چه راه ها و امکاناتی هست که بشه به CLR کمک کنیم زودتر موارد بلااستفاده رو تشخیص بده و از رم پاک کنه.

حالا اگه یک متغیر سراسری ایجاد کنیم مطمئنا تا برنامه رو کامل نبندیم این متغیر و مقدارش توی حافظه رم می مونه. درسته؟
 

SU-57

Member
4- داخل NETFramework چه چیزهایی وجود داره و هر نسخه جدیدش که میاد مایکروسافت چی بهش اضافه می کنه؟

5- می شه بیشتر وظایف CLR بگید مثلا یکیش مدیریت رم و یکیش خطایابی زمان اجرا. غیر از این ها وظیفه دیگه ای هم داره

6- الان همه از ویندوز 7 تا 10 که دارن NETframework نسخه های 4.6 به بالا روشون نصب کردن حتی شاید بشه گفت 4.8. پس چرا باید برنامه ای که می نویسیم مثلا از نسخه 4 استفاده کنیم حتی اگه از همه ویژگی هایی که روی نسخه 4.8 هست استفاده نکنیم. استفاده از نسخه 4.8 سرعت برنامه رو بیشتر نمی کنه به نسبت نسخه 4 مثلا شاید 4.8 بهینه تر باشه یا در صورتی که بخواهیم برنامه رو مثلا سال بعد به روز کنیم بهتر نیست.

7- اگه در سی شارپ بخواهیم dll های unmanaged وارد کنیم باید به همون زبان سی شارپ باشه یا محدود به زبان های .NET است یا مثلا می شه به زبان جاوا هم باشه مثلا میگم
 

SU-57

Member
8- اگه ما یک استراکچر null پذیر کنیم چه کاربردی داره.

9- چرا در TextBox این \n جواب نمیده و باید از \r\n استفاده کنیم این \r در اینجا کاربردش چیه. چون \n خودش یک خط پایین می بره دیگه.

10- آقا سجاد شما اینو گفتی توی یکی از قسمت ها من تو سررسید نوشتم ولی هرچی الان روش فکر می کنم متوجه نمیشم منظورت چی بوده. اون موقع برای این نوشتم که ازت بپرسم

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

11- استاد علی من که هنوز به اون سطح نرسیدم که بتونم برنامه بسازم ولی چون برنامه ها رو کپی می کنن و منم نمی دونم شما تا کی این جا هستید برای همین مهمترین سوالم اینه چطور می شه یک برنامه ای بسازم و یک روشی استفاده کنم کسی نتونه کرکش کنه که مفتی استفاده کنه. مثلا یکی می گفت بر اساس شماره سریال هارد کاربر. حالا بعضی ها هم Pc دارن و هم لپ تاپ. اگه دو کاربره بسازیم ممکنه طرف فقط PC داشته باشه و بعد دو نفری با هم نرم افزارو بخرن و پول یک نرم افزارو بدن ولی دو نفر استفاده کنن. نمی شه تشخیص داد که طرف راست میگه یا دروغ. ممکنه بگه 3 تا سیستم دارم و باید سه کاربره بدید.

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

the_king

مدیرکل انجمن
1- اعداد اعشاری در سی شارپ به طور پیش فرض double در نظر گرفته میشن پس چرا باید جلوی این اعداد D بذاریم. اگه تو ضرب و تقسم هم باشه بالاخره double هستند و فرقی برای کامپایلر نداره.
بایدی وجود نداره، اختیاری ئه.

2- سرعت پایین تر برنامه های سی شارپ به نسبت C++ به خاطر چیه؟ فقط به خاطر کدهای میانیه. امکان داره تا یکی دو سال آینده مایکروسافت بتونه با تغییراتی در کدهای سی شارپ یا NETFramework سرعت برنامه های سی شارپ رو به سطح C++ برسونه یا اصلا این امکان وجود نداره و این محدودیت همیشگیه و قابل درست شدن نیست.
از نظر فنی شدنی است اما خیلی بعیده.
سرعت زبان های برنامه نویسی به خود زبان ربطی نداره، به معماری کامپایلر/مفسر و کتابخانه هاشون وابسته است. پس بنابر این مقایسه ای بین سرعت #C و ++C نیست، همونطور که کامپایلر و مفسر های متعددی برای ++C هست با کارایی های کاملا متفاوت. چیزی که دارید مقایسه می کنید کارایی خروجی فلان کامپایلر #C ئه با فلان کامپایلر ++C. در ضمن NET. به ماشین مجازی اش وابسته است و معماری و ماشین مجازی اش هم به سادگی تغییر نمی کنه. زبان #C هم بدون Framework اش مزیت خاصی نداره، بنابر این امیدی به همچین تحولی نداشته باشید.

3- اگه مقدار یک کلاس null بشه آیا توسط gc از حافظه رم پاک می شه. البته می دونم مدیریت دست CLr ئه ولی گفتم شاید اینجوری زودتر پاک بشه.
اینکه مقدار متغیری رو بعد از اینکه دیگر به شی ایجاد شده نیازی ندارید null کنید کمک می کنه تا زودتر اون شیء به عنوان داده بلا استفاده شناسایی بشه اما به این معنی نیست که حافظه اش هم الزاما زودتر آزاد بشه.

سوال دیگه این هست که من یک متد ایجاد می کنم یا رویداد. وقتی این متد یا رویداد به پایان برسه تمامی متغیرها و عضوهایی که توش هست بلافاصله از حافظه رم پاک می شه با باز باید صبر کنیم CLR تصمیم بگیره.
حافظه متغیر های محلی value-type که همون موقع آزاد می شوند، چون امکان ارجاعی بهشون نیست و متغیر محلی هم بعد خروج از بدنه متد دیگه وجود نداره. اما در مورد متغیر هایی که reference-type هستند بلافاصله اتفاق خاصی نمی افته، اشیاء بر اساس تعداد ارجاعی که بهشون هست برررسی میشن تا اشیاء بلااستفاده شناسایی بشن، ممکنه در فیلدی خارج از بدنه اون متد ارجاعی به شیء باقی باشه که بخاطرش حافظه شیء قابل آزاد کردن نباشه. در کل GC برای آزاد کردن حافظه اشیاء ای که بهشون ارجاعی نیست عجله نداره.

چه راه ها و امکاناتی هست که بشه به CLR کمک کنیم زودتر موارد بلااستفاده رو تشخیص بده و از رم پاک کنه.
در کل نباید دخالتی بکنید چون GC بهتر از شما تشخیص میده که کی زمان مناسب این بررسی است. دخالت شما صرفا با افزایش بار پردازشی کارایی مدیریت GC رو پایین میاره.
کد:
GC.Collect();
GC.WaitForPendingFinalizers();
حالا اگه یک متغیر سراسری ایجاد کنیم مطمئنا تا برنامه رو کامل نبندیم این متغیر و مقدارش توی حافظه رم می مونه. درسته؟
فیلد static یا فیلد غیر static داخل کلاس؟ فیلد غیر static داخل کلاس صرفا در زمان بقای شیء اون کلاس وجود داره و بعدش شیء ای که بهش ارجاع داشته هم بلااستفاده است و ممکنه حافظه اش زودتر آزاد بشه. اما اگر مقدار متغیر static ئه رو null نکنید، بله، چون ارجاع اون متغیر به اون شیء به این معنی است که شیء بلااستفاده محسوب نمیشه و چون متغیر static در زمان اجرای برنامه باقی میمونه شیء اش هم آزاد نمیشه.

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


4- داخل NETFramework چه چیزهایی وجود داره و هر نسخه جدیدش که میاد مایکروسافت چی بهش اضافه می کنه؟
مایکروسافت با ارائه هر نسخه جدید و حتی پیش از ارائه نسخه نهایی اعلام می کنه که تغییرات و موارد جدید چیه.

5- می شه بیشتر وظایف CLR بگید مثلا یکیش مدیریت رم و یکیش خطایابی زمان اجرا. غیر از این ها وظیفه دیگه ای هم داره
مدیریت RAM وظیفه سیستم عامل ئه نه CLR. پس باید بگید مدیریت حافظه ماشین مجازی، نه مدیریت RAM
CLR کامپایل می کنه، حافظه اشیاء بلااستفاده رو شناسایی و آزاد می کنه و کد ماشین مجازی رو هم اجرا می کنه و ماشین مجازی رو مدیریت می کنه. اجرای کد ماشین مجازی و مدیریت ماشین مجازی خودش یک مجموعه وظایف ئه.

6- الان همه از ویندوز 7 تا 10 که دارن NETframework نسخه های 4.6 به بالا روشون نصب کردن حتی شاید بشه گفت 4.8. پس چرا باید برنامه ای که می نویسیم مثلا از نسخه 4 استفاده کنیم حتی اگه از همه ویژگی هایی که روی نسخه 4.8 هست استفاده نکنیم. استفاده از نسخه 4.8 سرعت برنامه رو بیشتر نمی کنه به نسبت نسخه 4 مثلا شاید 4.8 بهینه تر باشه یا در صورتی که بخواهیم برنامه رو مثلا سال بعد به روز کنیم بهتر نیست.
بایدی وجود نداره، صرفا توصیه ای برای سازگاری بیشتر ئه. در ضمن آمار مستندی در این مورد ندیدم که این سهم بالا از NET 4.6 رو نشون بده.

7- اگه در سی شارپ بخواهیم dll های unmanaged وارد کنیم باید به همون زبان سی شارپ باشه یا محدود به زبان های .NET است یا مثلا می شه به زبان جاوا هم باشه مثلا میگم
برنامه نویسی DLL های Unmanaged که به زبان #C نبوده اما به هر حال زبان برنامه نویسی شون اهمیتی نداره چون محتویات فایل DLL قبلا کامپایل شده و دیگه به زبان برنامه نویسی اولیه نیست. NET. میتونه هم از DLL های Managed و هم Unmanaged استفاده کنه.

8- اگه ما یک استراکچر null پذیر کنیم چه کاربردی داره.
برای مواقعی که میخواهید بین وجود داده و فقدان وجود داده فرقی بذارید.

9- چرا در TextBox این \n جواب نمیده و باید از \r\n استفاده کنیم این \r در اینجا کاربردش چیه. چون \n خودش یک خط پایین می بره دیگه.
در اصل دو تا کاراکتر با وظایف متفاوت ئه، یکی شون برای انتقال به ستون اول و دیگری برای مرور یک سطر به بالا.
در سیستم عامل ویندوز برای مشخص کردن سطر بعدی باید CR LF هر دو باشه، در بعضی سیستم عامل ها مثل Unix از LF به تنهایی استفاده میشه.
رجوع شود به :

11- استاد علی من که هنوز به اون سطح نرسیدم که بتونم برنامه بسازم ولی چون برنامه ها رو کپی می کنن و منم نمی دونم شما تا کی این جا هستید برای همین مهمترین سوالم اینه چطور می شه یک برنامه ای بسازم و یک روشی استفاده کنم کسی نتونه کرکش کنه که مفتی استفاده کنه. مثلا یکی می گفت بر اساس شماره سریال هارد کاربر. حالا بعضی ها هم Pc دارن و هم لپ تاپ. اگه دو کاربره بسازیم ممکنه طرف فقط PC داشته باشه و بعد دو نفری با هم نرم افزارو بخرن و پول یک نرم افزارو بدن ولی دو نفر استفاده کنن. نمی شه تشخیص داد که طرف راست میگه یا دروغ. ممکنه بگه 3 تا سیستم دارم و باید سه کاربره بدید.
هیچ روشی برای حفاظت صد در صدی وجود نداره، خود نرم افزار های حافظت از کپی رو هم کرک می کنند.
اما به هر حال استفاده از Obfuscator ها حداقل کاری است که باید انجام بدهید. هر چقدر که ابزار مورد استفاده تون ناشناخته و گمنام تر باشه بهتر.

 

جدیدترین ارسال ها

بالا