آموزش C# و .Net
1.55K subscribers
427 photos
325 videos
19 files
2.79K links
تعرفه تبلیغات :
https://t.me/+w-o6dHW5O31jMWNk

آیدی ادمین:
@ma_limbs
Download Telegram
⚠️ با `#nullable enable` در C#، کامپایلر به شما کمک می‌کنه خطاهای NullReferenceException رو در زمان کامپایل پیدا کنید.

بهترین شیوه اینه که این قابلیت رو در پروژه‌های جدید فعال کنید و در پروژه‌های قدیمی، به تدریج و فایل به فایل فعالش کنید.

💡 یادتون باشه، فعال کردن این قابلیت به تنهایی کافی نیست، باید کدتون رو هم اصلاح کنید تا کامپایلر دیگه اخطار نده!

https://t.me/csharp7
🔵 دوست داری برنامه نویس حرفه ای بشی یا مهارت های کامپیوتری خودت رو افزایش بدی؟ با عضویت در لیست تلگرامی زیر در بی نظیر ترین کانال های برنامه نویسی ما عضو شوید:

🟢 پایتون، هوش مصنوعی، یادگیری ماشین، سی ++، سی شارپ، دات نت، نود جی اس، جاوا اسکریپت، شبکه، علم داده، پایگاه داده، sql، nosql ، مهارت های ICDL، سیستم عامل، لینوکس، فتوشاپ، گرافیک، اندروید، جاوا، ساخت اپلیکیشن موبایل، ری اکت، جی کوئری، php و laravel، دروس رشته کامپیوتر، کنکور کامپیوتر و ...

عضو لیست جامع شوید:

https://t.me/addlist/_UjG99eD_E4zYzhk
https://t.me/addlist/_UjG99eD_E4zYzhk
https://t.me/addlist/_UjG99eD_E4zYzhk
‏متدهای struct در C# به‌طور پیش‌فرض کپی می‌گیرند. ⚙️

‏اما با `in parameter` در متد struct، از کپی کردن مقدار جلوگیری می‌شود و performance بهبود می‌یابد. 🚀

‏`in` تضمین می‌کند مقدار struct در متد تغییر نکند. 🛡️

https://t.me/csharp7
‏structها در C# به‌طور پیش‌فرض Equality رو بر اساس "مقایسه‌ی سطحی" (shallow comparison) انجام میدن. یعنی تک‌تک فیلدهاشون با هم برابر باشن.

‏اما برای مقایسه‌ی عمیق‌تر (deep comparison) و کنترل بیشتر، اینترفیس `IEquatable<T>` رو پیاده‌سازی کنید.
```csharp
struct MyStruct : IEquatable<MyStruct>
{
public int Value { get; set; }

public bool Equals(MyStruct other)
{
return Value == other.Value;
}
}
```
‏با این کار، منطق دلخواه خودتون رو برای مقایسه تعریف می‌کنید. ⚙️🧰

https://t.me/csharp7
💠 عضو جامع ترین کانال های توسعه فردی، روانشناسی و موفقیت شوید:

➡️ https://t.me/addlist/AX8uaLK6gE1jNzg0

➡️ https://t.me/addlist/AX8uaLK6gE1jNzg0

شامل موضوعات آموزشی زیر:

توسعه و رشد فردی
افزایش ثروت
هدف گذاری و مدیریت زمان
مهارت های اجتماعی، ارتباطی و فن بیان
روانشناسی و خودیاری
موفقیت
عادات موثر
سلامت و تغذیه سالم
موفقیت شغلی
عبارات تاکیدی
مدیریت اضطراب و خشم
روان درمانی CBT و ACT
شخصیت شناسی و تحلیل روانشناسی
انگیزشی
کودک درون
تکنیک های NLP
یوگا
افزایش حافظه
مدیتیشن
موفقیت تحصیلی
مطالعه موثر
افزایش اعتماد به نفس
افزایش تمرکز
تفکر مثبت
افزایش خلاقیت
نقل قول های انگیزشی

با کلیک بر روی لینک زیر عضو تمامی این کانال ها شوید:

