C# Geeks (.NET)
334 subscribers
128 photos
1 video
98 links
Download Telegram
🪄 جادوی اعداد در #C :
نوشتن اعداد مثل یک حرفه‌ای (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 :
همه چیز درباره تبدیل‌های عددی (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() هست.

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 (\)
این روش سنتی‌ترین راهه. برای رشته‌های ساده خوبه، ولی وقتی پای کاراکترهای خاص مثل بک‌اسلش (\) یا کوتیشن (") وسط بیاد، کد شما به سرعت زشت و ناخوانا میشه.

به خصوص برای مسیر فایل‌ها در ویندوز، این روش یه کابوس واقعیه!

// هر \ باید دو بار نوشته بشه!
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 :
تکنیک‌های 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

سی‌شارپ یه کلمه کلیدی شیک و کاربردی به اسم 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 :
بهینه‌سازی پرفورمنس با پارامتر 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 رو مثل جاوااسکریپت، داینامیک می‌کنه؟ بیاید یک بار برای همیشه، این ابزار قدرتمند رو کالبدشکافی کنیم.

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