✨ خلاصهنویسی آرایهها در #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