➡️ https://t.me/addlist/AX8uaLK6gE1jNzg0

➡️ https://t.me/addlist/AX8uaLK6gE1jNzg0
🔵 کوییز #سی_شارپ

🟣 موضوع : ‏معرفی و کاربرد Entity Framework

🟢 سوال :

‏کدام یک از موارد زیر یک روش برای به‌روزرسانی پایگاه داده در Entity Framework است؟

گزینه ۱:
‏استفاده از دستورات SQL

گزینه ۲:
‏استفاده از Migrations

گزینه ۳:
‏استفاده از متدهای ADO.NET

گزینه ۴:
‏استفاده از توابع بازگشتی

🔵 گزینه صحیح: 2

🟢 توضیح :

‏Migrations برای به‌روزرسانی پایگاه داده در Entity Framework استفاده می‌شود.

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir
🔵 با عضویت در لیست تلگرامی جامع آموزش زبان زیر عضو بی نظیرترین‌ و کامل ترین مجموعه آموزش زبان انگلیسی تلگرامی شوید:

🟢 پادکست، کوییز، گرامر، آیلتس، تافل، ویدیو، آموزش زبان به کودکان، اصطلاحات انگلیسی، زبان کنکور و ... :

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
‏C# از نسخه 9 به بعد، قابلیتی به نام Top-Level Statements داره.
‏دیگه لازم نیست یه برنامه کنسولی ساده رو حتماً داخل namespace و class تعریف کنید.

```csharp
‏// کد قبلی
namespace MyApp;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}

‏// کد جدید
Console.WriteLine("Hello World!");
```

‏حتی می‌تونید از using statement هم استفاده کنید:
```csharp
using System;
Console.WriteLine("Hello World!");
```
‏به همین سادگی! 😎

https://t.me/csharp7
🔵 با عضویت در لیست تلگرامی جامع آموزش زبان زیر عضو بی نظیرترین‌ و کامل ترین مجموعه آموزش زبان انگلیسی تلگرامی شوید:

🟢 پادکست، کوییز، گرامر، آیلتس، تافل، ویدیو، آموزش زبان به کودکان، اصطلاحات انگلیسی، زبان کنکور و ... :

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
‏`ref struct`ها در C# از تخصیص heap جلوگیری می‌کنند. 🗑️

‏اما در iteratorها (مانند `yield return`) نمی‌توانید از `ref struct` استفاده کنید. 🚫 چون iteratorها state machine هستند و ممکن است بین `yield`ها، `ref struct` از scope خارج شود.

‏بنابراین، کامپایلر اجازه نمی‌دهد `ref struct` را در iterator به کار ببرید. ⚙️

https://t.me/csharp7
‏متد `Main` در C# می‌تونه آرگومان بگیره. ⚙️

‏این آرگومان به صورت یک آرایه از رشته‌ها (`string[] args`) به متد پاس داده می‌شه.

‏این آرایه شامل آرگومان‌هایی هست که هنگام اجرای برنامه از طریق خط فرمان وارد شدن. می‌تونید از این آرگومان‌ها برای پیکربندی برنامه یا تعیین رفتارهای مختلف استفاده کنید. 💻

‏به این الگو، Args pattern گفته میشه.

https://t.me/csharp7
‏در C#، قرارداد نام‌گذاری PascalCase برای نام کلاس‌ها، متدها و پراپرتی‌ها رایج است. این به این معناست که حرف اول هر کلمه در نام، با حرف بزرگ شروع می‌شود.

‏مثال برای نام کلاس:
public class CustomerAccount
{
// ...
}


‏مثال برای نام متد:
public void CalculateTotalPrice()
{
// ...
}


‏مثال برای نام پراپرتی:
public string CustomerName { get; set; }


‏این قرارداد نام‌گذاری به خوانایی بهتر کد و درک سریع‌تر ساختار آن کمک می‌کند. 📝

https://t.me/csharp7
🔵 دوست داری برنامه نویس حرفه ای بشی یا مهارت های کامپیوتری خودت رو افزایش بدی؟ با عضویت در لیست تلگرامی زیر در بی نظیر ترین کانال های برنامه نویسی ما عضو شوید:

🟢 پایتون، هوش مصنوعی، یادگیری ماشین، سی ++، سی شارپ، دات نت، نود جی اس، جاوا اسکریپت، شبکه، علم داده، پایگاه داده، sql، nosql ، مهارت های ICDL، سیستم عامل، لینوکس، فتوشاپ، گرافیک، اندروید، جاوا، ساخت اپلیکیشن موبایل، ری اکت، جی کوئری، php و laravel، دروس رشته کامپیوتر، کنکور کامپیوتر و ...

عضو لیست جامع شوید:

https://t.me/addlist/_UjG99eD_E4zYzhk
https://t.me/addlist/_UjG99eD_E4zYzhk
https://t.me/addlist/_UjG99eD_E4zYzhk
‏برای اجرای یک حلقه for ساده در C# که اعداد از 1 تا 10 را نمایش می‌دهد، می‌توانید از کد زیر استفاده کنید:

for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);
}


‏در این مثال:
‏- int i = 1; : متغیر شمارنده i را با مقدار اولیه 1 تعریف و مقداردهی می‌کند.
‏- i <= 10; : شرط ادامه حلقه است. حلقه تا زمانی که i کوچکتر یا مساوی 10 باشد، ادامه پیدا می‌کند.
‏- i++ : پس از هر بار اجرای بدنه حلقه، مقدار i را یکی افزایش می‌دهد.
‏- Console.WriteLine(i); : مقدار فعلی i را در خروجی نمایش می‌دهد.

‏این حلقه 10 بار اجرا شده و اعداد 1 تا 10 را یکی یکی در کنسول چاپ خواهد کرد. 🔢💻

https://t.me/csharp7
🔵 با عضویت در لیست تلگرامی جامع آموزش زبان زیر عضو بی نظیرترین‌ و کامل ترین مجموعه آموزش زبان انگلیسی تلگرامی شوید:

🟢 پادکست، کوییز، گرامر، آیلتس، تافل، ویدیو، آموزش زبان به کودکان، اصطلاحات انگلیسی، زبان کنکور و ... :

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
‏در توسعه اپلیکیشن‌های دسکتاپ با WPF، الگوی MVVM (Model-View-ViewModel) به سازماندهی کد و افزایش قابلیت تست‌پذیری کمک شایانی می‌کند. بخش View در این الگو، مسئول نمایش رابط کاربری و تعامل با کاربر است و معمولاً با استفاده از زبان XAML پیاده‌سازی می‌شود.

‏XAML (eXtensible Application Markup Language) یک زبان مبتنی بر XML است که برای تعریف رابط کاربری در WPF به کار می‌رود. با استفاده از XAML، می‌توانید عناصر بصری مانند دکمه‌ها، جعبه‌های متن، پنجره‌ها و طرح‌بندی‌ها را به صورت деклараانه تعریف کنید. این رویکرد، جداسازی منطق برنامه (ViewModel) از نمایش بصری (View) را تسهیل می‌کند.

‏برای پیاده‌سازی View در MVVM با WPF، معمولاً از موارد زیر استفاده می‌شود:

کنترل‌های WPF: مانند `Window`, `UserControl`, `Button`, `TextBlock`, `TextBox` و غیره.
Data Binding: مکانیسم قدرتمندی که امکان اتصال داده‌ها در ViewModel به عناصر UI در View را فراهم می‌کند. این اتصال می‌تواند یک‌طرفه (از ViewModel به View یا بالعکس) یا دوطرفه باشد.
Command Binding: برای اتصال رویدادهای UI (مانند کلیک دکمه) به دستورات (Commands) تعریف شده در ViewModel.
Templates و Styles: برای سفارشی‌سازی ظاهر و رفتار کنترل‌ها و ایجاد رابط‌های کاربری جذاب و یکپارچه.

‏به عنوان مثال، یک View ساده در XAML می‌تواند به این شکل باشد:

