توی این ویدیو قراره به کلمه کلیدی استاتیک نگاه کنیم و این بار واقعا، چون قبلا چندین بار
رو دیدیم.static کلمه کلیدی
و یه مقداری هم ازش استفاده کردیم، ولی هیچ وقت واقعا به صورت فعال و با درک درست ازش استفاده نکردیم.
و قبلا هم منطقی نبود چون اول باید می‌فهمیدیم متدها چی هستن، یعنی متدهای عضو یا
متدهای کلاس، تا بتونیم استاتیک رو بفهمیم.
چون استاتیک یه متده که نیاز به آبجکت برای فراخوانی نداره.
خب این یعنی چی؟
ببینید، فرض کنید یه کلاس Customer داریم و می‌خوایم ازش متدی مثل customer dot هر متدی که
مربوط به اون مشتری هست استفاده کنیم.
set details مثلا .
درسته.
و اگه بخوام از متد set details استفاده کنم، باید بهش یه name بدم.
مثلا بگم مشتری Dennis هست و آدرسش . Main Street
اون موقع می‌تونم ازش استفاده کنم.
پس این یه متد غیر استاتیکه.
و این متد خارج از کلاس خودش
فقط روی یک شیء از اون کلاس قابل فراخوانیه.
set detailsپس متد Customer فقط روی یک آبجکت از نوع قابل فراخوانیه، درسته.
و داخل خود کلاس هم میشه صداش زد.
set detailsیعنی می‌تونید همینجا داخل کلاس رو فراخوانی کنید.
name و addressو اون جواب میده، چون می‌تونید همینجا رو مقداردهی کنید.
پس اون درست کار می‌کنه.
ولی دلیلش اینه که متد الان داخل همون کلاسه.
اما اگه بخواید از بیرون کلاس صداش بزنید، باید روی یک آبجکت این کارو انجام بدید Customer
حالا اگه بخوام یه متدی داشته باشم که حتی بدون ساختن Customerآبجکت از کلاس هم بشه
صداش زد چی؟
خب، اینجاست که می‌تونم از کلمه کلیدی static استفاده کنم، پس می‌نویسم public static void.
مثلا doSomeCustomerStuff.
و کاری که این متد انجام میده اینه که فقط یه چیزی مثل "دارم یه سری کارهای مشتری انجام میدم" رو چاپ کنه.
همین.
درسته؟
پس مهم نیست دقیقا چی میگه.
static voidایده اینه که این متد می‌تونه همچین کاری انجام بده.
staticپس کلمه کلیدی نشون میده که لازم نیست روی یک آبجکت صدا زده بشه.
میتونیم بدون ساختن آبجکت اون رو اجرا کنیم.
خب این یعنی چی؟
یعنی الان می‌تونم بیام و بنویسم
customer.doSomeCustomerStuff
پس لازم نبود آبجکت بسازم. راستی، برای اینکه بهتر نشونش بدم، می‌خوام اینو حذف کنم.
همین.
Customerبرای صدا زدن این متد نیازی نداشتم که یه آبجکت از بسازم.
حالا می‌تونم مستقیم صداش بزنم و روی خود کلاس Customer اجراش کنم، نه روی یه آبجکت Customer.
Customerخب چرا روی کلاس صداش می‌زنم؟
چون دقیقا همون‌جاست که این متد تعریف شده.
پس Customer فقط داره میگه که این متد داخل doSomeCustomerStuff هست.
حالا اگه یه جای دیگه بود، مثلا اینجا تعریف می‌کردم.
static void myMethod یعنی ، می‌تونستم اینجا هم صداش بزنم.
myMethod mother.
اه، myMethod myMother.
خب، همین شد.
پس الان این myMethod هم می‌تونه همینجا صدا زده بشه، myMethod.
و دلیل اینکه میشه صداش زد اینه که استاتیکه.
اگه استاتیک نبود، نمی‌تونستم توی متد main صداش بزنم، چون خود main هم استاتیکه.
و تنها راه استفاده از myMethod این بود که یه آبجکت از Program بسازم.
یعنی Program program = new Program.
program.myMethod. و بعد می‌تونستم بگم
خب، اینجوری هم کار می‌کنه، مثلا.
ولی اگه متد رو استاتیک کنم، دیگه این روش کار نمی‌کنه چون نمی‌تونم روی آبجکت صداش بزنم،
باید به صورت مستقل صداش بزنم، همون کاری که اینجا انجام دادیم.
پس متد رو به شکل مستقل صدا می‌زنیم.
و در نتیجه، چیزی که به دست میاد اینه که این متد هیچ وقت Customerچیزی در مورد آبجکت نمی‌دونه.
و این نکته‌ایه که باید حواستون بهش باشه.
Customerفرض کنید اینجا یه آبجکت بسازم.
یعنی customer myCustomer = new Customer.
doSomeCustomerStuffو حالا بخوام رو صدا بزنم.
می‌بینید که اینجا نمی‌تونم این متد رو فراخوانی کنم چون اون گفته می‌خوام مستقل باشم.
خب حدس بزنید چی؟
الان مستقل هستی، ولی دیگه نمی‌تونی روی آبجکت‌های من کار کنی.
و اینو نمی‌تونم قبول کنم.
برای همین اینجا کار نمی‌کنه.
doSomeCustomerStuffچون متد استاتیکه و روی آبجکت‌ها قابل فراخوانی نیست، که البته
هم مزایا داره هم معایب.
خب، یه متد دیگه خیلی خیلی قدرتمند رو می‌بینید که ما همیشه ازش استفاده می‌کنیم ولی روی آبجکت
صدا زده نمی‌شه؟
در واقع دو تا هستن که همیشه ازشون استفاده می‌کنیم.
یکی readKey.
و یکی writeLine.
خب حدس بزنید چی؟
این دوتا متد استاتیک هستن.
اگه روی readKey برید و دکمه Control رو نگه دارید و روش کلیک کنید، می‌بینید که نوشته:
public static ConsoleKeyInfo ReadKey.
ConsoleKeyInfoیعنی یه چیزی از نوع برمی‌گردونه، هرچی که باشه.
درسته.
ولی استاتیکه.
و همین موضوع برای writeLine هم صدق می‌کنه، چون می‌بینید از اسم کلاس Console استفاده می‌کنه،
چون Console یه کلاسه، بعد dot WriteLine.
Controlپس اگه روی اونم برید یا با کلیک کنید،
می‌بینید که اونم یه متد استاتیکه.
WriteLineپس متد هم استاتیکه.
خب، حالا می‌بینید که همه‌چیز چطوری به هم مربوط میشه.
پس شما کلمه کلیدی static رو دارید که نشون میده یه چیزی...
برای اینکه موضوع کاملا روشن بشه یا ساده‌ترش کنیم، بیاید همه‌چیز رو تو یه جمله جمع کنیم.
پس توی C# کلمه کلیدی static برای تعریف اعضای یک کلاس استفاده میشه که متعلق به خود کلاس هستن،
نه متعلق به یه نمونه خاص از کلاس.
یکم بهش فکر کنید.
Customerپس می‌بینید که متعلق به کلاس هست، ولی متعلق به یه آبجکت از کلاس نیست.
یعنی متعلق به یه نمونه خاص، که همون آبجکت هست، نیست.
یک آبجکت، یه نمونه خاص از یه کلاس هست.
پس متعلق به myCustomer نیست، بنابراین نمی‌تونم روی myCustomer صداش بزنم.
درسته.
staticخب، پس این بود توضیح کلمه کلیدی برای شما، ولی فقط برای متدها.
staticپس لازمه به با متغیرها هم نگاه کنیم.
اما کلمه کلیدی static می‌تونه برای کلاس‌ها، سازنده‌ها، properties و fields هم استفاده بشه.
و همونطور که دیدیم برای متدها هم صدق می‌کنه.
نگاه کنیم.fieldsپس بیاید تو ویدیوی بعدی به