Faragiri

همهٔ زبان‌ها

آموزش سی‌شارپ (C#) سی، سی‌پلاس‌پلاس و سی‌شارپ

یک کلمه در تعریف نوع تعیین می‌کند که انتساب کپی بگیرد یا ارجاع. تفاوتش هیچ‌جا اعلام نمی‌شود و در نتیجه محاسبه بیرون می‌زند.

۴بخش
۳دقیقه خواندن
۴عمق

دو زبان، پنج تفاوت

سی‌شارپ کنار نزدیک‌ترین همسایه‌اش

هر سطر یک تصمیم طراحی است که در یکی از این دو گرفته شده و در دیگری نه.

سی‌شارپنوع مقداری واقعی دارد و خاصیت جزو زبان است
جاواهمه چیز ارجاعی است و دسترسی با متد نوشته می‌شود
نوع مقداریstruct، که واقعا کپی می‌شودفقط نوع‌های اولیه
خواندن و نوشتن یک فیلدخاصیت، که مثل فیلد نوشته می‌شودمتد، با نام صریح
تهی‌پذیریدر خود نوع اعلام می‌شودبا ظرف اختیاری یا با حاشیه‌نویسی
پرس‌وجو روی مجموعهدر زبان است و تنبل اجرا می‌شودجریان‌ها، که آن‌ها هم تنبل‌اند
سکوی اجراچندسکویی از سال ۲۰۱۶چندسکویی از ابتدا

هیچ طرفی علامت نخورده، چون انتخاب میانشان تقریبا هیچ‌وقت فنی نیست: به تیم، به کد موجود، و به بازار کار همان جا بسته است.

در سی‌شارپ دو خانواده نوع هست و انتخاب میانشان یک کلمه است. نوع مقداری با انتساب کپی می‌شود و نوع ارجاعی نه. هیچ چیزی در محل استفاده این تفاوت را نشان نمی‌دهد.

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

قاعده عملی: نوع مقداری برای چیزهای کوچک و تغییرناپذیر مثل یک مبلغ یا یک بازه تاریخ، و نوع ارجاعی برای هر چیز دیگری. اگر نوع مقداری می‌سازید، فیلدهایش را فقط خواندنی کنید تا این کلاس باگ اصلا ممکن نباشد.

خاصیت، و کلمه‌ای که تغییرناپذیری می‌سازد

در سی‌شارپ به‌جای متد خواندن و نوشتن، خاصیت می‌نویسید: public int Mojoodi { get; set; } که هم مثل یک فیلد استفاده می‌شود و هم یک متد است. برای چیزی که فقط باید هنگام ساخت مقدار بگیرد، { get; init; } را بنویسید؛ پس از ساخت، انتساب به آن خطای کامپایل است.

و برای نوع‌های تهی‌پذیر، علامت سوال پس از نام نوع اعلام می‌کند که این مقدار می‌تواند تهی باشد. وقتی این ویژگی در پروژه روشن باشد، کامپایلر هر جایی را که بدون بررسی از یک مقدار تهی‌پذیر استفاده کرده‌اید هشدار می‌دهد. این تنظیم در پروژه‌های تازه پیش‌فرض روشن است و در پروژه‌های قدیمی معمولا خاموش مانده، که همان تفاوت سخت‌گیری است که در نوع‌ها روی جاوااسکریپت، و چیزی که می‌گیرند هم دیده می‌شود.

پرس‌وجوی یکپارچه، و دامی که دارد

نوشتن qetat.Where(p => p.Mojoodi > 0).Select(p => p.Kod).ToList() جای یک حلقه با یک فهرست موقت را می‌گیرد. دام واقعی‌اش تنبلی است: تا وقتی نتیجه را واقعا مصرف نکنید، هیچ چیزی اجرا نمی‌شود. اگر همان عبارت را دو بار پیمایش کنید، دو بار اجرا می‌شود، و اگر منبعش یک پایگاه داده باشد یعنی دو کوئری. فراخوانی جمع‌کننده در انتها همین را حل می‌کند.

جایی که کار گیر می‌کند، فرض ویندوزی بودن است

در ایران سی‌شارپ هنوز عمدتا به‌عنوان زبان برنامه‌های ویندوزی شناخته می‌شود، و همان تصور باعث می‌شود کسی سراغش نرود که سرور لینوکسی دارد. این سال‌هاست درست نیست: از سال ۲۰۱۶ به بعد این سکو چندسکویی است و روی لینوکس و مک هم اجرا می‌شود، و امروز بیشتر استقرارهای واقعی‌اش داخل کانتینر لینوکسی است. چیزی که هنوز درست است این است که ابزارهای رابط گرافیکی قدیمی فقط ویندوزی‌اند. اگر هدفتان وب و سرویس است، هیچ دلیلی برای ویندوز لازم نیست.

ابزار، و سالی که این حرف درست است

در سال ۲۰۲۶ نسخه‌ای که یک پروژه تازه باید رویش باشد .NET 10 است، که آخرین نسخه با پشتیبانی بلندمدت است و جانشین .NET 8 شد؛ متن‌باز و رایگان است و روی هر سه سکو اجرا می‌شود. ویرایشگر رایگانش VS Code با افزونه رسمی سی‌شارپ است و روی لینوکس و مک هم همین کار را می‌کند، در حالی که نسخه کامل ویژوال استودیو فقط روی ویندوز و مک است. وابستگی‌ها از مخزن بسته‌ها می‌آیند، پس از ایران به یک آینه نیاز دارید.

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

کنار این

بالای این