WEBVTT

00:00.140 --> 00:05.930
توی این ویدیو قراره به کلمه کلیدی استاتیک نگاه کنیم و این بار واقعا، چون قبلا چندین بار

00:05.930 --> 00:08.570
رو دیدیم.static کلمه کلیدی 

00:08.570 --> 00:14.870
و یه مقداری هم ازش استفاده کردیم، ولی هیچ وقت واقعا به صورت فعال و با درک درست ازش استفاده نکردیم.

00:14.870 --> 00:22.640
و قبلا هم منطقی نبود چون اول باید می‌فهمیدیم متدها چی هستن، یعنی متدهای عضو یا 

00:22.640 --> 00:25.700
متدهای کلاس، تا بتونیم استاتیک رو بفهمیم.

00:25.700 --> 00:30.710
چون استاتیک یه متده که نیاز به آبجکت برای فراخوانی نداره.

00:30.710 --> 00:32.270
خب این یعنی چی؟

00:32.270 --> 00:40.640
ببینید، فرض کنید یه کلاس Customer داریم و می‌خوایم ازش متدی مثل customer dot هر متدی که 

00:40.640 --> 00:42.380
مربوط به اون مشتری هست استفاده کنیم.

00:42.380 --> 00:44.060
set details مثلا  .

00:44.060 --> 00:44.690
درسته.

00:44.690 --> 00:50.000
و اگه بخوام از متد set details استفاده کنم، باید بهش یه name بدم.

00:50.000 --> 00:53.720
مثلا بگم مشتری Dennis هست و آدرسش .
Main Street

00:53.720 --> 00:56.150
اون موقع می‌تونم ازش استفاده کنم.

00:56.150 --> 00:59.360
پس این یه متد غیر استاتیکه.

00:59.360 --> 01:01.880
و این متد خارج از کلاس خودش

01:01.880 --> 01:06.710
فقط روی یک شیء از اون کلاس قابل فراخوانیه.

01:06.710 --> 01:13.400
set detailsپس متد 
Customer فقط روی یک آبجکت از نوع 
 قابل فراخوانیه، درسته.

01:13.400 --> 01:17.270
و داخل خود کلاس هم میشه صداش زد.

01:17.270 --> 01:20.930
set detailsیعنی می‌تونید همینجا داخل کلاس 
 رو فراخوانی کنید.

01:20.930 --> 01:27.500
name و addressو اون جواب میده، چون می‌تونید همینجا 
 رو مقداردهی کنید.

01:27.500 --> 01:28.850
پس اون درست کار می‌کنه.

01:28.850 --> 01:33.470
ولی دلیلش اینه که متد الان داخل همون کلاسه.

01:33.470 --> 01:39.140
اما اگه بخواید از بیرون کلاس صداش بزنید، باید روی یک آبجکت 
 این کارو انجام بدید Customer

01:39.140 --> 01:46.520
حالا اگه بخوام یه متدی داشته باشم که حتی بدون ساختن Customerآبجکت از کلاس 
 هم بشه 

01:46.520 --> 01:47.210
صداش زد چی؟

01:47.210 --> 01:54.650
خب، اینجاست که می‌تونم از کلمه کلیدی static استفاده کنم، پس می‌نویسم public static void.

01:54.680 --> 01:58.550
مثلا doSomeCustomerStuff.

01:58.550 --> 02:04.700
و کاری که این متد انجام میده اینه که فقط یه چیزی مثل "دارم یه سری کارهای مشتری انجام میدم" رو چاپ کنه.

02:04.700 --> 02:06.170
همین.

02:06.170 --> 02:07.010
درسته؟

02:07.010 --> 02:07.760
پس مهم نیست دقیقا چی میگه.

02:07.760 --> 02:10.010
static voidایده اینه که این متد 
 می‌تونه همچین کاری انجام بده.

02:10.010 --> 02:15.170
 staticپس کلمه کلیدی
 نشون میده که لازم نیست روی یک آبجکت صدا زده بشه.

02:15.170 --> 02:21.290
میتونیم بدون ساختن آبجکت اون رو اجرا کنیم.

02:21.290 --> 02:24.020
خب این یعنی چی؟

02:24.020 --> 02:25.400
یعنی الان می‌تونم بیام و بنویسم

02:25.400 --> 02:30.740
customer.doSomeCustomerStuff

02:30.740 --> 02:35.600
پس لازم نبود آبجکت بسازم. راستی، برای اینکه بهتر نشونش بدم، می‌خوام اینو حذف کنم.

02:35.630 --> 02:36.170
همین.

02:36.170 --> 02:40.700
Customerبرای صدا زدن این متد نیازی نداشتم که یه آبجکت از 
 بسازم.

02:40.700 --> 02:47.630
حالا می‌تونم مستقیم صداش بزنم و روی خود کلاس Customer اجراش کنم، نه روی یه آبجکت Customer.

02:47.630 --> 02:49.520
Customerخب چرا روی کلاس 
 صداش می‌زنم؟

02:49.520 --> 02:52.040
چون دقیقا همون‌جاست که این متد تعریف شده.

02:52.040 --> 02:56.990
پس Customer فقط داره میگه که این متد داخل doSomeCustomerStuff هست.

02:56.990 --> 03:00.680
حالا اگه یه جای دیگه بود، مثلا اینجا تعریف می‌کردم.

03:00.680 --> 03:05.480
 static void myMethod یعنی
، می‌تونستم اینجا هم صداش بزنم.

03:05.480 --> 03:07.880
myMethod mother.

03:08.270 --> 03:10.550
اه، myMethod myMother.

03:10.550 --> 03:11.780
خب، همین شد.

03:11.780 --> 03:16.640
پس الان این myMethod هم می‌تونه همینجا صدا زده بشه، myMethod.

03:16.640 --> 03:18.920
و دلیل اینکه میشه صداش زد اینه که استاتیکه.

03:18.920 --> 03:24.470
اگه استاتیک نبود، نمی‌تونستم توی متد main صداش بزنم، چون خود main هم استاتیکه.

03:24.470 --> 03:30.830
و تنها راه استفاده از myMethod این بود که یه آبجکت از Program بسازم.

03:30.830 --> 03:33.650
یعنی Program program = new Program.

03:33.650 --> 03:37.130
program.myMethod. و بعد می‌تونستم بگم 

03:37.130 --> 03:39.980
خب، اینجوری هم کار می‌کنه، مثلا.

03:39.980 --> 03:47.660
ولی اگه متد رو استاتیک کنم، دیگه این روش کار نمی‌کنه چون نمی‌تونم روی آبجکت صداش بزنم، 

03:47.660 --> 03:52.670
باید به صورت مستقل صداش بزنم، همون کاری که اینجا انجام دادیم.

03:52.670 --> 03:56.150
پس متد رو به شکل مستقل صدا می‌زنیم.

03:56.150 --> 04:06.290
و در نتیجه، چیزی که به دست میاد اینه که این متد هیچ وقت Customerچیزی در مورد آبجکت 
 نمی‌دونه.

04:06.290 --> 04:08.630
و این نکته‌ایه که باید حواستون بهش باشه.

04:08.630 --> 04:11.120
Customerفرض کنید اینجا یه آبجکت 
 بسازم.

04:11.120 --> 04:14.630
یعنی customer myCustomer = new Customer.

04:14.630 --> 04:20.600
doSomeCustomerStuffو حالا بخوام 
 رو صدا بزنم.

04:20.600 --> 04:25.430
می‌بینید که اینجا نمی‌تونم این متد رو فراخوانی کنم چون اون گفته می‌خوام مستقل باشم.

04:25.430 --> 04:26.060
خب حدس بزنید چی؟

04:26.060 --> 04:29.270
الان مستقل هستی، ولی دیگه نمی‌تونی روی آبجکت‌های من کار کنی.

04:29.270 --> 04:30.200
و اینو نمی‌تونم قبول کنم.

04:30.200 --> 04:32.900
برای همین اینجا کار نمی‌کنه.

04:32.900 --> 04:43.850
doSomeCustomerStuffچون متد 
 استاتیکه و روی آبجکت‌ها قابل فراخوانی نیست، که البته 

04:43.850 --> 04:45.890
هم مزایا داره هم معایب.

04:45.890 --> 04:54.830
خب، یه متد دیگه خیلی خیلی قدرتمند رو می‌بینید که ما همیشه ازش استفاده می‌کنیم ولی روی آبجکت

04:54.830 --> 04:55.850
صدا زده نمی‌شه؟

04:55.850 --> 04:58.190
در واقع دو تا هستن که همیشه ازشون استفاده می‌کنیم.

04:58.190 --> 04:59.210
یکی readKey.

04:59.670 --> 05:01.440
و یکی writeLine.

05:01.470 --> 05:02.580
خب حدس بزنید چی؟

05:02.580 --> 05:04.140
این دوتا متد استاتیک هستن.

05:04.140 --> 05:10.200
اگه روی readKey برید و دکمه Control رو نگه دارید و روش کلیک کنید، می‌بینید که نوشته:

05:10.200 --> 05:13.050
public static ConsoleKeyInfo ReadKey.

05:13.140 --> 05:17.820
ConsoleKeyInfoیعنی یه چیزی از نوع 
 برمی‌گردونه، هرچی که باشه.

05:17.820 --> 05:18.360
درسته.

05:18.360 --> 05:20.880
ولی استاتیکه.

05:20.910 --> 05:28.290
و همین موضوع برای writeLine هم صدق می‌کنه، چون می‌بینید از اسم کلاس Console استفاده می‌کنه،

05:28.290 --> 05:30.510
چون Console یه کلاسه، بعد dot WriteLine.

05:30.510 --> 05:35.730
Controlپس اگه روی اونم برید یا با 
 کلیک کنید،

05:35.760 --> 05:37.770
می‌بینید که اونم یه متد استاتیکه.

05:37.770 --> 05:41.850
WriteLineپس متد 
 هم استاتیکه.

05:41.850 --> 05:46.260
خب، حالا می‌بینید که همه‌چیز چطوری به هم مربوط میشه.

05:46.260 --> 05:52.080
پس شما کلمه کلیدی static رو دارید که نشون میده یه چیزی...

05:52.080 --> 05:59.490
برای اینکه موضوع کاملا روشن بشه یا ساده‌ترش کنیم، بیاید همه‌چیز رو تو یه جمله جمع کنیم.

05:59.490 --> 06:08.430
پس توی C# کلمه کلیدی static برای تعریف اعضای یک کلاس استفاده میشه که متعلق به خود کلاس هستن،

06:08.430 --> 06:12.870
نه متعلق به یه نمونه خاص از کلاس.

06:13.140 --> 06:14.250
یکم بهش فکر کنید.

06:14.250 --> 06:20.670
Customerپس می‌بینید که متعلق به کلاس 
 هست، ولی متعلق به یه آبجکت از کلاس نیست.

06:20.670 --> 06:24.840
یعنی متعلق به یه نمونه خاص، که همون آبجکت هست، نیست.

06:24.840 --> 06:28.590
یک آبجکت، یه نمونه خاص از یه کلاس هست.

06:28.590 --> 06:34.230
پس متعلق به myCustomer نیست، بنابراین نمی‌تونم روی myCustomer صداش بزنم.

06:34.260 --> 06:35.070
درسته.

06:35.070 --> 06:40.710
staticخب، پس این بود توضیح کلمه کلیدی 
 برای شما، ولی فقط برای متدها.

06:40.710 --> 06:45.600
staticپس لازمه به 
 با متغیرها هم نگاه کنیم.

06:45.600 --> 06:53.340
اما کلمه کلیدی static می‌تونه برای کلاس‌ها، سازنده‌ها، properties و fields هم استفاده بشه.

06:53.460 --> 06:55.440
و همونطور که دیدیم برای متدها هم صدق می‌کنه.

06:55.440 --> 06:59.040
نگاه کنیم.fieldsپس بیاید تو ویدیوی بعدی به 
 
