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

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

Active Member
سلام

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


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

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

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

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

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

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

SU-57

Active 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

Active 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 ها حداقل کاری است که باید انجام بدهید. هر چقدر که ابزار مورد استفاده تون ناشناخته و گمنام تر باشه بهتر.

 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد استاد
استاد ، در اون انجمن ، به یه نفر دیگه قبلا دیدم که گفته بودین که در سیستم عامل ویندوز ، پردازش نخ ها ، بصورت RealTime نیستن . حتی اگه پردازش نخ ها را بصورت RealTime تنظیم کنیم (نمونه اش در تایمر و اینها) .

سئوال اولم اینه که سیستم عامل های دیگه مثل لینوکس و مکینتاش ، RealTime هستن؟
سئوال بعدی اینه که اگه این طور باشه ، پس چرا هیچ وقت ساعت در ویندوز (حداقل در کامپیوتر من) ، عقب نمیافته و همیشه دقیق هه؟
چون اگه پردازش نخ برای ساعت ویندوز ، RealTime نباشه ، هر چند مدت ، چند میلی یا میکروثانیه هم عقب بیفته ، در طول دراز مدت (چند ماهه) باید شاهد این باشیم که ساعت ویندوز عقب میفته . اما عقب نمیفته . چرا؟

البته تیک تنظیمات Synchronize With An Internet Time Server در ساعت ویندوزم ، زده هست .
یا کلا در واقع عقب میافته اما در پس زمینه ، بخاطر فعال بودن این گزینه هست که اتوماتیک خودش را هر چند مدت از اینترنت به روز میکنه و ما متوجه نمیشیم؟
تشکر استاد .
 

the_king

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

سئوال اولم اینه که سیستم عامل های دیگه مثل لینوکس و مکینتاش ، RealTime هستن؟
سوال هایی که میپرسید به سی شارپ ربطی داره که اینجا میپرسید؟
نه. سیستم عامل های Real-Time سیستم عامل های خاصی هستند، با این سیستم عامل های چند منظوره که ازشون برای اجرای برنامه های کاربری استفاده می کنید تفاوت دارند.
لینوکس یک سیستم عامل مشخص نیست که بگیم هست یا نیست، خانواده ای از سیستم عامل ها است بر اساس هسته لینوکس، برای همین شرایط سیستم عامل های مبتنی بر لینوکس شبیه هم نیست، ممکنه بعضی هاشون Real-Time باشند، بعضی هاشون نباشند. این سیستم عامل های متعارفی که شناخته شده هستند Real-Time نیستند چون کلا کاربرد شون پردازش Real-Time نیست. تصور کنید در سیستم عامل هدایت هواپیما یا ماشین خودران یا سیستم شناسایی دوست از دشمن پردازش Real-Time بودن چقدر تاثیر داره.

سئوال بعدی اینه که اگه این طور باشه ، پس چرا هیچ وقت ساعت در ویندوز (حداقل در کامپیوتر من) ، عقب نمیافته و همیشه دقیق هه؟
چون کارکرد ساعت ربطی به سیستم عامل نداره. ساعت فیزیکی ئه، سخت افزار ئه، نرم افزاری نیست. حتی وقتی سیستم خاموشه و سیستم عاملی در حال اجرا نیست RTC بصورت یک چیپ مستقل یا در چیپ پل جنوبی روی مادربورد با باطری تغذیه میشه و داره کار خودش رو انجام میده.

البته تیک تنظیمات Synchronize With An Internet Time Server در ساعت ویندوزم ، زده هست .
یا کلا در واقع عقب میافته اما در پس زمینه ، بخاطر فعال بودن این گزینه هست که اتوماتیک خودش را هر چند مدت از اینترنت به روز میکنه و ما متوجه نمیشیم؟
با هر کیفیت کریستالی که استفاده شده باشه، نهایتا دقت ساعت RTC مثل یک ساعت مچی کوارتزی ئه. خیلی خیلی دقیق که نیست که اصلا جلو و عقب نشه، به مرور زمان ساعت جلو و عقب میشه و به هر حال دقتی در حد یک ساعت اتمی نداره، برای همین اینکه از طریق سرور ساعت بروز بشه مفیده.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد .
استاد ، سئوالی که در لینک زیر برای طرف جواب دادین (برای قضیه ی ضرب double و float) :


من مقدار همه را از نوع Double گرفتم ، درست حساب کرد :

C#:
            double dbl = 100000000;
            double count = 2.2;
            double resault = dbl * count;

