🪄 جادوی اعداد در #C :
نوشتن اعداد مثل یک حرفهای (Literals, Suffixes & More)
فکر میکنی نوشتن 1000 تو سیشارپ همیشه به معنی int هست؟ یا چطور به کامپایلر بفهمونیم منظورمون یه عدد decimalئه نه double؟
اینا جزئیات و "فوت کوزهگری" هستن که فرق کدنویس معمولی و حرفهای رو مشخص میکنه. بزن بریم این ترفندها رو یاد بگیریم!
👓 خوانایی کد با لیترالهای حرفهای
نوشتن اعداد، فقط مقدارشون نیست؛ خوانایی هم مهمه!
جداکننده ارقام (_): برای اعداد بزرگ، میتونید از آندرلاین برای جدا کردن ارقام و خوانایی بیشتر استفاده کنید. کامپایلر این آندرلاینها رو نادیده میگیره.
مبنای شانزده (Hexadecimal): با پیشوند 0x، میتونید اعداد رو در مبنای ۱۶ بنویسید. این برای کار با رنگها، فلگها و عملیات سطح پایین خیلی کاربردیه.
مبنای دو (Binary): با پیشوند 0b، میتونید مستقیماً عدد رو به صورت باینری وارد کنید.
🏷 پسوندها (Suffixes): تعیین تکلیف برای کامپایلر!
بعضی وقتا کامپایلر خودش نوع عدد رو حدس میزنه (که بهش میگیم Type Inference)، ولی گاهی ما باید حرف آخر رو بزنیم! اینجاست که پسوندها وارد میشن.
مهمترینهاشون اینان:
اگه این پسوند رو نذارید، کامپایلر عدد اعشاری شما رو double در نظر میگیره و کدتون خطا میده چون double به راحتی به float تبدیل نمیشه.
این یکی فوقالعاده مهمه. برای تمام محاسبات مالی و پولی، باید از decimal استفاده کنید و برای مقداردهی بهش، حتماً از پسوند M استفاده کنید.
این پسوندها کمتر ضروری هستن، چون معمولاً کامپایلر میتونه نوعشون رو حدس بزنه یا به صورت خودکار تبدیل کنه. ولی خوبه که بدونید وجود دارن.
❓ شما چطور اعداد رو مینویسید؟
اینا فقط یه سری قاعده خشک و خالی نیستن، ابزارهایی برای نوشتن کد دقیقتر و خواناتر هستن.
نوشتن اعداد مثل یک حرفهای (Literals, Suffixes & More)
فکر میکنی نوشتن 1000 تو سیشارپ همیشه به معنی int هست؟ یا چطور به کامپایلر بفهمونیم منظورمون یه عدد decimalئه نه double؟
اینا جزئیات و "فوت کوزهگری" هستن که فرق کدنویس معمولی و حرفهای رو مشخص میکنه. بزن بریم این ترفندها رو یاد بگیریم!
👓 خوانایی کد با لیترالهای حرفهای
نوشتن اعداد، فقط مقدارشون نیست؛ خوانایی هم مهمه!
جداکننده ارقام (_): برای اعداد بزرگ، میتونید از آندرلاین برای جدا کردن ارقام و خوانایی بیشتر استفاده کنید. کامپایلر این آندرلاینها رو نادیده میگیره.
int bigNumber = 1_000_000; // خیلی خواناتر از 1000000
var binaryData = 0b1010_1011_1100;
مبنای شانزده (Hexadecimal): با پیشوند 0x، میتونید اعداد رو در مبنای ۱۶ بنویسید. این برای کار با رنگها، فلگها و عملیات سطح پایین خیلی کاربردیه.
int redColor = 0xFF0000;
مبنای دو (Binary): با پیشوند 0b، میتونید مستقیماً عدد رو به صورت باینری وارد کنید.
var filePermissions = 0b110_110_100; // rwx-wx--
🏷 پسوندها (Suffixes): تعیین تکلیف برای کامپایلر!
بعضی وقتا کامپایلر خودش نوع عدد رو حدس میزنه (که بهش میگیم Type Inference)، ولی گاهی ما باید حرف آخر رو بزنیم! اینجاست که پسوندها وارد میشن.
مهمترینهاشون اینان:
F برای float
اگه این پسوند رو نذارید، کامپایلر عدد اعشاری شما رو double در نظر میگیره و کدتون خطا میده چون double به راحتی به float تبدیل نمیشه.
// float f = 4.5; // ❌ کامپایل نمیشه!
float f = 4.5F; // ✅ درسته!
M برای decimal
این یکی فوقالعاده مهمه. برای تمام محاسبات مالی و پولی، باید از decimal استفاده کنید و برای مقداردهی بهش، حتماً از پسوند M استفاده کنید.
// decimal balance = 100.99; // ❌ کامپایل نمیشه!
decimal balance = 100.99M; // ✅ درسته!
L برای long و U برای unsigned
این پسوندها کمتر ضروری هستن، چون معمولاً کامپایلر میتونه نوعشون رو حدس بزنه یا به صورت خودکار تبدیل کنه. ولی خوبه که بدونید وجود دارن.
long bigNum = 9_000_000_000L; // با L بهش میگیم این یه عدد خیلی بزرگه
❓ شما چطور اعداد رو مینویسید؟
اینا فقط یه سری قاعده خشک و خالی نیستن، ابزارهایی برای نوشتن کد دقیقتر و خواناتر هستن.
🔖 هشتگها :
#CSharp
#CodingTips
#Literals
🎲 قوانین بازی با اعداد در #C :
تا حالا فکر کردید وقتی یه int رو توی یه long میریزید، یا یه double رو به زور تو یه int جا میدید، پشت صحنه چه اتفاقی میفته؟
این تبدیلها (Conversions) قوانین خودشون رو دارن و ندونستن این قوانین، میتونه به از دست رفتن داده و باگهای وحشتناک ختم بشه. بزن بریم این قوانین رو یک بار برای همیشه یاد بگیریم.
این تبدیلها مثل ریختن آب از یه لیوان کوچیک تو یه سطل بزرگه؛ کاملاً امن، بدون دردسر و بدون از دست رفتن حتی یک قطره آب!
وقتی نوع داده مقصد، گنجایش تمام مقادیر ممکن در نوع داده مبدأ رو داشته باشه، #C خودش هوشمندانه و به صورت خودکار این تبدیل رو انجام میده.
اینجا دیگه سیشارپ به شما اجازه نمیده این کار رو خودکار انجام بدید. شما باید با مسئولیت خودتون و با استفاده از Casting (قرار دادن نوع مقصد داخل پرانتز)، به کامپایلر بگید: "میدونم دارم چیکار میکنم و ریسکش رو میپذیرم!"
💣 دو تله مرگبار در تبدیلهای صریح
وقتی کست میکنید، حواستون به این دوتا تله باشه:
بریده شدن اعشار (Truncation):
وقتی یه عدد اعشاری (double یا float) رو به یه عدد صحیح (int) کست میکنید، بخش اعشاری عدد گرد نمیشه، بلکه وحشیانه بریده و حذف میشه!
از دست رفتن دقت (Precision Loss):
گاهی اوقات، حتی در تبدیلهای امن (مثل int به float)، ممکنه دقت رو از دست بدید. float میتونه اعداد خیلی بزرگتری رو نشون بده، ولی دقتش در جزئیات کمتر از int هست.
همه چیز درباره تبدیلهای عددی (Casting)
تا حالا فکر کردید وقتی یه int رو توی یه long میریزید، یا یه double رو به زور تو یه int جا میدید، پشت صحنه چه اتفاقی میفته؟
این تبدیلها (Conversions) قوانین خودشون رو دارن و ندونستن این قوانین، میتونه به از دست رفتن داده و باگهای وحشتناک ختم بشه. بزن بریم این قوانین رو یک بار برای همیشه یاد بگیریم.
✅ نوع اول: تبدیلهای امن و ضمنی (Implicit)
این تبدیلها مثل ریختن آب از یه لیوان کوچیک تو یه سطل بزرگه؛ کاملاً امن، بدون دردسر و بدون از دست رفتن حتی یک قطره آب!
وقتی نوع داده مقصد، گنجایش تمام مقادیر ممکن در نوع داده مبدأ رو داشته باشه، #C خودش هوشمندانه و به صورت خودکار این تبدیل رو انجام میده.
int myInt = 12345;
// int (32-bit) به راحتی در long (64-bit) جا میشه
long myLong = myInt;
// int (عدد صحیح) به راحتی به double (عدد اعشاری) تبدیل میشه
double myDouble = myInt;
float myFloat = 123.45F;
// float (32-bit) به راحتی در double (64-bit) جا میشه
double anotherDouble = myFloat;
⚠️ نوع دوم: تبدیلهای خطرناک و صریح (Explicit Casting)حالا برعکسش رو تصور کنید: میخواید آب یه سطل بزرگ رو تو یه لیوان کوچیک جا بدید. احتمال اینکه آب سرریز بشه و بخشی ازش از دست بره، خیلی زیاده!
اینجا دیگه سیشارپ به شما اجازه نمیده این کار رو خودکار انجام بدید. شما باید با مسئولیت خودتون و با استفاده از Casting (قرار دادن نوع مقصد داخل پرانتز)، به کامپایلر بگید: "میدونم دارم چیکار میکنم و ریسکش رو میپذیرم!"
long bigNum = 3_000_000_000L;
double myDouble = 12345.6789;
// برای جا دادن long در int، باید کست کنیم
// اگه عدد بزرگ باشه، داده از دست میره!
int myInt = (int)bigNum;
// برای جا دادن double در int، باید کست کنیم
int anotherInt = (int)myDouble; // مقدارش میشه 12345
💣 دو تله مرگبار در تبدیلهای صریح
وقتی کست میکنید، حواستون به این دوتا تله باشه:
بریده شدن اعشار (Truncation):
وقتی یه عدد اعشاری (double یا float) رو به یه عدد صحیح (int) کست میکنید، بخش اعشاری عدد گرد نمیشه، بلکه وحشیانه بریده و حذف میشه!
double price = 99.99;
int priceAsInt = (int)price; // مقدارش میشه 99، نه 100!
از دست رفتن دقت (Precision Loss):
گاهی اوقات، حتی در تبدیلهای امن (مثل int به float)، ممکنه دقت رو از دست بدید. float میتونه اعداد خیلی بزرگتری رو نشون بده، ولی دقتش در جزئیات کمتر از int هست.
int bigInt = 100_000_001;
// اینجا مقدار حفظ میشه، ولی دقت از بین میره
float myFloat = bigInt;
// وقتی برمیگردونیم، میبینیم که عدد تغییر کرده!
int convertedInt = (int)myFloat; // مقدارش میشه 100_000_000
🔖 هشتگها :
#CSharp
#CodingTips
#Casting
✅ راه حل: پس چطور NaN رو چک کنیم؟
راه درست و تنها راه مطمئن برای چک کردن NaN، استفاده از متدهای استاتیک double.IsNaN() یا float.IsNaN() هست.
🤔 حرف حساب و تجربه شما
درک این مقادیر ویژه، شما رو از خیلی از باگهای محاسباتی پنهان نجات میده.
شما تا حالا تو محاسباتتون به Infinity یا NaN برخوردید؟ یا از تله مقایسه NaN خبر داشتید؟ این رفتار عجیب اعداد اعشاری کجا به کارتون اومده یا براتون دردسر ساخته؟
تجربههاتون رو کامنت کنید! 👇
راه درست و تنها راه مطمئن برای چک کردن NaN، استفاده از متدهای استاتیک double.IsNaN() یا float.IsNaN() هست.
double result = 0.0 / 0.0;
// روش اشتباه
if (result == double.NaN) { /* این کد هرگز اجرا نمیشه */ }
// روش درست
if (double.IsNaN(result))
{
Console.WriteLine("The result is indeed NaN!");
}
🤔 حرف حساب و تجربه شما
درک این مقادیر ویژه، شما رو از خیلی از باگهای محاسباتی پنهان نجات میده.
شما تا حالا تو محاسباتتون به Infinity یا NaN برخوردید؟ یا از تله مقایسه NaN خبر داشتید؟ این رفتار عجیب اعداد اعشاری کجا به کارتون اومده یا براتون دردسر ساخته؟
تجربههاتون رو کامنت کنید! 👇
🔖 هشتگها :
#CSharp
#CodingTips
#DotNet
#FloatingPoint
#NaN
bool فقط یک نام مستعاره!
مثل بقیه انواع داده پیشساخته، کلمه کلیدی bool در #C فقط یک نام مستعار (alias) ساده و راحت برای نوع داده اصلی در فریمورک داتنت یعنی System.Boolean هست.
این دو خط کد، در نهایت یک کار یکسان رو انجام میدن:
bool b1 = true;
System.Boolean b2 = true; // این همون بالاییه، فقط با اسم کاملش!
حرف آخر:
پس یادتون باشه: bool یه نوع منطقی خالصه، نه یه عدد. در حافظه یه بایت جا میگیره و فقط یه نام مستعار برای System.Boolean هست!
🔖 هشتگها :
#CSharp
#QuickTip
#DotNet
#Boolean
#CodingTips
🛠 نوشتن string مثل یک حرفهای:
در سیشارپ، فقط یک راه برای نوشتن رشتهها وجود نداره. ابزارهای مختلفی در اختیار ماست که هر کدوم برای یه سناریوی خاص، بهترین انتخابه. تسلط بر این ابزارها، کد شما رو نه تنها خواناتر، که حرفهایتر هم میکنه.
1️⃣ روش کلاسیک: دردسرهای Escape Sequence (\)
این روش سنتیترین راهه. برای رشتههای ساده خوبه، ولی وقتی پای کاراکترهای خاص مثل بکاسلش (\) یا کوتیشن (") وسط بیاد، کد شما به سرعت زشت و ناخوانا میشه.
به خصوص برای مسیر فایلها در ویندوز، این روش یه کابوس واقعیه!
2️⃣ راه حل تمیز: Verbatim Literals (@)
اینجاست که @ مثل یه قهرمان وارد میشه! با گذاشتن یه @ قبل از رشته، شما به کامپایلر میگید: "هرچیزی که داخل این رشته هست رو دقیقاً همونطور که هست در نظر بگیر و هیچ کاراکتری رو escape نکن."
این قابلیت دو تا مزیت بزرگ داره:
مسیرهای خوانا:
متنهای چند خطی:
میتونید به راحتی و بدون نیاز به \n، متنهای چند خطی بنویسید.
3️⃣ قدرت مدرن: Raw String Literals ("""...""") (از C# 11 به بعد)
این جدیدترین و قدرتمندترین ابزار ماست که برای حل مشکلات کار با JSON، XML، HTML یا هر متن پیچیدهای طراحی شده.
رشته رو بین سه تا (یا بیشتر) دابل کوتیشن میذارید و دیگه هیچ نیازی به هیچگونه escape کردنی ندارید. حتی لازم نیست " رو دو بار بنویسید!
این قابلیت، کد شما رو به شکل چشمگیری تمیزتر و قابل نگهداریتر میکنه، به خصوص وقتی با متنهای ساختاریافته سر و کار دارید.
🤔 حرف حساب و ابزار شما
هر کدوم از این ابزارها، برای یه کاری ساخته شدن.
●برای رشتههای ساده ⟵ روش کلاسیک
●برای مسیر فایل و متنهای چند خطی ⟵ Verbatim (@)
●برای JSON، XML و متنهای پیچیده ⟵ Raw String (""")
شما از کدوم یکی از این روشها بیشتر استفاده میکنید؟ آیا از طرفدارای Raw String Literals جدید هستید یا هنوز با @ کارتون راه میفته؟
در سیشارپ، فقط یک راه برای نوشتن رشتهها وجود نداره. ابزارهای مختلفی در اختیار ماست که هر کدوم برای یه سناریوی خاص، بهترین انتخابه. تسلط بر این ابزارها، کد شما رو نه تنها خواناتر، که حرفهایتر هم میکنه.
1️⃣ روش کلاسیک: دردسرهای Escape Sequence (\)
این روش سنتیترین راهه. برای رشتههای ساده خوبه، ولی وقتی پای کاراکترهای خاص مثل بکاسلش (\) یا کوتیشن (") وسط بیاد، کد شما به سرعت زشت و ناخوانا میشه.
به خصوص برای مسیر فایلها در ویندوز، این روش یه کابوس واقعیه!
// هر \ باید دو بار نوشته بشه!
string classicPath = "C:\\Users\\MyUser\\Documents\\file.txt";
2️⃣ راه حل تمیز: Verbatim Literals (@)
اینجاست که @ مثل یه قهرمان وارد میشه! با گذاشتن یه @ قبل از رشته، شما به کامپایلر میگید: "هرچیزی که داخل این رشته هست رو دقیقاً همونطور که هست در نظر بگیر و هیچ کاراکتری رو escape نکن."
این قابلیت دو تا مزیت بزرگ داره:
مسیرهای خوانا:
// همون مسیر فایل، ولی تمیز و خوانا!
string verbatimPath = @"C:\Users\MyUser\Documents\file.txt";
متنهای چند خطی:
میتونید به راحتی و بدون نیاز به \n، متنهای چند خطی بنویسید.
string multiLine = @"این
یک متن
چند خطی است.";
نکته: برای استفاده از " داخل رشته @، کافیه دو بار بنویسیدش:
@"<tag id=""123"">"
3️⃣ قدرت مدرن: Raw String Literals ("""...""") (از C# 11 به بعد)
این جدیدترین و قدرتمندترین ابزار ماست که برای حل مشکلات کار با JSON، XML، HTML یا هر متن پیچیدهای طراحی شده.
رشته رو بین سه تا (یا بیشتر) دابل کوتیشن میذارید و دیگه هیچ نیازی به هیچگونه escape کردنی ندارید. حتی لازم نیست " رو دو بار بنویسید!
string json = """
{
"Name" : "C# Geeks",
"Quote" : "We write clean code!",
"Path" : "C:\Temp\Data.json"
}
""";
این قابلیت، کد شما رو به شکل چشمگیری تمیزتر و قابل نگهداریتر میکنه، به خصوص وقتی با متنهای ساختاریافته سر و کار دارید.
🤔 حرف حساب و ابزار شما
هر کدوم از این ابزارها، برای یه کاری ساخته شدن.
●برای رشتههای ساده ⟵ روش کلاسیک
●برای مسیر فایل و متنهای چند خطی ⟵ Verbatim (@)
●برای JSON، XML و متنهای پیچیده ⟵ Raw String (""")
شما از کدوم یکی از این روشها بیشتر استفاده میکنید؟ آیا از طرفدارای Raw String Literals جدید هستید یا هنوز با @ کارتون راه میفته؟
🔖 هشتگها :
#CSharp
#String
#CodingTips
✨ خلاصهنویسی آرایهها در #C :
کدنویسی فقط کار کردن کد نیست؛ زیبا، خوانا و مدرن بودنش هم مهمه. تو #C راههای زیادی برای خلاصهنویسی و تمیزتر کردن کد وجود داره.
امروز میخوایم چند تا از بهترین تکنیکها برای تعریف و مقداردهی آرایهها رو یاد بگیریم که کد شما رو یه لول بالاتر میبره.
1️⃣روش اول:
وقتی میخواید یه آرایه رو همزمان با تعریفش مقداردهی کنید، نیازی نیست همیشه از new و نوع داده کامل استفاده کنید. میتونید اونها رو حذف کنید تا کدتون خلاصهتر بشه:
2️⃣ورود var:
کلمه کلیدی var به کامپایلر میگه: "من نوع این متغیر رو نمینویسم، خودت از روی مقداری که بهش میدم، نوعش رو تشخیص بده!".
این قابلیت کد رو خیلی کوتاهتر میکنه و برخلاف جاوااسکریپت، متغیر شما هنوز هم Strongly-Typed هست؛ یعنی نوعش در زمان کامپایل مشخص و ثابت میشه.
3️⃣ترکیب طلایی:
حالا میتونیم این دو قابلیت رو با هم ترکیب کنیم تا به مدرنترین و تمیزترین روش برای تعریف آرایه برسیم.
وقتی از var استفاده میکنید، باید کلمه new رو بیارید، ولی دیگه لازم نیست نوع آرایه رو مشخص کنید. کامپایلر خودش از روی عناصر داخل آکولاد، نوع آرایه رو تشخیص میده.
نکته حرفهای: اگه عناصر آرایه از چند نوع عددی مختلف باشن، کامپایلر سعی میکنه "بهترین نوعی" که همه عناصر بهش قابل تبدیل هستن رو پیدا کنه:
استفاده از var و این تکنیکهای خلاصهنویسی، کد شما رو مدرنتر و خواناتر میکنه، هرچند بعضی برنامهنویسها هنوز ترجیح میدن نوع رو به صورت صریح بنویسن تا خوانایی در نگاه اول بیشتر باشه.
شما تو کدهاتون چقدر از var استفاده میکنید؟ آیا طرفدارش هستید یا ترجیح میدید همیشه نوع متغیر رو به صورت صریح مشخص کنید؟ دلیلش چیه؟
نظراتتون رو کامنت کنید! 👇
[@CSharpGeeksChat]
تکنیکهای var و مقداردهی اولیه
کدنویسی فقط کار کردن کد نیست؛ زیبا، خوانا و مدرن بودنش هم مهمه. تو #C راههای زیادی برای خلاصهنویسی و تمیزتر کردن کد وجود داره.
امروز میخوایم چند تا از بهترین تکنیکها برای تعریف و مقداردهی آرایهها رو یاد بگیریم که کد شما رو یه لول بالاتر میبره.
1️⃣روش اول:
حذف اضافات در مقداردهی اولیه ✂️
وقتی میخواید یه آرایه رو همزمان با تعریفش مقداردهی کنید، نیازی نیست همیشه از new و نوع داده کامل استفاده کنید. میتونید اونها رو حذف کنید تا کدتون خلاصهتر بشه:
// به جای: new char[] {'a','e','i','o','u'}
char[] vowels = {'a','e','i','o','u'};
// این روش برای آرایههای چندبعدی هم کار میکنه
int[,] rectangularMatrix =
{
{0,1,2},
{3,4,5},
{6,7,8}
};2️⃣ورود var:
قدرت استنتاج نوع (Type Inference) 🤖
کلمه کلیدی var به کامپایلر میگه: "من نوع این متغیر رو نمینویسم، خودت از روی مقداری که بهش میدم، نوعش رو تشخیص بده!".
این قابلیت کد رو خیلی کوتاهتر میکنه و برخلاف جاوااسکریپت، متغیر شما هنوز هم Strongly-Typed هست؛ یعنی نوعش در زمان کامپایل مشخص و ثابت میشه.
// کامپایلر میفهمه که i از نوع int هست
var i = 10;
// کامپایلر میفهمه که name از نوع string هست
var name = "#C Geeks";
3️⃣ترکیب طلایی:
var + مقداردهی اولیه آرایه 🏆
حالا میتونیم این دو قابلیت رو با هم ترکیب کنیم تا به مدرنترین و تمیزترین روش برای تعریف آرایه برسیم.
وقتی از var استفاده میکنید، باید کلمه new رو بیارید، ولی دیگه لازم نیست نوع آرایه رو مشخص کنید. کامپایلر خودش از روی عناصر داخل آکولاد، نوع آرایه رو تشخیص میده.
// کامپایلر از روی عناصر، نوع char[] رو استنتاج میکنه
var vowels = new[] {'a','e','i','o','u'};
// برای آرایههای چندبعدی هم به همین شکل
var matrix = new[,]
{
{0,1,2},
{3,4,5}
};
نکته حرفهای: اگه عناصر آرایه از چند نوع عددی مختلف باشن، کامپایلر سعی میکنه "بهترین نوعی" که همه عناصر بهش قابل تبدیل هستن رو پیدا کنه:
// اینجا ۱ یک int و دومی یک long است.
// کامپایلر نوع long[] رو برای کل آرایه انتخاب میکنه
var numbers = new[] {1, 10_000_000_000L};
🤔 حرف حساب و استایل شما
استفاده از var و این تکنیکهای خلاصهنویسی، کد شما رو مدرنتر و خواناتر میکنه، هرچند بعضی برنامهنویسها هنوز ترجیح میدن نوع رو به صورت صریح بنویسن تا خوانایی در نگاه اول بیشتر باشه.
شما تو کدهاتون چقدر از var استفاده میکنید؟ آیا طرفدارش هستید یا ترجیح میدید همیشه نوع متغیر رو به صورت صریح مشخص کنید؟ دلیلش چیه؟
نظراتتون رو کامنت کنید! 👇
[@CSharpGeeksChat]
🔖 هشتگها :
#CSharp
#Var
#CodingTips
#CleanCode
🐣 مقادیر پیشفرض (Default Values) در #C :
هر متغیر با چه مقداری متولد میشود؟
تو پست "سیاست تخصیص قطعی" دیدیم که فیلدهای یک کلاس و عناصر یک آرایه به صورت خودکار مقداردهی اولیه میشن. اما سوال اینجاست: چه مقداری؟ این مقادیر از کجا میان؟
جواب تو یه مفهوم ساده به اسم مقدار پیشفرض (Default Value) هست.
هر نوع دادهای در #C یک مقدار پیشفرض داره که حاصل صفر کردن بیتهای حافظه (Bitwise Zeroing) هست. این یعنی:
●تمام Reference Typeها (کلاس، string، آرایه، ...): مقدار پیشفرضشون null هست.
●تمام Numeric Typeها (int, double, decimal, ...): مقدار پیشفرضشون 0 هست.
●نوع bool: مقدار پیشفرصش false هست.
●نوع char: مقدار پیشفرصش '\0' (کاراکتر نال) هست.
سیشارپ یه کلمه کلیدی شیک و کاربردی به اسم default در اختیار ما میذاره تا بتونیم مقدار پیشفرض هر نوعی رو به راحتی بدست بیاریم، بدون اینکه نیازی به حفظ کردنشون داشته باشیم.
مقدار پیشفرض برای یک struct سفارشی، خیلی سادهست: معادل مقدار پیشفرض تمام فیلدهای داخل اون struct هست.
دونستن مقادیر پیشفرض به شما کمک میکنه رفتار اولیه کدهاتون رو بهتر درک کنید و از خطاهای ناشی از مقادیر ناخواسته جلوگیری کنید.
آیا تا حالا از کلمه کلیدی default تو کدهاتون استفاده کردید؟ یا جایی بوده که مقداردهی پیشفرض یه فیلد یا آرایه شما رو غافلگیر کرده باشه؟
نظراتتون رو کامنت کنید! 👇
[پاتوق گیک های #C]
هر متغیر با چه مقداری متولد میشود؟
تو پست "سیاست تخصیص قطعی" دیدیم که فیلدهای یک کلاس و عناصر یک آرایه به صورت خودکار مقداردهی اولیه میشن. اما سوال اینجاست: چه مقداری؟ این مقادیر از کجا میان؟
جواب تو یه مفهوم ساده به اسم مقدار پیشفرض (Default Value) هست.
مقادیر پیشفرض چیست؟ 🔢
هر نوع دادهای در #C یک مقدار پیشفرض داره که حاصل صفر کردن بیتهای حافظه (Bitwise Zeroing) هست. این یعنی:
●تمام Reference Typeها (کلاس، string، آرایه، ...): مقدار پیشفرضشون null هست.
●تمام Numeric Typeها (int, double, decimal, ...): مقدار پیشفرضشون 0 هست.
●نوع bool: مقدار پیشفرصش false هست.
●نوع char: مقدار پیشفرصش '\0' (کاراکتر نال) هست.
کلمه کلیدی default ✨
سیشارپ یه کلمه کلیدی شیک و کاربردی به اسم default در اختیار ما میذاره تا بتونیم مقدار پیشفرض هر نوعی رو به راحتی بدست بیاریم، بدون اینکه نیازی به حفظ کردنشون داشته باشیم.
// گرفتن مقدار پیشفرض decimal
decimal d1 = default(decimal); // حاصل: 0
// روش مدرنتر و خلاصهتر
// کامپایلر خودش نوع رو از متغیر تشخیص میده
int i = default; // حاصل: 0
bool b = default; // حاصل: false
string s = default; // حاصل: null
تکلیف structها چیست؟ 🏗
مقدار پیشفرض برای یک struct سفارشی، خیلی سادهست: معادل مقدار پیشفرض تمام فیلدهای داخل اون struct هست.
public struct Point
{
public int X; // پیشفرض: 0
public string Name; // پیشفرض: null
}
Point p = default;
// اینجا p.X برابر 0 و p.Name برابر null خواهد بود
Console.WriteLine($"X: {p.X}, Name: {p.Name ?? "null"}");
🤔 حرف حساب و تجربه شما
دونستن مقادیر پیشفرض به شما کمک میکنه رفتار اولیه کدهاتون رو بهتر درک کنید و از خطاهای ناشی از مقادیر ناخواسته جلوگیری کنید.
آیا تا حالا از کلمه کلیدی default تو کدهاتون استفاده کردید؟ یا جایی بوده که مقداردهی پیشفرض یه فیلد یا آرایه شما رو غافلگیر کرده باشه؟
نظراتتون رو کامنت کنید! 👇
[پاتوق گیک های #C]
🔖 هشتگها :
#CSharp
#CodingTips
#SoftwareEngineering
🛡 ابزار حرفهای #C :
فرض کنید یه struct خیلی بزرگ دارید (مثلاً با کلی فیلد). وقتی این struct رو به یه متد پاس میدید، #C یه کپی کامل ازش میسازه که میتونه روی پرفورمنس تأثیر منفی بذاره.
حالا اگه نخوایم این کپیکاری پرهزینه انجام بشه، ولی در عین حال مطمئن باشیم که متد، مقدار اصلی رو به هیچ وجه تغییر نمیده، چیکار کنیم؟
حالا in چیست؟ رفرنسِ فقط-خواندنی (Read-Only)
"این پارامتر رو بر اساس رفرنس بفرست تا از کپی کردنش جلوگیری بشه، ولی داخل متد، باهاش مثل یه مقدار فقط-خواندنی (Read-Only) رفتار کن و اجازه هیچ تغییری بهش نده."
🧨پس in دو تا کار خفن رو با هم انجام میده:
فهمیدیم in یکی از اون ابزارهای تخصصیتره که نشون میده شما به پرفورمنس و جزئیات اهمیت میدید. این کلمه کلیدی، قدرت ref (جلوگیری از کپی) و ایمنی pass-by-value (عدم تغییر مقدار اصلی) رو با هم ترکیب میکنه.
شما تا حالا از پارامتر in برای بهینهسازی کدهاتون استفاده کردید؟ یا اصلاً از وجودش خبر داشتید؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[پاتوق گیک های #C]
بهینهسازی پرفورمنس با پارامتر in
فرض کنید یه struct خیلی بزرگ دارید (مثلاً با کلی فیلد). وقتی این struct رو به یه متد پاس میدید، #C یه کپی کامل ازش میسازه که میتونه روی پرفورمنس تأثیر منفی بذاره.
حالا اگه نخوایم این کپیکاری پرهزینه انجام بشه، ولی در عین حال مطمئن باشیم که متد، مقدار اصلی رو به هیچ وجه تغییر نمیده، چیکار کنیم؟
✨️اینجاست که کلمه کلیدی in وارد میدان میشه.
حالا in چیست؟ رفرنسِ فقط-خواندنی (Read-Only)
کلمه کلیدی in به کامپایلر میگه:
"این پارامتر رو بر اساس رفرنس بفرست تا از کپی کردنش جلوگیری بشه، ولی داخل متد، باهاش مثل یه مقدار فقط-خواندنی (Read-Only) رفتار کن و اجازه هیچ تغییری بهش نده."
🧨پس in دو تا کار خفن رو با هم انجام میده:
1️⃣افزایش پرفورمنس: از کپی شدن structهای بزرگ جلوگیری میکنه.
2️⃣تضمین ایمنی: به شما اطمینان میده که متد، دادهی اصلی شما رو دستکاری نمیکنه.
// فرض کنید این یک استراکت خیلی بزرگه
public readonly struct BigStruct
{
// ... کلی فیلد و پراپرتی
}
void ProcessData(in BigStruct data)
{
// این کد کامپایل نمیشه چون پارامتر 'data' فقط-خواندنی است
// data = new BigStruct(); // ❌ Compile-time error!
// ولی میتونیم ازش بخونیم و استفاده کنیم
Console.WriteLine("Processing data...");
}
// --- نحوه استفاده ---
var myBigData = new BigStruct();
// با 'in' به متد پاس میدیم تا از کپی شدن جلوگیری کنیم
ProcessData(in myBigData);
// اگه ابهامی در اورلود متد نباشه، بدون 'in' هم میشه صداش زد
ProcessData(myBigData);
🤔حرف حساب و تجربه شما
فهمیدیم in یکی از اون ابزارهای تخصصیتره که نشون میده شما به پرفورمنس و جزئیات اهمیت میدید. این کلمه کلیدی، قدرت ref (جلوگیری از کپی) و ایمنی pass-by-value (عدم تغییر مقدار اصلی) رو با هم ترکیب میکنه.
شما تا حالا از پارامتر in برای بهینهسازی کدهاتون استفاده کردید؟ یا اصلاً از وجودش خبر داشتید؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[پاتوق گیک های #C]
🔖 هشتگها:
#CSharp
#Performance
#CodingTips
🔬 کالبدشکافی var در #C :
کلمه کلیدی var یکی از مدرنترین و در عین حال بحثبرانگیزترین قابلیتهای #C هست. بعضیها عاشقشن و بعضیها ازش فراریان.
اما var دقیقاً چیه؟ آیا #C رو مثل جاوااسکریپت، داینامیک میکنه؟ بیاید یک بار برای همیشه، این ابزار قدرتمند رو کالبدشکافی کنیم.
این var یه کلمه کلیدی برای راحتی کاره. وقتی از var استفاده میکنید، به کامپایلر میگید:
"من نوع این متغیر محلی رو نمینویسم. خودت از روی عبارتی که دارم بهش اختصاص میدم، نوعش رو استنتاج (Infer) کن."
این کدها دقیقاً معادل این هستن که شما خودتون نوع رو به صورت صریح بنویسید.
این بزرگترین تصور اشتباه در مورد var هست. استفاده از var به هیچ وجه #C رو به یه زبان داینامیک تبدیل نمیکنه.
نوع متغیری که با var تعریف میشه، در زمان کامپایل مشخص و قفل میشه و دیگه هرگز قابل تغییر نیست. var فقط برای خلاصهنویسیه.
با اینکه var کد رو کوتاهتر میکنه، گاهی وقتا میتونه خوانایی کد رو کم کنه. قانون کلی اینه: اگه با یه نگاه به سمت راست مساوی، نتونستید نوع متغیر رو به راحتی تشخیص بدید، بهتره از var استفاده نکنید.
کلمه کلیدی var یه ابزار عالی برای خلاصهنویسی و تمیزتر کردن کده، به شرطی که هوشمندانه ازش استفاده بشه و خوانایی رو فدای کوتاهی نکنیم.
شما از طرفدارای var هستید یا مخالفش؟ به نظرتون کجاها استفاده از var کد رو بهتر میکنه و کجاها بدتر؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[پاتوق گیک های #C]
ابزار قدرتمند یا کدنویسی شلخته؟
کلمه کلیدی var یکی از مدرنترین و در عین حال بحثبرانگیزترین قابلیتهای #C هست. بعضیها عاشقشن و بعضیها ازش فراریان.
اما var دقیقاً چیه؟ آیا #C رو مثل جاوااسکریپت، داینامیک میکنه؟ بیاید یک بار برای همیشه، این ابزار قدرتمند رو کالبدشکافی کنیم.
1️⃣حالا var چیست؟ استنتاج نوع در زمان کامپایل 🤖
این var یه کلمه کلیدی برای راحتی کاره. وقتی از var استفاده میکنید، به کامپایلر میگید:
"من نوع این متغیر محلی رو نمینویسم. خودت از روی عبارتی که دارم بهش اختصاص میدم، نوعش رو استنتاج (Infer) کن."
// کامپایلر میفهمه که x از نوع string هست
var x = "hello";
// کامپایلر میفهمه که y از نوع StringBuilder هست
var y = new System.Text.StringBuilder();
// کامپایلر میفهمه که z از نوع float هست
var z = (float)Math.PI;
این کدها دقیقاً معادل این هستن که شما خودتون نوع رو به صورت صریح بنویسید.
2️⃣مهمترین نکته: var داینامیک نیست! (Statically Typed) 🛡
این بزرگترین تصور اشتباه در مورد var هست. استفاده از var به هیچ وجه #C رو به یه زبان داینامیک تبدیل نمیکنه.
نوع متغیری که با var تعریف میشه، در زمان کامپایل مشخص و قفل میشه و دیگه هرگز قابل تغییر نیست. var فقط برای خلاصهنویسیه.
// اینجا کامپایلر نوع x رو int تشخیص میده و این نوع برای همیشه ثابت میمونه
var x = 5;
// ❌ خطای زمان کامپایل!
// شما نمیتونید یه رشته رو تو یه متغیر از نوع int بریزید.
x = "hello";
3️⃣تله خوانایی: کی نباید از var استفاده کنیم؟ 🧐
با اینکه var کد رو کوتاهتر میکنه، گاهی وقتا میتونه خوانایی کد رو کم کنه. قانون کلی اینه: اگه با یه نگاه به سمت راست مساوی، نتونستید نوع متغیر رو به راحتی تشخیص بدید، بهتره از var استفاده نکنید.
// اینجا x از چه نوعیه؟ int? long?
// برای فهمیدنش باید بریم و متد Next رو چک کنیم.
// این کد خوانایی خوبی نداره.
var x = new Random().Next();
// نوشتن صریح، اینجا خیلی بهتر و خواناتره:
int x = new Random().Next();
🤔 حرف حساب و استایل شما
کلمه کلیدی var یه ابزار عالی برای خلاصهنویسی و تمیزتر کردن کده، به شرطی که هوشمندانه ازش استفاده بشه و خوانایی رو فدای کوتاهی نکنیم.
نکته: سناریوهایی هم وجود داره (مثل کار با Anonymous Types) که استفاده از var در اونها اجباریه و بعداً بهشون میرسیم.
شما از طرفدارای var هستید یا مخالفش؟ به نظرتون کجاها استفاده از var کد رو بهتر میکنه و کجاها بدتر؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[پاتوق گیک های #C]
🔖 هشتگها:
#CSharp
#CodingTips #CleanCode #Var
✨ یک ترفند مدرن برای خداحافظی با تکرار: Target-Typed new
از نوشتن اسمهای طولانی مثل StringBuilder دو بار تو یه خط خسته شدی؟
StringBuilder sb = new System.Text.StringBuilder();
این تکرار، کد رو شلوغ و ناخوانا میکنه. #C از نسخه ۹ به بعد، یه راه حل خیلی شیک برای این مشکل داره:
Target-Typed new Expressions.
معرفی ()Target-Typed new 🎯
قانونش سادهست: اگه کامپایلر بتونه از روی "هدف" (Target) - یعنی متغیری که داری بهش مقدار میدی یا پارامتر متدی که داری بهش پاس میدی - نوع رو تشخیص بده، شما دیگه لازم نیست اسم نوع رو بعد از new تکرار کنی!
// روش قدیمی و تکراری
System.Text.StringBuilder sb1 = new System.Text.StringBuilder("Old way");
// روش مدرن و تمیز با Target-Typed new
System.Text.StringBuilder sb2 = new("New way"); // کامپایلر خودش میفهمه!
✨️این قابلیت دو جا قدرت اصلیش رو نشون میده:
1️⃣مقداردهی فیلدها در سازنده (Constructor):
وقتی یه فیلد رو تو کلاس تعریف میکنی و میخوای تو سازنده مقداردهی کنی:
class Foo
{
private System.Text.StringBuilder _sb;
public Foo(string initialValue)
{
// نیازی به تکرار اسم طولانی StringBuilder نیست
_sb = new(initialValue);
}
}
2️⃣پاس دادن آبجکت جدید به عنوان آرگومان متد:
// کد خیلی کوتاه و خوانا میشه
MyMethod(new("test"));
void MyMethod(System.Text.StringBuilder sb) { /* ... */ }
🤔 حرف حساب و تجربه شما
این یه قابلیت کوچیک ولی خیلی کاربردیه که به مرور، کد شما رو تمیزتر و مدرنتر میکنه و از تکرارهای بیمورد جلوگیری میکنه.
شما از این سینتکس جدید ()new استفاده میکنید؟ به نظرتون خوانایی کد رو بهتر میکنه یا ترجیح میدید همیشه نوع رو کامل بنویسید؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[پاتوق گیک های #C]
🔖 هشتگها:
#CSharp #DotNet #ModernCSharp #CleanCode #CodingTips
⚙️ الفبای منطق در #C :
تا حالا به این فکر کردید که سادهترین کدهایی که مینویسید، مثل 12 * 30 یا x + 1، پشت صحنه چطور تفسیر میشن؟ درک این موضوع، الفبای منطق کدنویسیه و به شما دید عمیقتری نسبت به ساختار کد میده.
بیاید با دو تا از بنیادیترین مفاهیم آشنا بشیم: عبارتها و عملگرها.
خیلی سادهست: هر چیزی در کد که در نهایت یک مقدار (Value) تولید میکنه، یک عبارت نامیده میشه.
سادهترین عبارتها، ثابتها (Constants) و متغیرها (Variables) هستن:
عبارتها میتونن با هم ترکیب بشن و عبارتهای پیچیدهتری بسازن. در واقع، ورودیهای یک عملگر، خودشون میتونن عبارت باشن:
عملگرها، ابزارهایی هستن که یک یا چند "عملوند" (Operand) (که همون عبارتها هستن) رو به عنوان ورودی میگیرن و یک مقدار جدید رو به عنوان خروجی تولید میکنن.
عملگرها در #C بر اساس تعداد عملوندهاشون به سه دسته تقسیم میشن:
●یکانی (Unary): روی یک عملوند کار میکنه (مثل x++ یا -x).
●دوگانی (Binary): روی دو عملوند کار میکنه (مثل x + y). اینها همیشه وسط دو عملوند میان (بهش میگن Infix notation).
●سهگانی (Ternary): تنها عملگری که روی سه عملوند کار میکنه (q ? a : b).
درک این مفاهیم پایه، به شما کمک میکنه که منطق کد رو مثل یک معمار ببینید که با آجرها (عبارتها) و ملات (عملگرها)، یه ساختمون کامل میسازه.
شما هم کد رو اینجوری به اجزای سازندهش تقسیم میکنید؟ آیا دونستن این مفاهیم پایه، به درک بهتر شما از کدهای پیچیده کمک کرده؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[پاتوق گیک های #C]
عبارتها (Expressions) و عملگرها (Operators)
تا حالا به این فکر کردید که سادهترین کدهایی که مینویسید، مثل 12 * 30 یا x + 1، پشت صحنه چطور تفسیر میشن؟ درک این موضوع، الفبای منطق کدنویسیه و به شما دید عمیقتری نسبت به ساختار کد میده.
بیاید با دو تا از بنیادیترین مفاهیم آشنا بشیم: عبارتها و عملگرها.
1️⃣عبارت (Expression) چیست؟
خیلی سادهست: هر چیزی در کد که در نهایت یک مقدار (Value) تولید میکنه، یک عبارت نامیده میشه.
سادهترین عبارتها، ثابتها (Constants) و متغیرها (Variables) هستن:
عبارتها میتونن با هم ترکیب بشن و عبارتهای پیچیدهتری بسازن. در واقع، ورودیهای یک عملگر، خودشون میتونن عبارت باشن:
// اینجا (12 * 30) خودش یک عبارته که به عنوان ورودی به عملگر + داده شده
1 + (12 * 30)
2️⃣عملگر (Operator) چیست؟
عملگرها، ابزارهایی هستن که یک یا چند "عملوند" (Operand) (که همون عبارتها هستن) رو به عنوان ورودی میگیرن و یک مقدار جدید رو به عنوان خروجی تولید میکنن.
عملگرها در #C بر اساس تعداد عملوندهاشون به سه دسته تقسیم میشن:
●یکانی (Unary): روی یک عملوند کار میکنه (مثل x++ یا -x).
●دوگانی (Binary): روی دو عملوند کار میکنه (مثل x + y). اینها همیشه وسط دو عملوند میان (بهش میگن Infix notation).
●سهگانی (Ternary): تنها عملگری که روی سه عملوند کار میکنه (q ? a : b).
🤔 حرف حساب و دیدگاه شما
درک این مفاهیم پایه، به شما کمک میکنه که منطق کد رو مثل یک معمار ببینید که با آجرها (عبارتها) و ملات (عملگرها)، یه ساختمون کامل میسازه.
شما هم کد رو اینجوری به اجزای سازندهش تقسیم میکنید؟ آیا دونستن این مفاهیم پایه، به درک بهتر شما از کدهای پیچیده کمک کرده؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[پاتوق گیک های #C]
🔖 هشتگها:
#DotNet #CodingTips #SoftwareEngineering
👑 قوانین نانوشته #C :
وقتی عبارتی مثل 1 + 2 * 3 رو مینویسید، #C از کجا میدونه که اول باید ضرب رو انجام بده؟ یا چرا 8 / 4 / 2 میشه 1 و نه 4؟
جواب تو دو تا قانون کلیدیه که امروز یاد میگیریم:
●اولویت (Precedence)
●ترتیب اجرا (Associativity).
اول از همه، بدونید که خودِ انتساب (=) در #C یک "عبارت" هست و مقدار داره! مقدارش هم همون چیزیه که بهش اختصاص داده شده. این ویژگی به ما اجازه میده کدهای جالبی بنویسیم:
زنجیرهای کردن انتساب: برای مقداردهی اولیه چند متغیر:
عملگرهای ترکیبی: اینها میانبرهای syntactic برای ترکیب انتساب با یه عملگر دیگهان و کد رو تمیزتر میکنن:
مثل ریاضی مدرسه، بعضی عملگرها در #C "زورشان" بیشتره. کامپایلر همیشه اول سراغ عملگرهای با اولویت بالاتر میره.
اولویت * و / از + و - بیشتره.
به همین دلیله که عبارت زیر، اینجوری محاسبه میشه:
3️⃣ترتیب اجرا (Associativity): چپ به راست یا راست به چپ؟
حالا اگه اولویتها یکی بود چی؟ اینجا "ترتیب اجرا" وارد میشه.
چپ-به-راست (Left-associative):
بیشتر عملگرهای دوتایی در #C چپ-به-راست هستن. یعنی محاسبه از چپ شروع میشه.
راست-به-چپ (Right-associative):
اما عملگرهای انتساب (=)، شرطی سهتایی (?:) و null-coalescing (??) استثنا هستن و از راست به چپ ارزیابی میشن.
این ویژگی به ما اجازه میده که انتساب زنجیرهای داشته باشیم:
تسلط بر این قوانین، شما رو از خیلی از باگهای محاسباتی نجات میده و بهتون کمک میکنه کد بقیه رو سریعتر بخونید.
آیا تا حالا باگی داشتید که به خاطر رعایت نکردن اولویت عملگرها به وجود اومده باشه؟ یا از قابلیت زنجیرهای کردن انتساب (a=b=c) استفاده میکنید؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[C# Geeks Hangout]
اولویت و ترتیب اجرای عملگرها
وقتی عبارتی مثل 1 + 2 * 3 رو مینویسید، #C از کجا میدونه که اول باید ضرب رو انجام بده؟ یا چرا 8 / 4 / 2 میشه 1 و نه 4؟
جواب تو دو تا قانون کلیدیه که امروز یاد میگیریم:
●اولویت (Precedence)
●ترتیب اجرا (Associativity).
1️⃣عبارتهای انتساب (=) و ترفندهاش ✍️
اول از همه، بدونید که خودِ انتساب (=) در #C یک "عبارت" هست و مقدار داره! مقدارش هم همون چیزیه که بهش اختصاص داده شده. این ویژگی به ما اجازه میده کدهای جالبی بنویسیم:
زنجیرهای کردن انتساب: برای مقداردهی اولیه چند متغیر:
int a, b, c;
a = b = c = 0; // هر سه متغیر برابر با صفر میشن
عملگرهای ترکیبی: اینها میانبرهای syntactic برای ترکیب انتساب با یه عملگر دیگهان و کد رو تمیزتر میکنن:
int x = 5;
x *= 2; // معادل: x = x * 2; حالا x برابر 10 است
2️⃣اولویت عملگرها (Precedence): چه کسی رئیس است؟
مثل ریاضی مدرسه، بعضی عملگرها در #C "زورشان" بیشتره. کامپایلر همیشه اول سراغ عملگرهای با اولویت بالاتر میره.
اولویت * و / از + و - بیشتره.
به همین دلیله که عبارت زیر، اینجوری محاسبه میشه:
// کامپایلر این رو به صورت 1 + (2 * 3) میبینه
int result = 1 + 2 * 3; // خروجی: 7
3️⃣ترتیب اجرا (Associativity): چپ به راست یا راست به چپ؟
حالا اگه اولویتها یکی بود چی؟ اینجا "ترتیب اجرا" وارد میشه.
چپ-به-راست (Left-associative):
بیشتر عملگرهای دوتایی در #C چپ-به-راست هستن. یعنی محاسبه از چپ شروع میشه.
// کامپایلر این رو به صورت (8 / 4) / 2 میبینه
int result = 8 / 4 / 2; // خروجی: 1
راست-به-چپ (Right-associative):
اما عملگرهای انتساب (=)، شرطی سهتایی (?:) و null-coalescing (??) استثنا هستن و از راست به چپ ارزیابی میشن.
این ویژگی به ما اجازه میده که انتساب زنجیرهای داشته باشیم:
int x, y;
// کامپایلر این رو به صورت (x = (y = 3)) میبینه
// اول 3 در y ریخته میشه، و بعد حاصل اون عبارت (که 3 هست) در x ریخته میشه.
x = y = 3;
🤔 حرف حساب و تجربه شما
تسلط بر این قوانین، شما رو از خیلی از باگهای محاسباتی نجات میده و بهتون کمک میکنه کد بقیه رو سریعتر بخونید.
آیا تا حالا باگی داشتید که به خاطر رعایت نکردن اولویت عملگرها به وجود اومده باشه؟ یا از قابلیت زنجیرهای کردن انتساب (a=b=c) استفاده میکنید؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[C# Geeks Hangout]
🔖 هشتگها:
#CSharp #Programming #Developer #DotNet #CodingTips #Fundamentals #Operators
🛡 نجات از NullReferenceException: جادوی اپراتورهای مدرن #C 🪄
تو پستهای قبلی در مورد null و خطای معروفش 😭 حرف زدیم. حالا وقتشه با سه تا از قویترین اسلحههای #C ⚔️ برای مقابله با این خطا و نوشتن کدهای امنتر و خواناتر آشنا بشیم: ?.، ?? و ??=.
این سه اپراتور، جعبه ابزار مدرن شما برای نوشتن کدهای ضد-null هستن.
1️⃣ اپراتور Null-Conditional (?.): امنترین راه دسترسی
این اپراتور که بهش "الویس" هم میگن، مثل یه نگهبان شخصیه 🕵️♂️. قبل از اینکه به یه عضو یا متد دسترسی پیدا کنه، چک میکنه: "صاحابخونه هست؟ 🤔".
اگه آبجکت null نبود ✅، کارشو انجام میده.
اگه آبجکت null بود ❌، بدون هیچ سر و صدایی 🤫 کل عبارت رو متوقف میکنه و null برمیگردونه.
StringBuilder sb = null;
// به جای اینکه خطا بده، s برابر با null میشه
string s = sb?.ToString();
// این قابلیت زنجیرهای هم هست!
// چون sb نال هست، اصلاً به ToUpper() نمیرسه و خطا نمیده
string upper = sb?.ToString().ToUpper();
تله مهم 🪤: خروجی این عبارت میتونه null باشه، پس باید اون رو در نوعی بریزید که null رو قبول میکنه (مثلاً int خالی نمیتونه، ولی int? میتونه).
2️⃣ اپراتور Null-Coalescing (??): تعیین مقدار پیشفرض
این اپراتور، زوج عالی برای ?. هست. منطقش اینه:
"اگه چیزی که سمت چپم هست، null نبود، همونو بده. اگه null بود، این مقدار پیشفرض رو بده ✨."
این دوتا با هم یه ترکیب طلایی 🏆 میسازن:
StringBuilder sb = null;
// اگه sb نال نبود، ToString() رو برگردون
// اگه نال بود، رشته "Default Value" رو برگردون
string s = sb?.ToString() ?? "Default Value";
Console.WriteLine(s); // خروجی: Default Value
3️⃣ اپراتور Null-Coalescing Assignment (??=)
مقداردهی هوشمند این اپراتور که از 8 #C اضافه شده، یه میانبر خیلی تمیزه. منطقش اینه:
"فقط و فقط اگه متغیر سمت چپم null هست، این مقدار جدید رو بهش اختصاص بده ✍️."
myVariable ??= someDefaultValue;
دقیقاً معادل این کد طولانیتره:
if (myVariable == null)
{
myVariable = someDefaultValue;
}
🤔 حرف حساب و تجربه شما
این سه اپراتور، جعبه ابزار مدرن شما برای نوشتن کدهای #C تمیز، کوتاه و مقاوم در برابر خطای null هستن.
شما از کدوم یکی از این اپراتورها بیشتر استفاده میکنید؟ آیا ترکیب ?. و ?? جزو ترفندهای روزمره شما هست؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[پاتوق گیک های #C]
🔖 هشتگها:
#CSharp #Programming #Developer #DotNet #NullHandling #CodingTips #BestPractices
🧠 مغز تصمیمگیری در #C: راهنمay کامل دستور if-else
چطور به برنامهمون یاد بدیم که فکر کنه، شرایط رو بسنجه و تصمیم بگیره؟ ابزار اصلی و روزمره ما برای این کار، دستور قدرتمند و حیاتی if هست. بیاید با تمام جزئیاتش آشنا بشیم.
1️⃣ دستور if: اگر این شرط درست بود...
سادهترین حالت. یه شرط (که باید حاصلش true یا false باشه) رو داخل پرانتز بررسی میکنه. اگه شرط true بود، بلوک کد داخلش اجرا میشه. اگه false بود، کلاً ازش رد میشه.
if (5 < 2 * 3) // شرط 5 < 6 درست است (true)
{
Console.WriteLine("شرط درست بود و این پیام چاپ شد.");
}
2️⃣ دستور else: در غیر این صورت...
else همیشه به یه if وصله و میگه: "اگه شرط if بالایی false بود، به جای اون، این بلوک کد رو اجرا کن."
if (2 + 2 == 5) // شرط غلط است (false)
{
// این بخش اجرا نمیشه
Console.WriteLine("Does not compute");
}
else
{
// چون شرط بالا غلط بود، این بخش اجرا میشه
Console.WriteLine("شرط غلط بود و این پیام چاپ شد.");
}
3️⃣ زنجیرهای کردن شرطها با else if
اگه چند تا شرط مختلف رو میخوای پشت سر هم چک کنی، از else if استفاده میکنی. #C شرطها رو به ترتیب چک میکنه و به محض اینکه به اولین شرط true برسه، بلوک مربوط به اون رو اجرا میکنه و از کل ساختار if-else خارج میشه.
int score = 85;
char grade;
if (score >= 90)
{
grade = 'A';
}
else if (score >= 80)
{
// چون 85 >= 80 درست است، این بلوک اجرا میشه و تمام!
// دیگه شرطهای بعدی چک نمیشن.
grade = 'B';
}
else if (score >= 70)
{
grade = 'C';
}
else
{
grade = 'F';
}
Console.WriteLine($"Your grade is: {grade}"); // خروجی: Your grade is: B
🤔 حرف حساب و تجربه شما
این if-else ستون فقرات منطق در اکثر برنامههاست و تسلط بر اون برای نوشتن هر کدی ضروریه.
شما بیشتر برای چه سناریوهایی از if-else if-else های تودرتو استفاده میکنید؟ آیا جایگزین بهتری مثل switch (که بعداً بهش میرسیم) رو ترجیح میدید؟
خب، اینجا که نمیشه همه حرفا رو زد! 😉
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[پاتوق گیک های #C]
🔖 هشتگها:
#CSharp #Programming #Developer #DotNet #ControlFlow #IfElse #CodingTips
😵💫 برنامهنویس NET.؟
میخوای از باگهای دردناک، امنیت داغون و کد اسپاگتی در امان بمونی؟
این 10 قاتل خاموش رو دستکم نگیر!
(حتی تو پروژههای بهظاهر «Enterprise» هم میبینمشون…)
⸻
1️⃣ بدون اعتبارسنجی ورودی؟ خداحافظ با ثبات 😬
دادهی خراب بیاد تو، همهچی میریزه به هم.
پاک کردن دادهی خراب ۱۰ برابر سختتر از جلوگیری از ورودشه!
🧱 همیشه ورودی رو چک کن → Validate before trust
⸻
2️⃣ مقادیر هاردکد شده 🎯
عاشق سرتاسری Replace زدن تو پروژهای؟
از «عدد جادویی» استفاده کن 😎
نه؟ پس برو سراغ:
🔸 فایل پیکربندی
🔸 ثابتها
🔸 دیتابیس
⸻
3️⃣ وابستگی سفت و سخت بین کلاسها 🔗
وقتی یه کلاس به کلاس دیگه دوخته شده باشه، انعطاف میره هوا.
🙅♂️ با abstraction (مثل Interface) کدت رو قابل تغییر نگه دار.
⸻
4️⃣ تست واحد؟ وقت ندارم؟ 😐
اگه الان وقت نداری تست بنویسی،
فردا کلی وقت داری باگهات رو دیباگ کنی! 🔥
⸻
5️⃣ مدیریت نکردن Exception ها 💣
اگه استکتریس کامل رو فرستادی تو پاسخ HTTP، یه کادو به هکر دادی!
📛 ارورها رو لاگ کن.
✅ پیام امن بده به کاربر.
⸻
6️⃣ کد غیرقابل خوندن 🤯
واسه انسان بنویس نه ماشین!
اگه باید یه کد رو ۳ بار بخونی تا بفهمی چی میگه، خیلی پیچیدهست.
🧼 تمیز بنویس تا خودت ۳ ماه دیگه هم بفهمیش!
⸻
7️⃣ طراحی ضعیف دیتابیس 🐢
طرح دیتای اشتباه یعنی:
🔹 کندی
🔹 غیرقابل توسعه بودن
🔹 زجر در آینده
بلندمدت فکر کن موقع مدلسازی!
⸻
8️⃣ امنیت؟ بذار بعداً! ❌
👾 اینجوری هک میشی رفیق!
✅ ورودیها رو بررسی کن
✅ کمترین سطح دسترسی
✅ هرچی میاد رو پاکسازی کن (Sanitize)
امنیت چیز اختیاری نیست… هیچوقت!
⸻
9️⃣ بدون لاگ و مانیتورینگ 🚫📊
برنامه رو منتشر کردی؟ دمت گرم!
ولی حالا از کجا میفهمی داره درست کار میکنه؟
🕵️♂️ بدون لاگ = پرواز کور
⸻
🔟 اختراع دوباره چرخ؟ 😅
مگه قراره ORM اختراع کنی؟
تا وقتی یه ابزار تستشده و امن هست،
✅ استفادهش کن
🧠 وقتتو صرف چیزای ارزشمندتر کن!
⸻
🎯 لازم نیست کدت بینقص باشه…
ولی اگه اینا رو نادیده بگیری،
کد Legacy درست کردی، نه پروژه حرفهای!
⸻
میخوای از باگهای دردناک، امنیت داغون و کد اسپاگتی در امان بمونی؟
این 10 قاتل خاموش رو دستکم نگیر!
(حتی تو پروژههای بهظاهر «Enterprise» هم میبینمشون…)
⸻
1️⃣ بدون اعتبارسنجی ورودی؟ خداحافظ با ثبات 😬
دادهی خراب بیاد تو، همهچی میریزه به هم.
پاک کردن دادهی خراب ۱۰ برابر سختتر از جلوگیری از ورودشه!
🧱 همیشه ورودی رو چک کن → Validate before trust
⸻
2️⃣ مقادیر هاردکد شده 🎯
عاشق سرتاسری Replace زدن تو پروژهای؟
از «عدد جادویی» استفاده کن 😎
نه؟ پس برو سراغ:
🔸 فایل پیکربندی
🔸 ثابتها
🔸 دیتابیس
⸻
3️⃣ وابستگی سفت و سخت بین کلاسها 🔗
وقتی یه کلاس به کلاس دیگه دوخته شده باشه، انعطاف میره هوا.
🙅♂️ با abstraction (مثل Interface) کدت رو قابل تغییر نگه دار.
⸻
4️⃣ تست واحد؟ وقت ندارم؟ 😐
اگه الان وقت نداری تست بنویسی،
فردا کلی وقت داری باگهات رو دیباگ کنی! 🔥
⸻
5️⃣ مدیریت نکردن Exception ها 💣
اگه استکتریس کامل رو فرستادی تو پاسخ HTTP، یه کادو به هکر دادی!
📛 ارورها رو لاگ کن.
✅ پیام امن بده به کاربر.
⸻
6️⃣ کد غیرقابل خوندن 🤯
واسه انسان بنویس نه ماشین!
اگه باید یه کد رو ۳ بار بخونی تا بفهمی چی میگه، خیلی پیچیدهست.
🧼 تمیز بنویس تا خودت ۳ ماه دیگه هم بفهمیش!
⸻
7️⃣ طراحی ضعیف دیتابیس 🐢
طرح دیتای اشتباه یعنی:
🔹 کندی
🔹 غیرقابل توسعه بودن
🔹 زجر در آینده
بلندمدت فکر کن موقع مدلسازی!
⸻
8️⃣ امنیت؟ بذار بعداً! ❌
👾 اینجوری هک میشی رفیق!
✅ ورودیها رو بررسی کن
✅ کمترین سطح دسترسی
✅ هرچی میاد رو پاکسازی کن (Sanitize)
امنیت چیز اختیاری نیست… هیچوقت!
⸻
9️⃣ بدون لاگ و مانیتورینگ 🚫📊
برنامه رو منتشر کردی؟ دمت گرم!
ولی حالا از کجا میفهمی داره درست کار میکنه؟
🕵️♂️ بدون لاگ = پرواز کور
⸻
🔟 اختراع دوباره چرخ؟ 😅
مگه قراره ORM اختراع کنی؟
تا وقتی یه ابزار تستشده و امن هست،
✅ استفادهش کن
🧠 وقتتو صرف چیزای ارزشمندتر کن!
⸻
🎯 لازم نیست کدت بینقص باشه…
ولی اگه اینا رو نادیده بگیری،
کد Legacy درست کردی، نه پروژه حرفهای!
⸻
🔖 هشتگها:
#DotNet #CSharp #CodingTips #BestPractices #Programming #SoftwareEngineering #DevLife