This media is not supported in your browser
VIEW IN TELEGRAM
آشنایی با دو قابلیت جدید در ویژوال استودیو
اگر با Razor در توسعه وب کار میکنید، خبر خوب اینکه دو قابلیت جدید در Visual Studio و VS Code اضافه شده که حسابی کار شما را راحتتر میکند:
🔹 «استخراج کامپوننت» (Extract to Component):
با این قابلیت میتوانید فقط با چند کلیک، بخشهایی از کد HTML را به یک کامپوننت جداگانه تبدیل کنید. دیگر نیازی به کپیپیست و ساخت دستی فایل نیست!
🔹 «توکنایزر جدید سیشارپ» با پشتیبانی از Roslyn:
این بهروزرسانی باعث میشود Razor بهتر بتواند کدهای سیشارپ را پردازش کند؛ از جمله raw string literals، رشتههای verbatim و حتی دستورهای پیشپردازنده.
📌 این قابلیتها فعلاً در نسخههای جدید Visual Studio و NET 9. فعال هستند و قرار است در NET 10. بهصورت پیشفرض فعال باشند.
🔗 بیشتر بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
اگر با Razor در توسعه وب کار میکنید، خبر خوب اینکه دو قابلیت جدید در Visual Studio و VS Code اضافه شده که حسابی کار شما را راحتتر میکند:
🔹 «استخراج کامپوننت» (Extract to Component):
با این قابلیت میتوانید فقط با چند کلیک، بخشهایی از کد HTML را به یک کامپوننت جداگانه تبدیل کنید. دیگر نیازی به کپیپیست و ساخت دستی فایل نیست!
🔹 «توکنایزر جدید سیشارپ» با پشتیبانی از Roslyn:
این بهروزرسانی باعث میشود Razor بهتر بتواند کدهای سیشارپ را پردازش کند؛ از جمله raw string literals، رشتههای verbatim و حتی دستورهای پیشپردازنده.
📌 این قابلیتها فعلاً در نسخههای جدید Visual Studio و NET 9. فعال هستند و قرار است در NET 10. بهصورت پیشفرض فعال باشند.
🔗 بیشتر بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
1👍7❤2🔥1
شیء (Object) در سیشارپ
#csharp_for_beginners
در زبان سیشارپ، یک شیء نمایندهی یک نمونه (instance) از یک نوع است، که این نوع میتواند یک کلاس (class) یا یک ساختار (struct) باشد. یک کلاس یا ساختار مانند نقشهای (blueprint) است که مشخص میکند نوع، چه دادهها و رفتارهایی دارد، و شیء بخشی از حافظه است که مطابق این نقشه ایجاد و پیکربندی میشود. برنامه ممکن است چندین شیء از یک کلاس ایجاد کند.
شیءها همچنین میتوانند در متغیرها، آرایهها یا مجموعهها ذخیره شوند. کد مشتری (client code) از این متغیرها برای فراخوانی متدها و دسترسی به خصوصیات عمومی شیء استفاده میکند.
نمونههای ساختار (Struct) و کلاس (Class)
کلاسها
- کلاسها نوع ارجاعی (reference type) هستند.
- متغیر یک شیء کلاس آدرس حافظه آن شیء در heap مدیریتشده را نگه میدارد.
- اگر یک متغیر کلاس به متغیر دیگر نسبت داده شود، هر دو متغیر به همان شیء اشاره میکنند.
- نمونههای کلاس معمولاً با عملگر new ایجاد میشوند.
مثال:
استراکتها
- استراکتها نوع مقداری (value type) هستند.
- متغیر یک struct، یک کپی کامل از شیء را نگه میدارد.
- نمونههای struct میتوانند با new ایجاد شوند، اما الزامی نیست.
مثال:
نکات مهم حافظه
- حافظهی کلاسها در managed heap ذخیره میشود و توسط garbage collector بازیابی میشود.
- حافظهی structها معمولاً در stack ذخیره میشود و هنگام خروج از محدوده از بین میرود.
- این تفاوت دلیل رفتار متفاوت در کپی و مقایسه بین کلاس و struct است.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
در زبان سیشارپ، یک شیء نمایندهی یک نمونه (instance) از یک نوع است، که این نوع میتواند یک کلاس (class) یا یک ساختار (struct) باشد. یک کلاس یا ساختار مانند نقشهای (blueprint) است که مشخص میکند نوع، چه دادهها و رفتارهایی دارد، و شیء بخشی از حافظه است که مطابق این نقشه ایجاد و پیکربندی میشود. برنامه ممکن است چندین شیء از یک کلاس ایجاد کند.
شیءها همچنین میتوانند در متغیرها، آرایهها یا مجموعهها ذخیره شوند. کد مشتری (client code) از این متغیرها برای فراخوانی متدها و دسترسی به خصوصیات عمومی شیء استفاده میکند.
نمونههای ساختار (Struct) و کلاس (Class)
کلاسها
- کلاسها نوع ارجاعی (reference type) هستند.
- متغیر یک شیء کلاس آدرس حافظه آن شیء در heap مدیریتشده را نگه میدارد.
- اگر یک متغیر کلاس به متغیر دیگر نسبت داده شود، هر دو متغیر به همان شیء اشاره میکنند.
- نمونههای کلاس معمولاً با عملگر new ایجاد میشوند.
مثال:
Person person1 = new Person("Leopold", 6);
Person person2 = person1;
person2.Name = "Molly";
// حالا person1.Name هم "Molly" است، زیرا هر دو به یک شیء اشاره دارنداستراکتها
- استراکتها نوع مقداری (value type) هستند.
- متغیر یک struct، یک کپی کامل از شیء را نگه میدارد.
- نمونههای struct میتوانند با new ایجاد شوند، اما الزامی نیست.
مثال:
Person p1 = new Person("Alex", 9);
Person p2 = p1;
p2.Name = "Spencer";
// p1 تغییر نکرده است، زیرا p2 کپی مستقل استنکات مهم حافظه
- حافظهی کلاسها در managed heap ذخیره میشود و توسط garbage collector بازیابی میشود.
- حافظهی structها معمولاً در stack ذخیره میشود و هنگام خروج از محدوده از بین میرود.
- این تفاوت دلیل رفتار متفاوت در کپی و مقایسه بین کلاس و struct است.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
Docs
Objects - create instances of types - C#
C# uses a class or struct definition to define types of objects. In an object-oriented language such as C#, a program consists of objects interacting dynamically.
❤3👍1
ساخت اپلیکیشنهای هوش مصنوعی با Chroma در NET.
اگر دنبال ارتقای پروژههای NET. با قابلیتهای جستجوی هوشمند هستید، حالا میتوانید از Chroma استفاده کنید، یک پایگاه داده متنباز مخصوص اپهای AI!
📌 اما Chroma چیست؟
پایگاه دادهای برای ذخیرهسازی embeddingها، جستجوی vector، فیلتر متادیتا، full-text search و بازیابی multi-modal (چند رسانهای). مناسب برای پیادهسازی قابلیتهایی مثل جستجوی semantic و RAG.
🛠 چگونه از Chroma استفاده کنیم؟
با پکیج ChromaDB.Client در سیشارپ میتوانید به راحتی به دیتابیس وصل شوید، مجموعهای بسازید، دادهها را اضافه کنید و با vector search، اطلاعات مرتبط را پیدا کنید.
۱. نصب
۲. ساخت یک ChromaClient
۳. ساخت کالکشن
۴. ادامه نمونه کدها به همراه توضیحات رو میتوانید از این لینک مشاهده کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
اگر دنبال ارتقای پروژههای NET. با قابلیتهای جستجوی هوشمند هستید، حالا میتوانید از Chroma استفاده کنید، یک پایگاه داده متنباز مخصوص اپهای AI!
📌 اما Chroma چیست؟
پایگاه دادهای برای ذخیرهسازی embeddingها، جستجوی vector، فیلتر متادیتا، full-text search و بازیابی multi-modal (چند رسانهای). مناسب برای پیادهسازی قابلیتهایی مثل جستجوی semantic و RAG.
🛠 چگونه از Chroma استفاده کنیم؟
با پکیج ChromaDB.Client در سیشارپ میتوانید به راحتی به دیتابیس وصل شوید، مجموعهای بسازید، دادهها را اضافه کنید و با vector search، اطلاعات مرتبط را پیدا کنید.
۱. نصب
۲. ساخت یک ChromaClient
using ChromaDB.Client;
var configOptions = new ChromaConfigurationOptions(uri: "http://localhost:8000/api/v1/");
using var httpClient = new HttpClient();
var client = new ChromaClient(configOptions, httpClient);
۳. ساخت کالکشن
var collection = await client.GetOrCreateCollection("movies");
var collectionClient = new ChromaCollectionClient(collection, configOptions, httpClient);۴. ادامه نمونه کدها به همراه توضیحات رو میتوانید از این لینک مشاهده کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
Microsoft News
Building .NET AI apps with Chroma
Get started building AI applications using Chroma DB using the C# client SDK.
👍5❤3🔥1
باکسینگ (Boxing) و آنباکسینگ (Unboxing)
#csharp_for_beginners
باکسینگ (Boxing)
باکسینگ Boxing زمانی اتفاق میافتد که یک مقدار از نوعهای مقداری مثل int یا double به یک نوع مرجع مانند object تبدیل شود. در این فرایند یک شیء جدید در حافظهٔ heap ایجاد میشود و مقدار داخل آن قرار میگیرد. بعد از انجام باکسینگ Boxing، مقدار اولیه و مقدار قرار دادهشده داخل شیء دو دادهی جداگانه خواهند بود و این عملیات به دلیل ایجاد شیء جدید از نظر عملکردی هزینهبر است.
نمونه کد:
آنباکسینگ (Unboxing)
اما Unboxing تبدیل برعکس Boxing است و زمانی رخ میدهد که بخواهیم مقدار موجود در یک شیء از نوع object را دوباره به نوع مقداری اصلی خود تبدیل کنیم. این کار باید به صورت صریح انجام شود، یعنی لازم است نوع مقصد را حتماً با cast مشخص کنیم. در زمان اجرای برنامه بررسی میشود که آیا شیء واقعاً حاصل یک عملیات Boxing از همان نوع مقداری مورد انتظار هست یا خیر. اگر بررسی موفق باشد، مقدار ذخیره شده در heap به یک متغیر مقداری کپی میشود. اما اگر شیء تهی (null) باشد یا نوع واقعی آن با نوعی که انتظار داریم مطابقت نداشته باشد، برنامه خطاهایی مانند NullReferenceException یا InvalidCastException تولید میکند.
نمونه کد:
نمونهٔ خطا:
باکسینگ Boxing و آنباکسینگ Unboxing به دلیل تخصیص حافظه و بررسی نوع در زمان اجرا از نظر عملکردی هزینهبر هستند. در بخشهایی از برنامه که این عملیات زیاد انجام میشود ممکن است باعث کاهش کارایی شوند. برای جلوگیری از این مشکل، استفاده از Genericها میتواند بسیار مؤثر باشد زیرا تبدیلهای غیرضروری را حذف میکند.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
باکسینگ (Boxing)
باکسینگ Boxing زمانی اتفاق میافتد که یک مقدار از نوعهای مقداری مثل int یا double به یک نوع مرجع مانند object تبدیل شود. در این فرایند یک شیء جدید در حافظهٔ heap ایجاد میشود و مقدار داخل آن قرار میگیرد. بعد از انجام باکسینگ Boxing، مقدار اولیه و مقدار قرار دادهشده داخل شیء دو دادهی جداگانه خواهند بود و این عملیات به دلیل ایجاد شیء جدید از نظر عملکردی هزینهبر است.
نمونه کد:
int i = 123;
object o = i; // جعبهسازی
i = 456;
Console.WriteLine(i);
Console.WriteLine(o);
آنباکسینگ (Unboxing)
اما Unboxing تبدیل برعکس Boxing است و زمانی رخ میدهد که بخواهیم مقدار موجود در یک شیء از نوع object را دوباره به نوع مقداری اصلی خود تبدیل کنیم. این کار باید به صورت صریح انجام شود، یعنی لازم است نوع مقصد را حتماً با cast مشخص کنیم. در زمان اجرای برنامه بررسی میشود که آیا شیء واقعاً حاصل یک عملیات Boxing از همان نوع مقداری مورد انتظار هست یا خیر. اگر بررسی موفق باشد، مقدار ذخیره شده در heap به یک متغیر مقداری کپی میشود. اما اگر شیء تهی (null) باشد یا نوع واقعی آن با نوعی که انتظار داریم مطابقت نداشته باشد، برنامه خطاهایی مانند NullReferenceException یا InvalidCastException تولید میکند.
نمونه کد:
int i = 123;
object o = i; // جعبهسازی
try
{
int j = (int)o; // ازجعبهسازی درست
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
نمونهٔ خطا:
int i = 123;
object o = i;
try
{
short x = (short)o; // خطای InvalidCastException
}
catch (InvalidCastException e)
{
Console.WriteLine("Incorrect unboxing");
}
باکسینگ Boxing و آنباکسینگ Unboxing به دلیل تخصیص حافظه و بررسی نوع در زمان اجرا از نظر عملکردی هزینهبر هستند. در بخشهایی از برنامه که این عملیات زیاد انجام میشود ممکن است باعث کاهش کارایی شوند. برای جلوگیری از این مشکل، استفاده از Genericها میتواند بسیار مؤثر باشد زیرا تبدیلهای غیرضروری را حذف میکند.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
Docs
Boxing and Unboxing - C#
Learn about boxing and unboxing in C# programming. See code examples and view other available resources.
❤4👍1
تغییر مهم در NET 9. برای توسعهدهندگان HTTP
در نسخه جدید NET 9.، رفتار پیشفرض HttpClientFactory تغییر کرده است و بهجای استفاده از
🔧 این تغییر باعث میشود تا کدهایی که قبلاً هندلر را به
مثلا کد زیر خطایی که گفته شد را خواهد داد:
✅ دلیل این تغییر؟ بهبود مدیریت اتصالها و حل مشکلات مربوط به تغییرات DNS در کلاینتهای Singleton. اکنون
🔗 توضیحات تکمیلی را اینجا بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
در نسخه جدید NET 9.، رفتار پیشفرض HttpClientFactory تغییر کرده است و بهجای استفاده از
HttpClientHandler از SocketsHttpHandler بهعنوان هندلر اصلی استفاده میشود (البته در پلتفرمهایی که قابلیت پشتیبانی داشته باشند).🔧 این تغییر باعث میشود تا کدهایی که قبلاً هندلر را به
HttpClientHandler تبدیل میکردند، با خطای InvalidCastException مواجه شوند.مثلا کد زیر خطایی که گفته شد را خواهد داد:
services.AddHttpClient("test")
.ConfigurePrimaryHttpMessageHandler((h, _) =>
{
((HttpClientHandler)h).UseCookies = false;
});✅ دلیل این تغییر؟ بهبود مدیریت اتصالها و حل مشکلات مربوط به تغییرات DNS در کلاینتهای Singleton. اکنون
SocketsHttpHandler با ویژگی PooledConnectionLifetime بهطور پیشفرض تنظیم میشود تا اتصالها بهصورت دورهای بازسازی شوند.🔗 توضیحات تکمیلی را اینجا بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
Docs
HttpClientFactory uses SocketsHttpHandler as primary handler - .NET
Learn about the breaking change in networking in .NET 9 where HttpClientFactory now uses SocketsHttpHandler as the default primary handler.
❤7👍1🔥1
داینامیک (dynamic)
#csharp_for_beginners
نوع dynamic یک نوع static است اما وقتی متغیری از نوع dynamic باشد کنترل نوع کامپایلر نادیده گرفته میشود. یعنی معمولاً مانند نوع object رفتار میکند اما کامپایلر فرض میکند که هر عملی روی آن امکانپذیر است بدون اینکه نوع دقیق آن را بداند.
نتیجه این کار این است که وقتی با dynamic کار میکنید لازم نیست بدانید مقدار آن دقیقاً از کجا آمده مثلا از COM API یا یک زبان دینامیک یا از DOM HTML یا بازتاب (reflection).
اگر کد شما نادرست باشد خطا در زمان اجرا ظاهر میشود نه زمان کامپایل
مثال:
نتیجه عمل روی متغیر dynamic
بیشتر عملیات روی dynamic باز هم نتیجهای از نوع dynamic میدهند مثلا
در اینجا testSum خودش dynamic خواهد بود، اما بعضی از عملیاتها نتیجهای غیر dynamic دارند مثل تبدیل به نوع خاص یا ساخت شی با آرگومانهای dynamic.
در اینجا نوع testInstance برابر ExampleClass خواهد بود نه dynamic
کاربردها
داینامیک زمانی مفید است که بخواهید دیر-بایندینگ (late binding) داشته باشید یعنی تصمیمگیری نوع و فراخوانی متدها یا پراپرتیها در زمان اجرا انجام شود نه کامپایل.
برای Interop یا COM زمانی که با APIهای COM کار میکنید dynamic دیگر لازم نیست هر بار casting انجام دهید.
برای زبانهای دینامیک یا DOM یا reflection وقتی ساختار داده یا API تان در زمان اجرا معلوم میشود dynamic انعطاف بیشتری میدهد.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
نوع dynamic یک نوع static است اما وقتی متغیری از نوع dynamic باشد کنترل نوع کامپایلر نادیده گرفته میشود. یعنی معمولاً مانند نوع object رفتار میکند اما کامپایلر فرض میکند که هر عملی روی آن امکانپذیر است بدون اینکه نوع دقیق آن را بداند.
نتیجه این کار این است که وقتی با dynamic کار میکنید لازم نیست بدانید مقدار آن دقیقاً از کجا آمده مثلا از COM API یا یک زبان دینامیک یا از DOM HTML یا بازتاب (reflection).
اگر کد شما نادرست باشد خطا در زمان اجرا ظاهر میشود نه زمان کامپایل
مثال:
class ExampleClass
{
public void exampleMethod1(int i) { }
public void exampleMethod2(string str) { }
}
static void Main(string[] args)
{
ExampleClass ec = new ExampleClass()
dynamic dynamic_ec = new ExampleClass()
dynamic_ec.exampleMethod1(10, 4)
dynamic_ec.someMethod("some argument", 7, null)
dynamic_ec.nonexistentMethod()
}
نتیجه عمل روی متغیر dynamic
بیشتر عملیات روی dynamic باز هم نتیجهای از نوع dynamic میدهند مثلا
dynamic d = 1
var testSum = d + 3
در اینجا testSum خودش dynamic خواهد بود، اما بعضی از عملیاتها نتیجهای غیر dynamic دارند مثل تبدیل به نوع خاص یا ساخت شی با آرگومانهای dynamic.
var testInstance = new ExampleClass(d)
در اینجا نوع testInstance برابر ExampleClass خواهد بود نه dynamic
کاربردها
داینامیک زمانی مفید است که بخواهید دیر-بایندینگ (late binding) داشته باشید یعنی تصمیمگیری نوع و فراخوانی متدها یا پراپرتیها در زمان اجرا انجام شود نه کامپایل.
برای Interop یا COM زمانی که با APIهای COM کار میکنید dynamic دیگر لازم نیست هر بار casting انجام دهید.
برای زبانهای دینامیک یا DOM یا reflection وقتی ساختار داده یا API تان در زمان اجرا معلوم میشود dynamic انعطاف بیشتری میدهد.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
Docs
Using type dynamic - C#
Learn how to use the dynamic type. The dynamic type is a static type, but dynamic objects bypass static type checking.
👍6❤2
تولید اطلاعات نادرست با اعتماد به نفس بالا!
توهم (Hallucination) در مدلهای زبانی به حالتی گفته میشود که مدل، اطلاعات نادرست یا ساختگی تولید میکند، در حالی که با اطمینان و لحن قانعکننده آن را ارائه میدهد. این پدیده میتواند شامل اشتباهات تاریخی، علمی، یا حتی ساختن منابع و نقلقولهای جعلی باشد.
تصور کنید از یک مدل زبانی میپرسید: «چه کسی اولین بار نظریه نسبیت را مطرح کرد؟» و پاسخ میدهد: «ایزاک نیوتن در سال ۱۸۷۹». این پاسخ نهتنها اشتباه است (چون نظریه نسبیت متعلق به آلبرت اینشتین است)، بلکه با لحنی قاطع ارائه میشود که میتواند مخاطب را گمراه کند.
چرا مدلها دچار توهم میشوند؟
🔘 هدف آموزشی مدلها: پیشبینی واژهی بعدی
- مدلهای زبانی بر اساس احتمال واژهی بعدی آموزش میبینند، نه بر اساس صحت اطلاعات.
- این یعنی مدلها بیشتر «حدس» میزنند تا «اطلاع» داشته باشند.
🔘نبود دادههای منفی یا بازخورد اصلاحی
- در فرآیند آموزش، مدلها معمولاً فقط با دادههای مثبت تغذیه میشوند.
- اشتباهاتشان اصلاح نمیشود مگر در مراحل خاصی مثل fine-tuning یا RLHF.
🔘تشویق به تولید پاسخهای روان و کامل
- مدلها برای تولید پاسخهایی جذاب و کامل پاداش میگیرند، حتی اگر دقیق نباشند.
- ابراز «ندانستن» اغلب امتیاز کمتری دارد.
🔘فشار ارزیابیهای سطحی
- بسیاری از ارزیابیها فقط دقت زبانی یا شباهت به پاسخهای انسانی را میسنجند.
- صداقت، فروتنی شناختی، یا توانایی تشخیص عدم قطعیت نادیده گرفته میشود.
برای ساخت مدلهایی قابل اعتمادتر، باید هم در آموزش و هم در ارزیابی تغییراتی ایجاد شود. برخی راهکارهای کلیدی عبارتاند از:
🟣 تشویق به ابراز عدم قطعیت
- مدلها باید یاد بگیرند که گاهی «نمیدانم» گفتن بهتر از حدس زدن است.
- این رفتار باید در ارزیابیها پاداش داده شود.
🟣 استفاده از دادههای منفی در آموزش
- آموزش مدلها با نمونههایی از پاسخهای اشتباه و اصلاحشده، به آنها کمک میکند تا بهتر تشخیص دهند چه چیزی نادرست است.
🟣 ارزیابی چندلایه
- علاوه بر دقت زبانی، باید معیارهایی مثل «درستی اطلاعات»، «منبعپذیری» و «فروتنی شناختی» نیز سنجیده شوند.
🟣 افزایش شفافیت مدلها
- مدلها باید بتوانند توضیح دهند که چرا یک پاسخ را دادهاند یا از کجا آن را گرفتهاند.
🔗 در اینجا میتوانید بیشتر بخوانید.
___________
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#نگار_قاسمی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
________
توهم (Hallucination) در مدلهای زبانی به حالتی گفته میشود که مدل، اطلاعات نادرست یا ساختگی تولید میکند، در حالی که با اطمینان و لحن قانعکننده آن را ارائه میدهد. این پدیده میتواند شامل اشتباهات تاریخی، علمی، یا حتی ساختن منابع و نقلقولهای جعلی باشد.
تصور کنید از یک مدل زبانی میپرسید: «چه کسی اولین بار نظریه نسبیت را مطرح کرد؟» و پاسخ میدهد: «ایزاک نیوتن در سال ۱۸۷۹». این پاسخ نهتنها اشتباه است (چون نظریه نسبیت متعلق به آلبرت اینشتین است)، بلکه با لحنی قاطع ارائه میشود که میتواند مخاطب را گمراه کند.
چرا مدلها دچار توهم میشوند؟
🔘 هدف آموزشی مدلها: پیشبینی واژهی بعدی
- مدلهای زبانی بر اساس احتمال واژهی بعدی آموزش میبینند، نه بر اساس صحت اطلاعات.
- این یعنی مدلها بیشتر «حدس» میزنند تا «اطلاع» داشته باشند.
🔘نبود دادههای منفی یا بازخورد اصلاحی
- در فرآیند آموزش، مدلها معمولاً فقط با دادههای مثبت تغذیه میشوند.
- اشتباهاتشان اصلاح نمیشود مگر در مراحل خاصی مثل fine-tuning یا RLHF.
🔘تشویق به تولید پاسخهای روان و کامل
- مدلها برای تولید پاسخهایی جذاب و کامل پاداش میگیرند، حتی اگر دقیق نباشند.
- ابراز «ندانستن» اغلب امتیاز کمتری دارد.
🔘فشار ارزیابیهای سطحی
- بسیاری از ارزیابیها فقط دقت زبانی یا شباهت به پاسخهای انسانی را میسنجند.
- صداقت، فروتنی شناختی، یا توانایی تشخیص عدم قطعیت نادیده گرفته میشود.
برای ساخت مدلهایی قابل اعتمادتر، باید هم در آموزش و هم در ارزیابی تغییراتی ایجاد شود. برخی راهکارهای کلیدی عبارتاند از:
🟣 تشویق به ابراز عدم قطعیت
- مدلها باید یاد بگیرند که گاهی «نمیدانم» گفتن بهتر از حدس زدن است.
- این رفتار باید در ارزیابیها پاداش داده شود.
🟣 استفاده از دادههای منفی در آموزش
- آموزش مدلها با نمونههایی از پاسخهای اشتباه و اصلاحشده، به آنها کمک میکند تا بهتر تشخیص دهند چه چیزی نادرست است.
🟣 ارزیابی چندلایه
- علاوه بر دقت زبانی، باید معیارهایی مثل «درستی اطلاعات»، «منبعپذیری» و «فروتنی شناختی» نیز سنجیده شوند.
🟣 افزایش شفافیت مدلها
- مدلها باید بتوانند توضیح دهند که چرا یک پاسخ را دادهاند یا از کجا آن را گرفتهاند.
🔗 در اینجا میتوانید بیشتر بخوانید.
___________
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#نگار_قاسمی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
________
Openai
Why language models hallucinate
OpenAI’s new research explains why language models hallucinate. The findings show how improved evaluations can enhance AI reliability, honesty, and safety.
👍5
تفاوت Add و AddAsync در EF Core به همراهی Hi/Lo!
اگه با Entity Framework Core کار میکنید، شاید برایتان سوال پیش آمده باشد که بهتر است از Add استفاده کنیم یا AddAsync؟
✅ متد Add فقط موجودیت را به Change Tracker اضافه میکند و هیچ ارتباطی با دیتابیس برقرار نمیکند تا زمانی که
✅ متد AddAsync هم همین کار را میکند، با این تفاوت که در موارد خاص مثل استفاده از Value Generatorهایی مثل HiLo، ممکن است نیاز باشد در لحظهی اضافهکردن، دیتابیس را صدا بزند. برای همین
در نتیجه اگر از Value Generator خاصی استفاده نمیکنید،
📌 نکته مهم: تفاوت اصلی در زمان اجرای
نتیجهگیری: در ۹۹٪ موارد، استفاده از
حال Hi/Lo چیست؟
با Hi/Lo میتوانیم شناسهها را سمت کلاینت تولید کنیم، بدون اینکه منتظر ذخیره شدن در دیتابیس بمانیم. EF یک مقدار بالا (Hi) از دیتابیس میگیرد و با یک آفست پایین (Lo) در حافظه، شناسهها را تولید میکند.
🔗 نحوه استفاده از این فیچر را هم میتوانید اینجا به همراه توضیحات کامل بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
اگه با Entity Framework Core کار میکنید، شاید برایتان سوال پیش آمده باشد که بهتر است از Add استفاده کنیم یا AddAsync؟
✅ متد Add فقط موجودیت را به Change Tracker اضافه میکند و هیچ ارتباطی با دیتابیس برقرار نمیکند تا زمانی که
SaveChanges یا SaveChangesAsync صدا زده شود.✅ متد AddAsync هم همین کار را میکند، با این تفاوت که در موارد خاص مثل استفاده از Value Generatorهایی مثل HiLo، ممکن است نیاز باشد در لحظهی اضافهکردن، دیتابیس را صدا بزند. برای همین
AddAsync به صورت غیرهمزمان طراحی شده است.در نتیجه اگر از Value Generator خاصی استفاده نمیکنید،
Add سریعتر و سبکتر است چون سربار ساخت Task و State Machine را ندارد. اما اگه احتمال میدهید EF نیاز داشته باشد در لحظهی اضافهکردن با دیتابیس ارتباط بگیرد، AddAsync انتخاب بهتری است.📌 نکته مهم: تفاوت اصلی در زمان اجرای
SaveChanges اتفاق میافتد، نه هنگام Add یا AddAsync.نتیجهگیری: در ۹۹٪ موارد، استفاده از
Add کفایت میکند. AddAsync فقط برای سناریوهای خاص مثل HiLo یا Sequence Generatorها کاربرد دارد.حال Hi/Lo چیست؟
با Hi/Lo میتوانیم شناسهها را سمت کلاینت تولید کنیم، بدون اینکه منتظر ذخیره شدن در دیتابیس بمانیم. EF یک مقدار بالا (Hi) از دیتابیس میگیرد و با یک آفست پایین (Lo) در حافظه، شناسهها را تولید میکند.
🔗 نحوه استفاده از این فیچر را هم میتوانید اینجا به همراه توضیحات کامل بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
Medium
Hi/Lo with Entity Framework
An SQL sequence is a database object that generates a sequence of unique numeric values.
👍9❤5
کلید اصلی در EF Core: عدد یا GUID؟
وقتی با EF Core کار میکنیم، یکی از تصمیمهای مهم اولیه انتخاب نوع کلید اصلی (Primary Key) است. دو گزینه رایج داریم:
🔹 عدد صحیح (int یا long)
🔹 شناسه یکتا گلوبال (GUID)
هر کدام از این دو گزینه مزایا و معایب خود را دارند:
✅ عدد صحیح (int/long):
- عملکرد بهتر در جستجو و ایندکسگذاری
- خوانایی بیشتر برای انسانها
- حجم کمتر (۴ یا ۸ بایت)
❌ اما:
- در سیستمهای توزیعشده ممکن است باعث تداخل شود.
- قابل پیشبینی بودن مقادیر میتواند امنیت را کاهش دهد.
✅ نوع GUID:
- یکتایی گلوبال، مناسب برای سیستمهای توزیعشده.
- ادغام راحت دادهها از منابع مختلف.
- امنیت بیشتر به خاطر غیرقابل پیشبینی بودن.
- میتوانیم سمت کد موقع ایجاد آبجکت جدید دیتابیسی یک Id جدید اضافه کنیم. Guid.NewGuid که پرفورمنسی بهتر است.
❌ اما:
- عملکرد ضعیفتر نسبت به int
- حجم بیشتر (۱۶ بایت)
- سختتر برای خواندن و تایپ دستی
🔍 جمعبندی:
تصمیم شخصی من با توجه به موضوعاتی که گفته شد این است که از GUID استفاده کنم تا دیگر به ازای هر Add نیازی نباشد که یک بار دیگر سمت دیتابیس بروم و خب فواید دیگری هم برای Guid دارم و آن پرفورمنسی که در مورد int صحبت شد برای من آنچنان Game Changer نبوده است و مزایای int نسبت به مزایای Guid برای من کمتر است
انتخاب شما چی است؟
🔗 توضیحات تکمیلی را اینجا بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
وقتی با EF Core کار میکنیم، یکی از تصمیمهای مهم اولیه انتخاب نوع کلید اصلی (Primary Key) است. دو گزینه رایج داریم:
🔹 عدد صحیح (int یا long)
🔹 شناسه یکتا گلوبال (GUID)
هر کدام از این دو گزینه مزایا و معایب خود را دارند:
✅ عدد صحیح (int/long):
- عملکرد بهتر در جستجو و ایندکسگذاری
- خوانایی بیشتر برای انسانها
- حجم کمتر (۴ یا ۸ بایت)
❌ اما:
- در سیستمهای توزیعشده ممکن است باعث تداخل شود.
- قابل پیشبینی بودن مقادیر میتواند امنیت را کاهش دهد.
✅ نوع GUID:
- یکتایی گلوبال، مناسب برای سیستمهای توزیعشده.
- ادغام راحت دادهها از منابع مختلف.
- امنیت بیشتر به خاطر غیرقابل پیشبینی بودن.
- میتوانیم سمت کد موقع ایجاد آبجکت جدید دیتابیسی یک Id جدید اضافه کنیم. Guid.NewGuid که پرفورمنسی بهتر است.
❌ اما:
- عملکرد ضعیفتر نسبت به int
- حجم بیشتر (۱۶ بایت)
- سختتر برای خواندن و تایپ دستی
🔍 جمعبندی:
تصمیم شخصی من با توجه به موضوعاتی که گفته شد این است که از GUID استفاده کنم تا دیگر به ازای هر Add نیازی نباشد که یک بار دیگر سمت دیتابیس بروم و خب فواید دیگری هم برای Guid دارم و آن پرفورمنسی که در مورد int صحبت شد برای من آنچنان Game Changer نبوده است و مزایای int نسبت به مزایای Guid برای من کمتر است
انتخاب شما چی است؟
🔗 توضیحات تکمیلی را اینجا بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
Medium
Choosing the Right Primary Key in EF Core: int vs. GUID
When developing applications with Entity Framework Core (EF Core), one of the early decisions you’ll encounter is selecting the type for…
👍12❤1
هوشمصنوعی به جز دمو!
تکنولوژیهای هوشمصنوعی معمولا در دموها خیلی جذابن، ولی در استفاده واقعی، «واقعیِ واقعی»، لزوما به اون بامزگی نیستن!
تو این گفتگو قراره در مورد استفاده از هوشمصنوعی تو محصولات واقعی صحبت کنم. اینکه ما با چطور از LLM هایی که ذاتا با Hallucination همراه هستن تو محصولات تجاری استفاده میکنیم.
کمی هم در مورد معماری نرمافزاری و مدل تستنویسی semantic که توی @CrystaCode ازشون استفاده میکنیم میگم و توضیح میدم که چطور باعث میشه با این روشها محصولات قابل اعتمادتر نوشت.
🔗 در این لینک با ما باشید.
تکنولوژیهای هوشمصنوعی معمولا در دموها خیلی جذابن، ولی در استفاده واقعی، «واقعیِ واقعی»، لزوما به اون بامزگی نیستن!
تو این گفتگو قراره در مورد استفاده از هوشمصنوعی تو محصولات واقعی صحبت کنم. اینکه ما با چطور از LLM هایی که ذاتا با Hallucination همراه هستن تو محصولات تجاری استفاده میکنیم.
کمی هم در مورد معماری نرمافزاری و مدل تستنویسی semantic که توی @CrystaCode ازشون استفاده میکنیم میگم و توضیح میدم که چطور باعث میشه با این روشها محصولات قابل اعتمادتر نوشت.
🔗 در این لینک با ما باشید.
🔥7❤2👍2
سلسله مطالب مرتبط با موضوع MCP ها:
ساخت سرورهای MCP با Azure Functions
مطالب قبلی:
ساخت یک MCP Server ساده با سیشارپ
نگاهی کمی فلسفیتر به MCP
لایو تکمیلی در مورد MCP و LLM ها
پروتکل MCP (Model Context Protocol) راهی نو برای ارتباط بین مدلهای هوش مصنوعی و ابزارهای کاربردی فراهم کرده. حالا با استفاده از Azure Functions میتوانید خیلی راحت سرورهای MCP بسازید و آنها را به صورت ریموت اجرا کنید!
ویژگیهای جذاب:
- استفاده از ویژگی [McpToolTrigger] برای تبدیل فانکشنها به ابزارهای قابل استفاده توسط LLMها.
- ذخیره و بازیابی دادهها از Azure Blob Storage با چند خط کد.
- اتصال مستقیم به VS Code و GitHub Copilot برای تعامل هوشمند با کدها.
فقط کافی است پروژه نمونه را کلون کنید، دستور
📚 آموزش کامل و کد نمونه را میتوانید در وبلاگ رسمی داتنت بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
ساخت سرورهای MCP با Azure Functions
مطالب قبلی:
ساخت یک MCP Server ساده با سیشارپ
نگاهی کمی فلسفیتر به MCP
لایو تکمیلی در مورد MCP و LLM ها
پروتکل MCP (Model Context Protocol) راهی نو برای ارتباط بین مدلهای هوش مصنوعی و ابزارهای کاربردی فراهم کرده. حالا با استفاده از Azure Functions میتوانید خیلی راحت سرورهای MCP بسازید و آنها را به صورت ریموت اجرا کنید!
ویژگیهای جذاب:
- استفاده از ویژگی [McpToolTrigger] برای تبدیل فانکشنها به ابزارهای قابل استفاده توسط LLMها.
- ذخیره و بازیابی دادهها از Azure Blob Storage با چند خط کد.
- اتصال مستقیم به VS Code و GitHub Copilot برای تعامل هوشمند با کدها.
فقط کافی است پروژه نمونه را کلون کنید، دستور
azd up را اجرا کنید و سرور MCP شما روی Azure بالا میآید! بعد میتوانید با Copilot صحبت کنید و بخواهید کدهای انتخابشده شما را ذخیره کند یا دوباره برایتان بیاورد.📚 آموزش کامل و کد نمونه را میتوانید در وبلاگ رسمی داتنت بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
Telegram
Software Philosophy
ساخت یک MCP Server ساده با سیشارپ
اگه برنامهنویس #داتنت هستین، تو این پست توضیح داده که چطور با #سیشارپ میتونین یه MCP Server بالا بیارین و توی Cursor تستش کنین.
اگر نمیدونین MCP چیه، یه چورایی همون معادل REST API دنیای وب، در هوش مصنوعیه. یعنی سیستمهای…
اگه برنامهنویس #داتنت هستین، تو این پست توضیح داده که چطور با #سیشارپ میتونین یه MCP Server بالا بیارین و توی Cursor تستش کنین.
اگر نمیدونین MCP چیه، یه چورایی همون معادل REST API دنیای وب، در هوش مصنوعیه. یعنی سیستمهای…
👍3❤1
بازنویسی تاریخی در دنیای داتنت با 9 NET.!
تیم NuGet در مایکروسافت موفق شد الگوریتم Restore را در نسخه 9 NET. بهطور کامل بازنویسی کند؛ نتیجه؟ افزایش سرعت تا ۱۶ برابر!
📉 زمان Restore برای پروژههای بزرگ از ۳۲ دقیقه به فقط ۲ دقیقه رسید!
چرا این اتفاق افتاد؟
- الگوریتم قبلی بیش از ۱۰ سال بدون تغییر باقی مانده بود.
- پروژههای بزرگ مثل TeamX با کندی شدید مواجه شده بودند.
- ساختار بازگشتی و حافظهبر باعث دیباگ سخت و مصرف منابع بالا شده بود.
چه تغییراتی اعمال شد؟
- حذف ساخت گراف کامل و جایگزینی با ساختار تخت و تصمیمگیری لحظهای.
- بهینهسازی حافظه، کاهش تعداد تکرارها و حذف نودهای تکراری.
- اضافه شدن ویژگیهایی مثل transitive pinning و مدیریت بهتر خطاها.
📈 نتیجه نهایی:
- افزایش چشمگیر بهرهوری توسعهدهندگان.
- صرفهجویی در منابع زیرساختی.
- آمادهسازی برای مقیاسپذیری در پروژههای عظیم.
🔗 توضیحات کامل را در این لینک ببینید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
تیم NuGet در مایکروسافت موفق شد الگوریتم Restore را در نسخه 9 NET. بهطور کامل بازنویسی کند؛ نتیجه؟ افزایش سرعت تا ۱۶ برابر!
📉 زمان Restore برای پروژههای بزرگ از ۳۲ دقیقه به فقط ۲ دقیقه رسید!
چرا این اتفاق افتاد؟
- الگوریتم قبلی بیش از ۱۰ سال بدون تغییر باقی مانده بود.
- پروژههای بزرگ مثل TeamX با کندی شدید مواجه شده بودند.
- ساختار بازگشتی و حافظهبر باعث دیباگ سخت و مصرف منابع بالا شده بود.
چه تغییراتی اعمال شد؟
- حذف ساخت گراف کامل و جایگزینی با ساختار تخت و تصمیمگیری لحظهای.
- بهینهسازی حافظه، کاهش تعداد تکرارها و حذف نودهای تکراری.
- اضافه شدن ویژگیهایی مثل transitive pinning و مدیریت بهتر خطاها.
📈 نتیجه نهایی:
- افزایش چشمگیر بهرهوری توسعهدهندگان.
- صرفهجویی در منابع زیرساختی.
- آمادهسازی برای مقیاسپذیری در پروژههای عظیم.
🔗 توضیحات کامل را در این لینک ببینید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
Microsoft News
How we ended up rewriting NuGet Restore in .NET 9
Learn about the journey that led to a full rewrite of the NuGet Restore algorithm in .NET 9, achieving break-through scale and performance.
1👍11❤3🔥2
دلیگیت (delegate)
#csharp_for_beginners
دلیگیتها (delgate) در زبان سیشارپ نوعی دادهاند که مرجع به یک یا چند متد را نگه میدارند. Delegateها شبیه اشارهگر تابع هستند اما بهصورت شیءگرا پیادهسازی شدهاند. این ویژگی باعث میشود فقط متدهایی با امضای مشخص بتوانند به یک delegate متصل شوند.
برای تعریف یک delegate از کلمه کلیدی delegate استفاده میشود. تعریف delegate مشابه امضای یک متد است و مشخص میکند چه نوع متدی میتواند به آن نسبت داده شود:
این delegate میتواند به هر متدی متصل شود که یک پارامتر از نوع string دریافت کند و مقدار بازگشتی نداشته باشد.
پس از تعریف delegate، میتوان یک نمونه از آن ایجاد کرد و یک متد سازگار را به آن نسبت داد.
در این مثال، متد DelegateMethod به delegate متصل شده است. اکنون میتوان delegate را مانند یک متد فراخوانی کرد.
یکی از کاربردهای مهم delegate استفاده از آن بهعنوان callback است. در این حالت، delegate بهعنوان پارامتر به یک متد دیگر ارسال میشود.
متد بالا بدون اطلاع از جزئیات متد callback، آن را در زمان مناسب اجرا میکند.
Delegateها میتوانند چندین متد را بهصورت همزمان نگه دارند. به این نوع delegate، multicast delegate گفته میشود.
در این حالت، هنگام فراخوانی delegate، هر دو متد اجرا میشوند.
Delegateها اشیاء هستند و میتوان آنها را ذخیره کرد، به متدها ارسال کرد یا در propertyها استفاده کرد. همچنین eventها در C# بر پایه delegate ساخته میشوند و از همین سازوکار برای اطلاعرسانی استفاده میکنند.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
دلیگیتها (delgate) در زبان سیشارپ نوعی دادهاند که مرجع به یک یا چند متد را نگه میدارند. Delegateها شبیه اشارهگر تابع هستند اما بهصورت شیءگرا پیادهسازی شدهاند. این ویژگی باعث میشود فقط متدهایی با امضای مشخص بتوانند به یک delegate متصل شوند.
برای تعریف یک delegate از کلمه کلیدی delegate استفاده میشود. تعریف delegate مشابه امضای یک متد است و مشخص میکند چه نوع متدی میتواند به آن نسبت داده شود:
public delegate void Callback(string message);
این delegate میتواند به هر متدی متصل شود که یک پارامتر از نوع string دریافت کند و مقدار بازگشتی نداشته باشد.
پس از تعریف delegate، میتوان یک نمونه از آن ایجاد کرد و یک متد سازگار را به آن نسبت داد.
static void DelegateMethod(string message)
{
Console.WriteLine(message);
}
Callback handler = DelegateMethod;
در این مثال، متد DelegateMethod به delegate متصل شده است. اکنون میتوان delegate را مانند یک متد فراخوانی کرد.
handler("Hello World");یکی از کاربردهای مهم delegate استفاده از آن بهعنوان callback است. در این حالت، delegate بهعنوان پارامتر به یک متد دیگر ارسال میشود.
static void MethodWithCallback(int a, int b, Callback callback)
{
callback("Result: " + (a + b));
}
متد بالا بدون اطلاع از جزئیات متد callback، آن را در زمان مناسب اجرا میکند.
Delegateها میتوانند چندین متد را بهصورت همزمان نگه دارند. به این نوع delegate، multicast delegate گفته میشود.
Callback handler = DelegateMethod;
handler += AnotherMethod;
در این حالت، هنگام فراخوانی delegate، هر دو متد اجرا میشوند.
Delegateها اشیاء هستند و میتوان آنها را ذخیره کرد، به متدها ارسال کرد یا در propertyها استفاده کرد. همچنین eventها در C# بر پایه delegate ساخته میشوند و از همین سازوکار برای اطلاعرسانی استفاده میکنند.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
Docs
Using Delegates - C#
Learn how to use delegates. Delegates are an object-oriented, type safe, and secure type that safely encapsulates a method.
👍3❤1
مهاجرت از تایپاسکریپت (۲.۵ میلیون خط کد) به سیشارپ
در بلاگ زیر، CTO شرکت Motion توضیح میدهد که چرا تصمیم گرفتهاند کدهای خود را از #typenoscript به #csharp ببرند...
دلایلی که آورده بسیار قابل توجه هستند و ارزش خواندن و فکر کردن را دارند. ما هم تقریبا به دلایل مشابهی در چند سال گذشته پروژههای جاواسکریپتی خود را به سیشارپ منتقل کردیم.
حتی در دو پروژه اخیر که با شرکتهای کانادایی بوده، اولین کار مهاجرت از کدهای #react به #blazor بوده است.
نظر شما چیه؟
🔗 در این صفحه میتوانید مطلب کامل را بخوانید.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
در بلاگ زیر، CTO شرکت Motion توضیح میدهد که چرا تصمیم گرفتهاند کدهای خود را از #typenoscript به #csharp ببرند...
دلایلی که آورده بسیار قابل توجه هستند و ارزش خواندن و فکر کردن را دارند. ما هم تقریبا به دلایل مشابهی در چند سال گذشته پروژههای جاواسکریپتی خود را به سیشارپ منتقل کردیم.
حتی در دو پروژه اخیر که با شرکتهای کانادایی بوده، اولین کار مهاجرت از کدهای #react به #blazor بوده است.
نظر شما چیه؟
🔗 در این صفحه میتوانید مطلب کامل را بخوانید.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
Medium
Moving off of TypeScript
We Love You, TypeScript
1👍6❤5👎1🔥1