اما با تبدیل ، جواب نداد و همون مشکلِ دقیق نبودن ، اتفاق میافته :

C#:
double dbl = 100000000;
            float count = 2.2f;
            double convert = (double)count;
            double resault = dbl * convert;

چجوری هه؟
چون در اون مثال که گفت ، نوع ها فرق داشتن این طوری هه؟
یا گاها ممکنه همچین اتفاق هایی بیفته؟!
تشکر استاد .
 
آخرین ویرایش:

the_king

مدیرکل انجمن
خیلی ممنون استاد .
استاد ، سئوالی که در لینک زیر برای طرف جواب دادین (برای قضیه ی ضرب double و float) :


من مقدار همه را از نوع Double گرفتم ، درست حساب کرد :

C#:
            double dbl = 100000000;
            double count = 2.2;
            double resault = dbl * count;

اما با تبدیل ، جواب نداد و همون مشکلِ دقیق نبودن ، اتفاق میافته :

C#:
double dbl = 100000000;
            float count = 2.2f;
            double convert = (double)count;
            double resault = dbl * convert;

چجوری هه؟
چون در اون مثال که گفت ، نوع ها فرق داشتن این طوری هه؟
یا گاها ممکنه همچین اتفاق هایی بیفته؟!
تشکر استاد .
هم float و هم double هر دو شون ممیز شناور ئه، double دقت بیشتری داره اما به هر حال اونم ممیز شناور ئه.
این که در یک مثال نتیجه درست بگیرید معنی اش این نیست که ممیز شناور دقیق ئه، معنی اش اینه که دقت ممیز شناور برای اون مثال کفایت می کرده.
ذر اصل قضیه که ممیز شناور محاسبات تخمینی داره تاثیری نمیذاره.
C#:
            double a = 2.2f;
            MessageBox.Show(a.ToString());

C#:
            double a = 8.0 / 27.0;
            double b = 0.0;
            for (var i = 0; i < 27; i++)
            {
                b += a;
            }
            MessageBox.Show(b.ToString());
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
خیلی ممنون استاد .
BigInteger ، تبدیل ضمنی را پشتیبانی میکرد . چک نکردم :)
راستی استاد ، اندازه ی BigInteger چقدره؟
یعنی حداکثر تا چه عددی توش میشه ریخت . هر چند در سایتش نوشته که حداقل و حداکثر ، انگار نداره اما من دقیق متوجه نشدم . بالاخره تا یه جایی باید محدودیت داشته باشه هم اندازه اش و هم بنابراین مقدار عددی که قبول میکنه.
من sizeof را براش زدم اما ارور میداد .
راستی استاد کدهای جاوا را توی اون تاپیک نوشتید ، کد جاوا ، چقدر شبیه به کد سی شارپ هست! انگار اصلا توی سینتکس ، کوچیکترین فرقی ندارن!
بعد اینکه استاد ، چرا سی شارپ ، عملگری برای محاسبه ی توان (توان در ریاضی) نداره (فقط متد Math.Pow داره) اما لوا که قابلیت های بسیار ضعیفی در ریاضیات داره ، این عملگر را داره!


-----------------------------------------------


و یه چیز بسیار تعجب گرایانه برای من اینه که الان یه لینکی پیدا کردم که میگه یه چیزی بنام .Net Native داریم که همون کارایی زبان C++ Native را در . net framework ئه 4.5.1 و بالاتر (و انگار در ویندوز 10) ، ارائه میکنه . یعنی کدهای دات نت را دیگه به زبان IL و میانی ، کمپایل نمیکنه و مستقیما به کد زبان ماشین تبدیل میکنه :


من این همه خودمو پاره کردم گفتم ای کاش سی شارپ یه طراحی ای میکرد که کارایی اش شبیه C++ Native میبود (مثلا همین زبان میانی را نادیده میگرفت) ، یه چیزی درباره ی این .Net Native میگفتین ها :green:
البته از محدودیت هاش و اینکه چجوری بکار گرفته میشه و اینکه آیا همه ی قابلیت هایی که با .net framework ، در حالت عادی ای که میتونیم انجام بدیم را در اونجا هم میتونیم انجام بدیم یا نه را نمیدونم . فکر کنم مبحث خیلی جالبی باشه برای کسایی که بخوان با سی شارپ ، کارایی ای در حد C++ Native داشته باشن .
ان شاء ا... اگه شد ، در آینده بخونم .

--------------------------------------------

و اینکه استاد ، در پروژه ی پشتیبانگیرم (که از alphavss استفاده میکرد) ، با توجه به این موارد ، شما چه نسخه از دات نت فریم وورک را توصیه میکنید؟
چون میخوام از alphavss v2.0 استفاده کنم ، این نسخه ، با .net framework 4.5 یا بالاتر سازگاره (مگر اینکه پیشنهاد بدید که از نسخه ی قبلی alphavss استفاده کنم) .
همچنین در wpf ، میخوام از قابلیت و کلاسِ WindowChrome هم استفاده کنم که انگار بصورت رسمی ، از نسخه ی .net framework 4.5 اضافه شد .
و از اونجایی که .net Native انگار روی .net framework 4.5.1 و بالاتر میتونه فعال بشه ، برای اینکه شاید در نسخه های بعد ، از این .net native استفاده کنم ، پس حداقل نسخه ی .net framework 4.5.1 را انتخاب کنم ، چطوره؟
تشکر استاد . :rose:

سلامی مجدد
استاد ، میگم در پست زیر :

.

طرف میگه که نمیشه از .Net Native در پلتفرمی بجز uwp استفاده کرد (که گفت تا اونجایی که میدونه) . اما اون مطلبش واسه ی 3 سال پیش هست و قدیمی هه .

ولی مایکروسافت میگه برای استفاده از .Net Native در پروژه های .Net Framework (دیگه پلتفرم خاصی را نگفت) ، از روش زیر استفاده کنین (که نیاز به نسخه ی .Net Framework 4.6.2 یا بالاتر داره و همچنین به Microsoft.DotNet.Framework.NativeImageCompiler از Nuget) :


چیزی که مایکروسافت گفت ، درسته دیگه؟
بعد اینکه در لینک زیر هم نحوه ی استفاده از .Net Native در .Net Core هست . درست میگم؟ :


تشکر استاد .
 

the_king

مدیرکل انجمن
سلامی مجدد
استاد ، میگم در پست زیر :

.

طرف میگه که نمیشه از .Net Native در پلتفرمی بجز uwp استفاده کرد (که گفت تا اونجایی که میدونه) . اما اون مطلبش واسه ی 3 سال پیش هست و قدیمی هه .

ولی مایکروسافت میگه برای استفاده از .Net Native در پروژه های .Net Framework (دیگه پلتفرم خاصی را نگفت) ، از روش زیر استفاده کنین (که نیاز به نسخه ی .Net Framework 4.6.2 یا بالاتر داره و همچنین به Microsoft.DotNet.Framework.NativeImageCompiler از Nuget) :

من مستنداتی در سایت مایکروسافت ندیدم که NET Native. رو از نظر فنی محدود به UWP کرده باشه، ممکنه معرفی اش از UWP شروع شده باشه یا تنظیماتی برای استفاده راحت از NET. Native در UWP بوده که همچین نظری داده. در هر صورت خودم تجربه استفاده ازش رو ندارم که بخوام بر اساس تجربه ام نظری بدم.

چیزی که مایکروسافت گفت ، درسته دیگه؟
بعد اینکه در لینک زیر هم نحوه ی استفاده از .Net Native در .Net Core هست . درست میگم؟ :

بله.
 

SU-57

Active Member
سلام استاد علی

من در ساتی می خوندم حافظه کوتاه مدت اسنان 7 بیته. چون بیت ها فقط 0 و یک هست این 7 بیت دقیقا چقدر می شه از این لحاظ. (ببخشید به سی شارپ ربط نداره)

سوال دوم- توی بعضی نرم افزارها می بینم که روی فرم متنی نوشته شده ولی نه می شه انخابش کرد و نه می شه کپیش کرد. توی فرم و قسمت های مربوطه در سی شارپ کدوم گزینه ها رو غیر فعال می کنن که چنین اتفاقی بیفته. مثلا اگه گزینه ها رو فعال کنیم متن روی فرم رو بشه هم انتخاب و هم کپی کرد. مثلا این برنامه ای که میگم معلوم نیست این مطالب رو توی کدوم کنترل گذاشته ولی اسکرول عمودی بغلش داره

سوال سوم- الان مسیر من برای یادگیری سی شارپ باید به چه صورت باشه. مثلا سی شارپ، sql server ، و wpf
شما چه مسیری رو پیشنهاد می کنید که درست ترین مسیر باشه. هدفم ساختن برنامه های دسکتاپ و شاید نیاز باشه کاربر برای آپدیت برنامه نیاز باشه به اینترنت وصل باشه و برنامه یا پایگاه داده رو آپدیت کنه. این الان توی ذهنمه. فعلا این هدفمه که می خوام سی شارپ رو طبق اصول درست به ترتیب درست یاد بگیرم. لطفا از مقدماتی تا بالاترین سطح پیشرفته به ترتیب لیست کنید.
 
آخرین ویرایش:

the_king

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

من در ساتی می خوندم حافظه کوتاه مدت اسنان 7 بیته. چون بیت ها فقط 0 و یک هست این 7 بیت دقیقا چقدر می شه از این لحاظ. (ببخشید به سی شارپ ربط نداره)
بر اساس آزمایش هایی حدس میزنند که ظرفیت حافظه کوتاه مدت بین 5 الی 9 آیتم ئه، آیتم، نه بیت. شباهتی به بیت نداره.

سوال دوم- توی بعضی نرم افزارها می بینم که روی فرم متنی نوشته شده ولی نه می شه انخابش کرد و نه می شه کپیش کرد. توی فرم و قسمت های مربوطه در سی شارپ کدوم گزینه ها رو غیر فعال می کنن که چنین اتفاقی بیفته. مثلا اگه گزینه ها رو فعال کنیم متن روی فرم رو بشه هم انتخاب و هم کپی کرد. مثلا این برنامه ای که میگم معلوم نیست این مطالب رو توی کدوم کنترل گذاشته ولی اسکرول عمودی بغلش داره
روش های مختلفی وجود داره، فقط یک مثال ساده بزنم، یک Panel رو تصور کنید که AutoScroll اش true ئه و داخلش یک Label هست با AutoSize ئه false و یک متن طولانی که ابعاد Label از Panel فراتر رفته و به این خاطر Scroll Bar های Panel نمایش داده میشه.

سوال سوم- الان مسیر من برای یادگیری سی شارپ باید به چه صورت باشه. مثلا سی شارپ، sql server ، و wpf
شما چه مسیری رو پیشنهاد می کنید که درست ترین مسیر باشه. هدفم ساختن برنامه های دسکتاپ و شاید نیاز باشه کاربر برای آپدیت برنامه نیاز باشه به اینترنت وصل باشه و برنامه یا پایگاه داده رو آپدیت کنه. این الان توی ذهنمه. فعلا این هدفمه که می خوام سی شارپ رو طبق اصول درست به ترتیب درست یاد بگیرم. لطفا از مقدماتی تا بالاترین سطح پیشرفته به ترتیب لیست کنید.
همچین مسیری وجود نداره، یادگیری #C چه در سطح مبتدی یا پیشرفته ربطی به SQL Server یا WPF نداره. چیزی رو یادبگیرید که الان بهش نیاز دارید، فقط همین. مسیری از پایین کوه تا قله وجود نداره که بخواهید طی کنید، قله ای وجود نداره، دنیای برنامه نویسی انتها نداره.

مثلا شما الان ممکنه بخواهید با پایگاه داده های تحت SQL Server کار کنید، پس باید SQL و نحوه ارتباط با SQL Server رو در NET. یادبگیرید. یا اصلا با SQL Server کار نکنید و هیچوقت یادش نگیرید، ربطی به این نداره که #C رو بلد هستید یا نه یا مبتدی هستید یا حرفه ای.

WPF یک پلتفرم واسط کاربری ئه، همونطور که Windows Forms هم پلتفرم واسط کاربری ئه. ربطی به زبان برنامه نویسی خاصی نداره، شما اگر بخواهید برنامه ای با واسط کاربری WPF بسازید WPF رو یاد می گیرید، اما اگر بخواهید فرضا فقط از واسط کاربری Windows Forms در برنامه هاتون استفاده کنید هیچوقت نیازی به یادگیری WPF پیدا نمی کنید. اگر WPF رو یاد بگیرید در #C پیشرفت نکرده اید، یک پلتفرم جدید رو یادگرفته اید.
شما ممکنه یک برنامه نویس مسلط به #C باشید ولی هیچکدوم از اینها رو یاد نگرفته باشید، اینها مستقل از زبان برنامه نویسی هستند.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد استاد
خیلی ممنون
استاد ، در کد زیر ، وقتی از کلمه ی yield (با return اش) استفاده میکنیم :

