static
کلاسی بهنام Cup با فیلد static بهنام int tally و متد static بهنام void Mark() که tally = tally + 1; اجرا میکند بنویسید. در Pine، Main را نگه دارید و دو بار Cup.Mark(); صدا بزنید، بعد Cup.tally را بنویسید. هر دو نوع را در همان فایل آموزشی نگه دارید تا dotnet run ساده بماند. با dotnet run اجرا کنید. صفحه باید یک خط نشان دهد: 2. متد از راه نام کلاس اجرا میشود، نه از راه متغیر شیء. یک tally مشترک روی کلاس همان چیزی است که این صفحه میآموزد. نام کلاس عمومی شروعکننده را Pine نگه دارید.
عضوی که مال نام کلاس است
در صفحهٔ متدهای نمونه j.bump() را از راه متغیر jar صدا زدید. اینجا فیلد و متد روی خودِ Cup مینشینند. با Cup.Mark() و Cup.tally به آنها میرسید. برای آن فراخوانی در این صفحه لازم نیست new Cup(...) بزنید. هر بار که Mark صدا زده میشود یکی به همان tally اضافه میکند.
فایل Pine را باز کنید. نام کلاس شروعکننده Pine میماند. این صفحه شروعکننده را عوض نام نمیکند. اگر هنوز باقیماندهٔ Jar j = new Jar(3); همهٔ چیزی است که در Main دارید، پاکش کنید. هر باقیماندهٔ کلاس Jar را پاک کنید. هر باقیماندهٔ Tin را پاک کنید. هر خط ReadLine را هم پاک کنید. فایلی که نگه میدارید منتظر تایپ نیست.
بیرون از آکولادهای Pine — هنوز در همان فایل — بنویسید public class Cup. داخل آکولادها اعلام کنید static int tally;. بعد متد static را بنویسید: static void Mark() { tally = tally + 1; }. در این صفحه نه سازنده هست و نه فیلد نمونه. پیش از اجرا فایل را ذخیره کنید.
سرآیند متد به هر دو static و void نیاز دارد. واژهٔ static عضو را مال نام کلاس میکند. واژهٔ void هنوز یعنی Mark مقداری برای نوشتن برنمیگرداند. هر دو واژه را بههمان ترتیب در سرآیندی که تایپ میکنید نگه دارید.
using System;
public class Cup
{
static int tally;
static void Mark()
{
tally = tally + 1;
}
}
Pine روی نام کلاس Mark را صدا میزند
Pine مقدار public static void Main() را نگه میدارد. داخل Main سه خط به ترتیب بنویسید: Cup.Mark();، دوباره Cup.Mark();، بعد Console.WriteLine(Cup.tally);. هر فراخوانی یکی اضافه میکند. نوشتن شمارش مشترک را نشان میدهد. در این صفحه نه Jar j = new Jar(3); مینویسید و نه j.bump();. آن درس متدهای نمونه بود.
using System;
public class Pine
{
public static void Main()
{
Cup.Mark();
Cup.Mark();
Console.WriteLine(Cup.tally);
}
}
public class Cup
{
static int tally;
static void Mark()
{
tally = tally + 1;
}
}
فایل نگهداشتنی را از بالا بخوانید. using System; نامهای کوتاه را آماده میکند. public class Pine شروعکننده است. public static void Main() جایی است که زماناجرا شروع میکند — خودِ Main از قبل static است، به همین دلیل برنامه بدون ساختن اول شیء Pine میتواند شروع شود. فراخوانی Cup.Mark() وارد Mark روی کلاس میشود. بدنه مینویسد tally = tally + 1. فراخوانی اول tally را از 0 به 1 میبرد. فراخوانی دوم آن را به 2 میرساند. بعد Main مینویسد Cup.tally و صفحه 2 نشان میدهد.
با dotnet run اجرا کنید. برنامه یک خط مینویسد و میایستد. منتظر تایپ شما نمیماند. اگر dotnet run منتظر ماند، هنوز ReadLine در فایل است. آن خط را پاک کنید و در Pine دو فراخوانی Cup.Mark(); و نوشتن را نگه دارید، با Mark در Cup. صفحه 2 نشان میدهد. اگر صفحه 4 یا 5 نشان داد، ممکن است دموی باقیماندهٔ Jar bump هنوز اجرا شود. اگر صفحه 0 نشان داد، فراخوانیهای Mark ممکن است نباشند یا بعد از نوشتن اجرا شوند.
اگر در این شکل Main بنویسید Mark(); بدون Cup. جلوش، ساخت رد میکند مگر سیمکشی بیشتری بزنید که این صفحه نمیآموزد. نگه دارید Cup.Mark();. اگر بنویسید Cup c = new Cup(); و دوباره فقط دربارهٔ متدهای نمونه حرف بزنید، از درس static دور شدهاید. هدف این صفحه فراخوانی از نام کلاس است.
مقایسه با j.bump و باقیماندهٔ Jar
در صفحهٔ متدهای نمونه، j.bump() به شیء جلوی نام نیاز داشت. آن هنوز وقتی تغییر روی یک jar میخواهید کار میکند. در این صفحه Cup.Mark() به نام کلاس جلوش نیاز دارد. باقیماندهٔ Jar j = new Jar(3); j.bump(); Console.WriteLine(j.fill); درس دیگری است. برای این صفحه Cup و Pine و Cup.Mark(); را نگه دارید.
هنوز میتوانید بعداً متد نمونه بسازید. این درس شمارندهٔ مشترک را روی کلاس نگه میدارد تا دو فراخوانی بدون new هنوز یک tally را به اشتراک بگذارند. نوشتن فقط Console.WriteLine(Cup); یک 2 تمیز نشان نمیدهد. برای دیدن عدد ذخیرهشده بنویسید Console.WriteLine(Cup.tally);.
📊 j.bump در برابر Cup.Mark
| شکل فراخوانی | به شیء نیاز دارد؟ | چه چیزی عوض میشود |
|---|---|---|
j.bump(); |
بله — متغیر jar | fill همان jar |
Cup.Mark(); |
خیر — نام کلاس را بزنید | Cup.tally مشترک |
یک tally که هر Mark به اشتراک میگذارد
در این صفحه برای دو علامت دو cup نمیسازید. اولین Cup.Mark(); و دومین Cup.Mark(); هر دو همان فیلد static را لمس میکنند. معنای static int tally همین است. اگر بعداً شیء اضافه کنید، باز هم آن یک tally را به اشتراک میگذارند مگر طراحی دیگری بسازید. برای فایل آموزشی دو فراخوانی از نام کلاس کافی است.
اگر صفحه هنوز 1 نشان داد، شاید فقط یک فراخوانی Mark باشد یا نوشتن بین فراخوانیها نشسته باشد. هر دو فراخوانی را قبل از Console.WriteLine(Cup.tally); نگه دارید. اگر صفحه 7 یا عدد باقیماندهٔ دیگری نشان داد، ممکن است دموی قدیمی Tin یا Jar هنوز در فایل باشد. دو بار Cup.Mark(); و نوشتن روی Cup.tally را نگه دارید.
اشتباههایی که فراخوانی static را پنهان میکنند
اگر static را از Mark بردارید، به متد نمونه تبدیل میشود. آنگاه Cup.Mark(); از Main ساخت را رد میکند و صفحه دیگر فراخوانی از نام کلاس را نمیآموزد. static را روی فیلد و متد برگردانید. صدا زدن فقط j.bump(); چون فایل Jar هنوز باز است هم این درس را پنهان میکند — وقتی Cup را تمرین میکنید آن دمو را از Main پاک کنید.
دام دیگر نوشتن فقط Cup.tally = Cup.tally + 1; داخل Main و هرگز ننوشتن Mark است. بعد از دو انتساب میتواند 2 چاپ کند، ولی شکل متد staticی را که این صفحه میخواهید تایپ کنید رد میکند. دو خط Cup.Mark(); را ترجیح دهید تا بدنهٔ متد مالک جمع باشد. اگر IntelliSense بعد از new Cup() فراخوانی نمونه پیشنهاد داد، برای این تمرین نادیده بگیرید و با Cup.Mark(); بمانید.
این صفحه برای access چه میگذارد
این صفحه از راه نام کلاس به اعضا میرسد: Cup.Mark() و Cup.tally. صفحهٔ بعد — access — واژههایی مثل public و private را نشان میدهد که کنترل میکنند چه کسی عضو را ببیند. اینجا با static بمانید. روی هر خط کلیدواژهٔ access اختراع نکنید مگر از قبل استفاده میکنید؛ هدف درس فراخوانی از نام کلاس و فیلد مشترک است.
Cup را داخل آکولادهای Pine تودرتو نکنید. در این صفحه دو کلاس همسطح در فایل مینشینند. اگر ساخت هنگام کامپایل Pine نتوانست Cup را پیدا کند، ببینید public class Cup در همان فایل است. اگر صفحه 0 نشان داد، شاید Mark هرگز اجرا نشده — هر دو خط Cup.Mark(); را قبل از نوشتن نگه دارید. اگر ساخت میگوید Mark به شیء نیاز دارد، ببینید سرآیند متد هنوز static دارد.
میتوانید اعلام کنید static int tally;، بنویسید static void Mark() { tally = tally + 1; }، و از Pine.Main دو بار Cup.Mark(); اجرا کنید، بعد Cup.tally را بنویسید. با dotnet run اجرا کنید. صفحه 2 نشان میدهد. متد static روی نام کلاس اجرا شد و فیلد مشترک را عوض کرد. Mark را مثل عملی ببینید که خودِ کلاس بدون ساختن cup اول میتواند انجام دهد. Pine همان دری است که با dotnet run باز میکنید. صفحهٔ بعد access است، جایی که بعضی اعضا عمداً برای کد دیگر باز یا بسته میشوند.
static را روی فیلد و متد نگه دارید. نام کلاس را قبل از فراخوانی نگه دارید: Cup.Mark();. نوشتن روی Cup.tally را نگه دارید. این سه عادت ایست بازرسی این صفحه قبل از رفتن جلو است. دموی باقیماندهٔ j.bump() را از Main بیرون بگذارید تا صفحه اشتباهاً عدد jar نشان ندهد.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود