C# Geeks (.NET) – Telegram
Channel created
👋 سلام رفقا! خوش اومدین به کانال C# Geeks

اینجا قراره از صفرِ صفر، قدم‌به‌قدم با هم #C یاد بگیریم. هم چیزای پایه رو یاد می‌گیریم که همه بتونن راحت وارد دنیای برنامه‌نویسی بشن، هم یواش‌یواش میریم سراغ مباحث پیشرفته‌تر و خفن‌تر! 🔥

📚 هدفمون اینه که نه فقط آموزش خشک بدیم، بلکه نکات کاربردی، سوالات واقعی و تجربه‌های باحال رو هم با هم به اشتراک بذاریم. هرچی جلوتر بریم، مباحث جذاب‌تر و چالش‌برانگیزتر میشه!

💬 پس هر سوال، ابهام یا تجربه‌ای که داری رو بپرس و با ما درمیون بذار. با هم میریم جلو و قوی‌تر می‌شیم!

📌 منتظر اولین پست آموزشی باش 😉

🔖 هشتگ‌ها : #CSharpGeeks

string channel = "CSharpGeeks";
💻 سی شارپ (#C) چیه؟
سی شارپ یه زبان برنامه‌نویسی مدرن، چندمنظوره و شی‌گراست که توسط شرکت مایکروسافت ساخته شده. این زبان سال ۲۰۰۰ توسط «آندرس هلسبرگ» (Anders Hejlsberg) و تیم خفنشون معرفی شد تا توسعه‌دهنده‌ها بتونن باهاش نرم‌افزارهای قدرتمند و مقیاس‌پذیر برای پلتفرم‌های مختلف بسازن.

🌍 حوزه‌های کاربردی #C

🎮 بازی‌سازی: ساخت بازی‌های 2D، 3D و حتی واقعیت افزوده و واقعیت مجازی با موتور قدرتمند Unity

🌐 وب: توسعه سایت‌ها و اپلیکیشن‌های وب سریع و حرفه‌ای با ASP.NET Core

🖥 دسکتاپ: ساخت اپلیکیشن‌های دسکتاپ با Windows Forms و WPF (برای ویندوز)

📱 موبایل کراس‌پلتفرم: توسعه اپ‌های اندروید و iOS با Xamarin و حالا MAUI

☁️ کلود (ابر): ساخت اپلیکیشن‌های ابری و سرویس‌های مقیاس‌پذیر با Azure

🤖 هوش مصنوعی و یادگیری ماشین: استفاده از ML.NET برای پیاده‌سازی مدل‌های یادگیری ماشین

🔌 اینترنت اشیا (IoT): کنترل و اتصال به دستگاه‌های هوشمند با سی شارپ

🔗میکروسرویس‌ها و API : توسعه وب API ها و سرویس‌های تحت وب سریع و مقیاس‌پذیر

🔖 هشتگ‌ها : #سی_شارپ_چیست

string channel = "CSharpGeeks" ;
💻 اولین برنامه (C# - A First C# Program)
سلام رفقا! تو این پست می‌خوایم اولین برنامه ساده #C رو بررسی کنیم.این برنامه از دو خط ساده تشکیل شده:

int x = 12 * 30; // Statement 1
System.Console.WriteLine(x); // Statement 2


Statement 1

عبارت 12 * 30 محاسبه میشه و نتیجه‌اش (360) داخل متغیر x از نوع int (عدد صحیح 32 بیتی) ذخیره میشه.


Statement 2

متد WriteLine از کلاس Console (که داخل فضای نام System هست) مقدار x رو توی پنجره کنسول چاپ می‌کنه.
📚 ساختار کلی برنامه #C
کدها توی #C به صورت بیان‌ها (Statements) نوشته میشن که با ; تموم میشن.

متدها مثل WriteLine توابعی هستن که داخل کلاس‌ها قرار دارن. کلاس‌ها هم کدها و داده‌ها رو دسته‌بندی می‌کنن.

کلاس Console مخصوص کار با ورودی و خروجی خط فرمانه و تو فضای نام System قرار داره.

🌐 فضاهای نام (Namespace)
فضای نام System شامل کلاس‌های پایه مثل Console هست.

استفاده از System.Console تو هر بار صدا زدن می‌تونه خسته‌کننده باشه. برای همین می‌تونیم بالای کد این خط رو اضافه کنیم:
using System;


و بعدش ساده‌تر بنویسیم:
Console.WriteLine(x);
🧱 بازنویسی برنامه با متد شخصی:
می‌تونیم کد رو حرفه‌ای‌تر کنیم و یه متد بنویسیم که این محاسبه رو انجام بده:
using System;

Console.WriteLine(FeetToInches(30)); // 360
Console.WriteLine(FeetToInches(100)); // 1200

int FeetToInches(int feet)
{
int inches = feet * 12;
return inches;
}

این متد FeetToInches یه ورودی می‌گیره و خروجی برمی‌گردونه. ورودی اسمش feet و خروجی هم تعداد اینچ‌هاست.
😎بدون ورودی و خروجی؟ مشکلی نیست!
مثلاً این مثال ساده:
using System;
SayHello();

void SayHello()
{
Console.WriteLine("Hello, world");
}
دستور ساخت پروژه کنسول جدید:
dotnet new console -n ProgramName


برای اجرای برنامه از پوشه پروژه:
dotnet run ProgramName


یا فقط کامپایل بدون اجرا:
dotnet build ProgramName
.csproj


💬 نگران نباش! اگه الان چیزی از این کدها نفهمیدی اصلاً اشکال نداره! 😎 چون تو پست‌های بعدی، دونه دونه همه‌ی این بخش‌ها رو به‌زبون ساده توضیح می‌دیم و با مثال‌های بیشتر یاد می‌گیری.

🔖 هشتگ‌ها :
#اولین_برنامه
#CSharp_پایه
#برنامه_نویسی
🚀 ساختار زبان برنامه نویسی (Syntax) در #C :

سلام به همه گیک‌های #C 🤓 تا حالا به این فکر کردید که چطور زبان #C کدهای ما رو می‌فهمه و اجرا می‌کنه؟ همه چیز برمی‌گرده به Syntax!
در این پست، می‌خوایم عناصر اساسی سینتکس #C رو بررسی کنیم که از C و ++C الهام گرفته.

بیاین با این تکه کد ساده شروع کنیم:
using System;
int x = 12 * 30;
Console.WriteLine (x);

این چند خط، دنیایی از مفاهیم سینتکسی رو در خودشون جا دادن!
--شناسه‌ها(Identifiers):
نام‌هایی هستند که ما برنامه‌نویس‌ها انتخاب می‌کنیم. مثلاً در کد بالا، System، x، Console و WriteLine همگی شناسه هستند.

-- قواعد مهم: به بزرگی و کوچکی حروف حساس‌اند (case-sensitive).

--کنوانسیون نام‌گذاری:

Camel Case (myLocalVariable)

برای پارامترها، متغیرهای محلی و فیلدهای خصوصی.

Pascal Case (MyLocakMethod)

برای بقیه شناسه‌ها (کلاس‌ها، متدها، Propertyها).

--کلمات کلیدی(Keywords):
واژه‌هایی هستند که برای کامپایلر معنی خاص و از پیش تعریف شده‌ای دارن. در مثال ما، using و int کلمات کلیدی هستند.

--کلمات کلیدی رزرو شده: بیشتر کلمات کلیدی #C رزرو شده‌اند و نمی‌توانید از آن‌ها به عنوان شناسه‌ی معمولی استفاده کنید. (مثل class, public, if, for و ...).

نکته باحال : اگر واقعاً مجبور شدید، می‌توانید با قرار دادن @ قبل از کلمه کلیدی، از آن به عنوان شناسه استفاده کنید:

int @using = 123;


کلمات کلیدی متنی(Contextual Keywords):
یک سری کلمات کلیدی هستند که در برخی زمینه‌ها معنی خاصی دارند ولی می‌توانید از آن‌ها به عنوان شناسه هم استفاده کنید، چون ابهامی ایجاد نمی‌کنند (مثل var, async, await, yield).
--لیترال‌ها(Literals):
داده‌های خام و ثابتی که مستقیماً در کد وارد می‌کنیم. در مثال بالا، 12 و 30 لیترال‌های عددی هستند.

--علامت‌های نگارشی(Punctuators):
به ساختار و خوانایی کد کمک می‌کنند. بارزترین مثال، سمی‌کالن (;) است که یک دستور رو به پایان می‌رسونه.

--عملگرها (Operators):
عملیات خاصی روی مقادیر(Operands) انجام میدن. در کد مثال ما، این عملگرها رو داریم:

= : عملگر انتساب (Assignment) که یک مقدار رو به یک متغیر اختصاص میده.

* : عملگر ضرب (Multiplication).


. : عملگر عضو (Member Access) برای دسترسی به اعضای یک کلاس یا شیء (مثل Console.WriteLine).

() : پرانتزها که برای فراخوانی متدها استفاده میشن. اگه متدی آرگومان نگیره، پرانتزها خالی میمونن.


🔖 هشتگ‌ها : #Syntax
📝 کامنت‌گذاری در #C:

سلام به گیک‌های منظم و آینده‌نگر!🧑‍💻
وقتی داریم کد می‌نویسیم، ممکنه یه جاهایی نیاز داشته باشیم توضیحاتی برای خودمون یا هم‌تیمی‌هامون بذاریم. اینجاست که کامنت‌ها (Comments) وارد عمل میشن! کامنت‌ها خطوطی از کد هستن که کامپایلر #C اصلاً بهشون کاری نداره و فقط برای ما برنامه‌نویس‌ها معنی دارن تا کد رو بهتر درک کنیم.

سی شارپ دو مدل کامنت‌گذاری اصلی و پرکاربرد داره که بهمون کمک می‌کنه کدمون همیشه خوانا و قابل فهم باشه:
1️⃣ کامنت‌های تک‌خطی:

(Single-Line Comments) //


کاربرد: بهترین گزینه برای توضیح یک خط کد
خاص، یا ارائه یک نکته کوتاه و مختصر.

نحوه استفاده: با دو تا اسلش رو به جلو (//) شروع میشه و تا پایان همون خط ادامه پیدا می‌کنه.

مثال کاربردی:
int counter = 0;  // This is a Comment

این کامنت‌ها برای وقتی که می‌خواید سریعاً یه توضیح کوچیک کنار کدتون بنویسید، فوق‌العاده‌ان!
2️⃣ کامنت‌های چندخطی:
(Multiline Comments) /* ... */


کاربرد: ایده‌آل برای توضیحات طولانی‌تر، شرح دادن یک بلوک کد بزرگ، یا حتی غیرفعال کردن موقتی چند خط کد.

نحوه استفاده: با /* شروع میشه و با */ به پایان می‌رسه و می‌تونه شامل چندین خط باشه.
مثال کاربردی‌تر:
/*
این بخش از کد مسئول محاسبه
مجموع اعداد ۱ تا ۱۰ است.
از یک حلقه for برای این کار استفاده شده.
*/
int sum = 0;
for (int i = 1; i <= 10; i++)
{
sum += i;
}

این کامنت‌ها زمانی به کار میان که نیاز به توضیح عمیق‌تر یا خلاصه‌ای از عملکرد یک بخش بزرگ‌تر از کد دارید.
💡نکته حرفه‌ای:
کامنت‌گذاری هوشمندانه، نه تنها کد شما رو برای بقیه (و خودتون در آینده!) مثل روز روشن می‌کنه، بلکه یک مستندسازی داخلی ارزشمند برای پروژه‌های بزرگ محسوب میشه. سعی کنید کامنت‌ها رو همیشه به‌روز نگه دارید و از کامنت‌های تکراری و بی‌فایده پرهیز کنید.
🔖 هشتگ‌ها : #Comments
💎 فوت و فن انواع داده (Types) در #C :
از صفر تا کلاس‌های سفارشی

هر برنامه‌نویس کاردرستی می‌دونه که برای نوشتن کدهای قدرتمند و تمیز، اول باید به مفهوم «انواع داده» (Types) مسلط شد. این مفهوم، مثل DNA برای داده‌های ما عمل می‌کنه.

فکر کنید هر Type، شناسنامه‌ی یه مقداره. این شناسنامه به #C میگه که این داده دقیقاً چیه، چه چیزایی تو خودش نگه می‌داره و چه کارایی از دستش برمیاد.

مثلاً، متغیر (Variable) رو داریم که مثل یه گاوصندوقه؛ هر لحظه می‌تونیم یه مقدار جدید توش بذاریم. در مقابل، ثابت (Constant) مثل یه سنگ‌نوشته‌ست؛ یه بار که تعریف شد، تا ابد همون باقی می‌مونه!

// 'x' یه متغیر از نوع int است.
int x = 12 * 30;
Console.WriteLine(x); // 360

// 'y' یک ثابت است که مقدارش غیرقابل تغییره.
const int y = 360;


نکته طلایی: 💡 در #C، هیچ مقداری بی‌هویت نیست. هر مقدار یک Type دارد که شخصیت و رفتارش را شکل می‌دهد.
🧰 ابزارهای آماده در جعبه‌ابزار #C :
سی‌شارپ یه سری Type آماده و پرکاربرد رو از اول در اختیارمون گذاشته که آچار فرانسه‌ی ما هستن. این سه تا از مهم‌ترین‌هاشونن:

int: سلطان اعداد

نماینده اعداد صحیح. هرجا به محاسبات، شمارنده‌ها یا هر نوع عملیات ریاضی نیاز دارید، int اولین و بهترین انتخاب شماست.
int soldItems = 99;
int stock = 1000 - soldItems;


string: استاد کار با متن

برای نمایش و دستکاری هر نوع داده متنی، از نام کاربری گرفته تا یک پیام طولانی. قدرت واقعی string در متدهای بی‌نظیرشه.
string rawEmail = "  TestUser@example.com  ";
// فضای خالی رو حذف و همه رو به حروف کوچک تبدیل می‌کنه
string cleanEmail = rawEmail.Trim().ToLower();
Console.WriteLine(cleanEmail); // testuser@example.com


bool: فرمانده‌ی منطق برنامه

این نوع فقط دو حالت می‌شناسه: true یا false. تمام تصمیم‌های پیچیده برنامه، از بررسی اجازه دسترسی گرفته تا فعال یا غیرفعال کردن یک ویژگی، زیر سر همین bool هست.
bool hasPermission = true;
if (hasPermission)
{
Console.WriteLine("Access Granted");
}
🏗 اینجا قضیه جدی میشه: ساختن Typeهای شخصی!
قدرت واقعی شما به عنوان یه توسعه‌دهنده، زمانی شکوفا میشه که دیگه فقط از ابزارهای آماده استفاده نمی‌کنید، بلکه با استفاده از class، ابزارهای تخصصی خودتون رو می‌سازید. اینجا شما خالق هستید.

مثلاً، فرض کنید یه مبدل واحد نیاز داریم. به جای اینکه فرمول تبدیل رو همه جای کد پخش کنیم، یک بار برای همیشه یه class براش می‌سازیم.

ببینید چقدر تمیز و حرفه‌ای ازش استفاده می‌کنیم:
var feetToInchesConverter = new UnitConverter(12);
var milesToFeetConverter = new UnitConverter(5280);

int lengthInInches = feetToInchesConverter.Convert(30);
Console.WriteLine($"30 feet is {lengthInInches} inches."); // 30 feet is 360 inches.


و اینم نقشه‌ی ساخت اون ابزار قدرتمند:
public class UnitConverter
{
// فیلد داخلی برای نگهداری منطق
private readonly int ratio;

// با این تابع، بهش میگیم با چه فرمولی کار کنه
public UnitConverter(int unitRatio)
{
this.ratio = unitRatio;
}

// و اینم خودِ عملیات تبدیل که انجام میده
public int Convert(int unit)
{
return unit * this.ratio;
}
}
🥊 دوئل حافظه در #C :
Value Types در برابر Reference Types


تا حالا شده یه متغیر رو جایی عوض کنی و ببینی یه جای دیگه هم ناخواسته تغییر کرده؟ یا برعکس، انتظار داشتی تغییر کنه ولی نکرده؟ ریشه ۹۰٪ این مشکلات، درک نکردن تفاوت بین Value Type و Reference Type هست.

این بحث فقط یه تئوری خشک و خالی نیست، بلکه کلید نوشتن کدهای بدون باگ و قابل پیش‌بینیه. بزن بریم این راز بزرگ رو کشف کنیم!

Value Types: کپی برابر اصل

فکر کنید Value Type مثل یه تیکه کاغذه. وقتی اون رو به متغیر دیگه‌ای میدین، یه کپی کامل ازش گرفته میشه. حالا هر بلایی سر اون کپی بیاد، کاغذ اصلی شما صحیح و سالمه!

شامل چه چیزایی میشه؟ تمام انواع عددی (int, double و...)، bool، char و مهم‌تر از همه، structها.
بیاین با مثال Point که به صورت struct تعریف شده ببینیم:

public struct Point { public int X, Y; }

Point p1 = new Point();
p1.X = 7;

// این خط، یک کپی کامل از p1 در p2 ایجاد می‌کنه
Point p2 = p1;

// حالا p1 و p2 دو موجودیت کاملاً جدا در حافظه هستن
Console.WriteLine($"p1.X: {p1.X}, p2.X: {p2.X}");
// p1.X: 7
// p2.X: 7

// اگه p1 رو تغییر بدیم، هیچ تأثیری روی p2 نداره
p1.X = 9;

Console.WriteLine($"p1.X: {p1.X}, p2.X: {p2.X}");
// p1.X: 9
// p2.X: 7

همونطور که می‌بینید، p2 زندگی خودشو داره و از تغییر p1 خبردار هم نمیشه!


Reference Types: یک آدرس، چند نفر

حالا فکر کنید Reference Type مثل کلید یه خونه‌ست. شما خودِ خونه رو به کسی نمیدین، فقط یه کلید ازش کپی می‌کنید و بهش میدین. هر کسی که کلید رو داشته باشه، می‌تونه بره داخل و دکوراسیون رو عوض کنه و این تغییر برای همه اونایی که کلید دارن، قابل مشاهده‌ست!

شامل چه چیزایی میشه؟ تمام classها، string، آرایه‌ها، delegateها و interfaceها.
حالا همون مثال Point رو این بار به صورت class تعریف می‌کنیم:

public class Point { public int X, Y; }

// ...

Point p1 = new Point();
p1.X = 7;

// این خط، فقط آدرس (رفرنس) p1 رو در p2 کپی می‌کنه
// حالا هر دو به یک آبجکت در حافظه اشاره دارن
Point p2 = p1;

Console.WriteLine($"p1.X: {p1.X}, p2.X: {p2.X}");
// p1.X: 7
// p2.X: 7

// اگه p1 رو تغییر بدیم، چون p2 هم به همون خونه نگاه می‌کنه، اونم تغییر رو می‌بینه
p1.X = 9;

Console.WriteLine($"p1.X: {p1.X}, p2.X: {p2.X}");
// p1.X: 9,
// p2.X: 9

اینجا دیگه p1 و p2 شریک جرم هستن! تغییر روی یکی، روی اون یکی هم تأثیر میذاره.

🔖 هشتگ‌ها : #MemoryManagement