C#:
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            IEnumerable<int> collection = this.YieldMethod();
            foreach (int item in collection)
            {
                MessageBox.Show(item.ToString());
            }
        }
        
        
        private IEnumerable<int> YieldMethod()
        {
            string testExit = "test";
            if (testExit == null)
                yield break;

            yield return 10;
            yield return 50;
            yield return 70;
        }

در حلقه ای که اون متدی که درونش از yield استفاده شد را فراخونی میکنیم (مثل حلقه ی foreach در کد بالا) :
1) دیگه این حلقه ی foreach ، مثل حلقه های foreach ئه معمولی نیست که به تعداد اعضای collection اش تکرار بشه بلکه اون قدر تکرار میشه که متدی که در اون از yield استفاده شده ، به خط آخرش برسه .
درست میگم؟

2) وقتی هم که از yield استفاده میکنیم ، هر وقت به return اش رسید ، موقتا از متد خارج میشه و در اجرای بعدی توسط حلقه (که این متد را اجرا کرد) (حلقه ی foreach ئه بالا ، هر بار این متد را اجرا میکنه) ، خطِ بعدیِ آخرین yield ای که دفعه ی قبل اجرا شده بود ، اجرا میشه .
درسته؟

3) و چون در متدی که از yield استفاده کردیم ، نمیتونیم از return (بصورت تکی و خالی مثل متدهای معمولی) استفاده کنیم ، اگه قصد خروج از اون متد را داشتیم تا دیگه ادامه ی کدهای اون متد اجرا نشه (مثل زمانی که return ئه خالی در متدهای معمولی میذاشتیم) ، در این نوع متدها باید از فقط کلمه ی yield break استفاده کنیم (با اونکه مقدار IEnumerable<int> را برمیگردونه ، نباید بعد از yield break ، چیزی را برگردونیم) .
درسته؟

4) چرا نوع خروجیِ متدی که درون اون متد ، از yield استفاده شده را نمیشه از نوعِ کلاس هایی گرفت که اینترفیسِ IEnumerable<T> یا IEnumerable را پیاده سازی کردن و فقط انگار میشه نوع خروجی این متد را از IEnumerable گرفت؟
مثلا نوع خروجی List<T> را گیر میده . در حالی که List<T> که خودش IEnumerable<T> را پیاده سازی کرده که!
تشکر استاد :rose:
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد استاد
خیلی ممنون
استاد ، در کد زیر ، وقتی از کلمه ی yield (با return اش) استفاده میکنیم :

C#:
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            IEnumerable<int> collection = this.YieldMethod();
            foreach (int item in collection)
            {
                MessageBox.Show(item.ToString());
            }
        }
       
       
        private IEnumerable<int> YieldMethod()
        {
            string testExit = "test";
            if (testExit == null)
                yield break;

            yield return 10;
            yield return 50;
            yield return 70;
        }

در حلقه ای که اون متدی که درونش از yield استفاده شد را فراخونی میکنیم (مثل حلقه ی foreach در کد بالا) :
1) دیگه این حلقه ی foreach ، مثل حلقه های foreach ئه معمولی نیست که به تعداد اعضای collection اش تکرار بشه بلکه اون قدر تکرار میشه که متدی که در اون از yield استفاده شده ، به خط آخرش برسه .
درست میگم؟

2) وقتی هم که از yield استفاده میکنیم ، هر وقت به return اش رسید ، موقتا از متد خارج میشه و در اجرای بعدی توسط حلقه (که این متد را اجرا کرد) (حلقه ی foreach ئه بالا ، هر بار این متد را اجرا میکنه) ، خطِ بعدیِ آخرین yield ای که دفعه ی قبل اجرا شده بود ، اجرا میشه .
درسته؟

3) و چون در متدی که از yield استفاده کردیم ، نمیتونیم از return (بصورت تکی و خالی مثل متدهای معمولی) استفاده کنیم ، اگه قصد خروج از اون متد را داشتیم تا دیگه ادامه ی کدهای اون متد اجرا نشه (مثل زمانی که return ئه خالی در متدهای معمولی میذاشتیم) ، در این نوع متدها باید از فقط کلمه ی yield break استفاده کنیم (با اونکه مقدار IEnumerable<int> را برمیگردونه ، نباید بعد از yield break ، چیزی را برگردونیم) .
درسته؟