<Window x:Class="MyWpfApp.Views.MyView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyWpfApp.Views"
mc:Ignorable="d"
Title="My Application" Height="450" Width="800">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="{Binding GreetingMessage}" FontSize="24" Margin="10"/>
<Button Content="Click Me" Command="{Binding GreetCommand}" Margin="10"/>
</StackPanel>
</Window>


‏در این مثال، TextBlock پیام را از GreetingMessage در ViewModel دریافت می‌کند و Button به GreetCommand در ViewModel متصل است. این جداسازی باعث می‌شود که تغییرات در ظاهر UI (View) کمتر بر منطق برنامه (ViewModel) تأثیر بگذارد و بالعکس. 🖼️

https://t.me/csharp7
‏ویژگی جالب #C 11: اینترفیس‌های Generic Math!

‏اینترفیس‌هایی مثل `INumberBase<T>`, `IAdditionOperators<T, T, T>` و ده‌ها مورد دیگه، امکان تعریف عملیات ریاضی Generic رو فراهم می‌کنند.

‏با این قابلیت، میشه توابع و کلاس‌هایی نوشت که با انواع عددی مختلف (مثل `int`, `float`, `decimal`) کار می‌کنند، بدون نیاز به Overloadهای متعدد! 🤓

https://t.me/csharp7
🔵 دوست داری برنامه نویس حرفه ای بشی یا مهارت های کامپیوتری خودت رو افزایش بدی؟ با عضویت در لیست تلگرامی زیر در بی نظیر ترین کانال های برنامه نویسی ما عضو شوید:

🟢 پایتون، هوش مصنوعی، یادگیری ماشین، سی ++، سی شارپ، دات نت، نود جی اس، جاوا اسکریپت، شبکه، علم داده، پایگاه داده، sql، nosql ، مهارت های ICDL، سیستم عامل، لینوکس، فتوشاپ، گرافیک، اندروید، جاوا، ساخت اپلیکیشن موبایل، ری اکت، جی کوئری، php و laravel، دروس رشته کامپیوتر، کنکور کامپیوتر و ...

عضو لیست جامع شوید:

https://t.me/addlist/_UjG99eD_E4zYzhk
https://t.me/addlist/_UjG99eD_E4zYzhk
https://t.me/addlist/_UjG99eD_E4zYzhk
📚 نکته #SQLite

🟣 موضوع : ‏بررسی و مقایسه انواع ذخیره‌سازی داده‌ها در SQLite
📖 سرفصل : ‏صفحات (Pages) و انواع آن‌ها

نکته 1:
‏صفحات (Pages) کوچک‌ترین واحد ذخیره‌سازی و ورودی/خروجی (I/O) در فایل پایگاه داده SQLite محسوب می‌شوند و اندازه‌ای ثابت دارند.

نکته 2:
‏اندازه یک صفحه از ۵۱۲ بایت تا ۶۵۵۳۶ بایت متغیر است و در زمان ایجاد پایگاه داده تعیین شده و در هدر (Header) فایل ثبت می‌شود.

نکته 3:
‏هر صفحه با یک شماره صفحه (Page Number) منحصربه‌فرد آدرس‌دهی می‌شود که صفحه شماره ۱ همواره شامل هدر پایگاه داده و ریشه B-tree طرح‌واره (Schema) است.

نکته 4:
‏صفحات از نظر نوع به طور عمده شامل صفحات B-tree برای داده‌ها و اندیس‌ها، و صفحات سیستمی مانند Freelist Pages هستند.

نکته 5:
‏صفحات B-tree داخلی (Interior Pages) حاوی کلیدها و اشاره‌گرهایی به صفحات فرزند در سطوح پایین‌تر درخت هستند و هیچ داده کاربری را مستقیماً ذخیره نمی‌کنند.

نکته 6:
‏صفحات B-tree برگ (Leaf Pages) پایین‌ترین سطح درخت B-tree را تشکیل می‌دهند و وظیفه نگهداری داده‌های واقعی سطرها در جدول یا مقادیر اندیس را بر عهده دارند.

نکته 7:
‏صفحات Freelist برای ردیابی صفحاتی به کار می‌روند که حاوی داده‌های معتبری نیستند (مانند صفحاتی که تمامی سطرهای آن‌ها حذف شده‌اند) و آماده استفاده مجدد هستند.

نکته 8:
‏هر صفحه دارای یک هدر صفحه (Page Header) در ابتدای خود است که شامل اطلاعاتی مانند نوع صفحه، نشانگرهای فضای آزاد محلی و اشاره‌گر به والدین یا فرزندان (بسته به نوع صفحه) است.

نکته 9:
‏مدیریت حافظه پنهان (Cache Management) SQLite کاملاً بر اساس صفحات صورت می‌گیرد؛ یعنی، داده‌ها از دیسک به حافظه و بالعکس، به صورت واحد صفحه منتقل می‌شوند.

نکته 10:
‏یکپارچگی و سازگاری صفحات در طول تراکنش‌ها با استفاده از مکانیزم‌های Journaling تضمین می‌شود که تغییرات موقت را قبل از دائمی‌سازی در صفحات اصلی ثبت می‌کنند.


ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir
‏ObjectPool قالبی برای مدیریت اشیاء پرهزینه است. ♻️

‏به جای ایجاد و حذف مکرر این اشیاء، آن‌ها را در یک Pool نگهداری و دوباره استفاده می‌کنیم. 🧰

‏این کار، سربار ایجاد و حذف را کاهش داده و عملکرد را بهبود می‌بخشد. 🚀 برای مثال، در بازی‌سازی برای مدیریت گلوله‌ها کاربرد دارد.

https://t.me/csharp7
‏در C#، شما می‌توانید رویدادهای سفارشی خود را با قابلیت ارسال داده‌های خاص ایجاد کنید. این کار به شما امکان می‌دهد تا هنگام وقوع یک اتفاق در برنامه، اطلاعات مرتبط را همراه با اعلان رویداد به شنوندگان (event handlers) ارسال کنید.

‏برای این منظور، ابتدا باید یک کلاس برای داده‌های رویداد (Event Data) ایجاد کنید که از EventArgs ارث‌بری می‌کند. این کلاس می‌تواند شامل هر نوع داده‌ای باشد که می‌خواهید ارسال کنید.

public class MyCustomEventArgs : EventArgs
{
public string Message { get; }
public int Value { get; }

public MyCustomEventArgs(string message, int value)
{
Message = message;
Value = value;
}
}


‏سپس، در کلاسی که رویداد را تعریف می‌کند، از این کلاس سفارشی برای تعریف نوع داده‌های رویداد استفاده کنید. تعریف رویداد معمولاً شامل یک delegate و یک event است.

public class EventPublisher
{
‏ // تعریف delegate برای رویداد سفارشی
public delegate void MyCustomEventHandler(object sender, MyCustomEventArgs e);

‏ // تعریف رویداد با استفاده از delegate
public event MyCustomEventHandler CustomEvent;

public void TriggerCustomEvent(string msg, int val)
{
‏ // ایجاد نمونه‌ای از داده‌های رویداد
MyCustomEventArgs args = new MyCustomEventArgs(msg, val);

‏ // فراخوانی رویداد در صورت وجود شنونده
OnCustomEvent(args);
}

protected virtual void OnCustomEvent(MyCustomEventArgs e)
{
‏ // کپی کردن رویداد برای جلوگیری از رقابت وضعیت (thread-safety)
MyCustomEventHandler handler = CustomEvent;
handler?.Invoke(this, e);
}
}


‏در نهایت، کلاس‌های دیگر می‌توانند با اشتراک در این رویداد، هنگام وقوع آن، داده‌های ارسالی را دریافت و پردازش کنند.

public class EventSubscriber
{
public void Subscribe(EventPublisher publisher)
{
publisher.CustomEvent += Publisher_CustomEvent;
}

private void Publisher_CustomEvent(object sender, MyCustomEventArgs e)
{
‏ Console.WriteLine($"رویداد دریافت شد! پیام: {e.Message}, مقدار: {e.Value}");
}
}


‏این روش امکان انتقال اطلاعات دقیق و سفارشی را بین بخش‌های مختلف برنامه از طریق مکانیسم رویداد فراهم می‌آورد. 🚀💡

https://t.me/csharp7