4) چرا نوع خروجیِ متدی که درون اون متد ، از yield استفاده شده را نمیشه از نوعِ کلاس هایی گرفت که اینترفیسِ IEnumerable<T> یا IEnumerable را پیاده سازی کردن و فقط انگار میشه نوع خروجی این متد را از IEnumerable گرفت؟
مثلا نوع خروجی List<T> را گیر میده . در حالی که List<T> که خودش IEnumerable<T> را پیاده سازی کرده که!
تشکر استاد :rose:

سلامی مجدد
استاد ، بی زحمت ، جواب اینو میدین؟
تشکر
 

the_king

مدیرکل انجمن
سلامی مجدد استاد
خیلی ممنون
استاد ، در کد زیر ، وقتی از کلمه ی yield (با return اش) استفاده میکنیم :

C#:
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            IEnumerable<int> collection = this.YieldMethod();
            foreach (int item in collection)
            {
                MessageBox.Show(item.ToString());
            }
        }
       
       
        private IEnumerable<int> YieldMethod()
        {
            string testExit = "test";
            if (testExit == null)
                yield break;

            yield return 10;
            yield return 50;
            yield return 70;
        }

در حلقه ای که اون متدی که درونش از yield استفاده شد را فراخونی میکنیم (مثل حلقه ی foreach در کد بالا) :
1) دیگه این حلقه ی foreach ، مثل حلقه های foreach ئه معمولی نیست که به تعداد اعضای collection اش تکرار بشه بلکه اون قدر تکرار میشه که متدی که در اون از yield استفاده شده ، به خط آخرش برسه .
درست میگم؟
فرقی بین ایندو نیست، foreach روالش تغییر نکرده. اینکه در مورد یک مجموعه Enumerator به تعداد اعضاء مقدار برمیگردونه مربوط به خود Enumerator اون مجموعه است، نه foreach

2) وقتی هم که از yield استفاده میکنیم ، هر وقت به return اش رسید ، موقتا از متد خارج میشه و در اجرای بعدی توسط حلقه (که این متد را اجرا کرد) (حلقه ی foreach ئه بالا ، هر بار این متد را اجرا میکنه) ، خطِ بعدیِ آخرین yield ای که دفعه ی قبل اجرا شده بود ، اجرا میشه .
درسته؟
اون بخش که نوشتید "موقتا از متد خارج میشه" درست نیست. نه تنها موقتا از متد خارج نمیشه، بلکه کلا ازش خارج نمیشه. اگر قرار بود ازش خارج بشه که مقدار متغیر های محلی نمیتوانستند آخرین وضعیت خودشون رو حفظ کنند. داخل متد میمونه. توضیحات yield رو بخونید.

3) و چون در متدی که از yield استفاده کردیم ، نمیتونیم از return (بصورت تکی و خالی مثل متدهای معمولی) استفاده کنیم ، اگه قصد خروج از اون متد را داشتیم تا دیگه ادامه ی کدهای اون متد اجرا نشه (مثل زمانی که return ئه خالی در متدهای معمولی میذاشتیم) ، در این نوع متدها باید از فقط کلمه ی yield break استفاده کنیم (با اونکه مقدار IEnumerable<int> را برمیگردونه ، نباید بعد از yield break ، چیزی را برگردونیم) .
درسته؟
با اجرا شدن yield break از متد خارج میشه، اما اینکه بعد از یک yield break شرطی yield return های دیگری باشه که در صورت عدم برقراری شرط اجرا بشن مشکلی نداره.


4) چرا نوع خروجیِ متدی که درون اون متد ، از yield استفاده شده را نمیشه از نوعِ کلاس هایی گرفت که اینترفیسِ IEnumerable<T> یا IEnumerable را پیاده سازی کردن و فقط انگار میشه نوع خروجی این متد را از IEnumerable گرفت؟
مثلا نوع خروجی List<T> را گیر میده . در حالی که List<T> که خودش IEnumerable<T> را پیاده سازی کرده که!
وقتی شما نوع خروجی متدی رو <List<T تعریف می کنید باید null یا یک شیء سازگار با <List<T برگردونده بشه، yield که شیء List نمیسازه.
خروجی اون متد یا باید از نوع <List<T باشه یا از نوع وارث اش.
اینکه در پیاده سازی یک اینترفیس مشترک باشند که دلیل سازگاری نمیشه. مثلا انواع داده ناسازگاری داریم که همه شون System.IDisposable رو پیاده سازی کردن ولی هیچ شباهتی به هم ندارند. نمیشه که یک شیء رو بخاطر اینکه IEnumerable ئه به یک نوع داده دیگه که اونم IEnumerable ئه تحویل داد.
 

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

بالا