1
00:00.170 --> 00:06.950
خیلی خب، برای ویدیوی بعدی، من یک چیزی در مورد **delegate**ها آماده کردم که عمیق‌تر به نحوه‌ی کار

2
00:06.950 --> 00:10.850
**delegate**ها می‌پردازه تا بهتر متوجه بشید چرا مفید هستن.

3
00:10.850 --> 00:18.110
و قبل از اینکه بریم سراغ **multicast delegate**ها، که نشون می‌ده **delegate**ها واقعاً چقدر قدرتمند هستن، می‌خواستم

4
00:18.110 --> 00:23.000
همونطور که گفتم، بیشتر در مورد **delegate**ها بهتون نشون بدم، و برای فهمیدنش، باید **generics** رو متوجه بشید،

5
00:23.000 --> 00:27.830
حداقل در یک سطح فوق‌العاده، فوق‌العاده، فوق‌العاده ساده، یعنی واقعاً در سطح بالا. ما قراره

6
00:27.830 --> 00:31.660
خیلی عمیق‌تر به **generics** بپردازیم چون چیزهای زیادی برای یادگیری در موردش هست.

7
00:31.660 --> 00:37.000
اما قراره در این ویدیو یک مثال خیلی ساده داشته باشیم تا در ویدیوی بعدی گیج نشید،

8
00:37.000 --> 04:41.560
جایی که در واقع می‌خوام از **generics** در ترکیب با **delegate**ها استفاده کنم.

9
00:41.590 --> 04:41.920
اوکی.

10
04:41.920 --> 04:45.760
پس **Yannick** یک فصل کامل رو به **generics** اختصاص داده.

11
04:45.760 --> 04:47.140
می‌تونید اونو بررسی کنید.

12
04:47.140 --> 04:53.130
فکر می‌کنم کاملاً مستقله، بنابراین اگه احساس می‌کنید این ویدیو به اندازه‌ی کافی عمیق نیست که **generics** رو

13
04:53.130 --> 04:58.140
برای درک ویدیوی بعدی متوجه بشید، می‌تونید به فصل **generics** برید و اونو ببینید و بعد به این فصل

14
04:58.140 --> 05:01.800
**delegate**ها برگردید.

15
05:01.800 --> 05:08.340
اما فکر می‌کنم کاری که در این ویدیو انجام می‌دیم باید برای فهمیدن مثال بعدی کافی باشه.

16
05:08.340 --> 05:11.160
اوکی، خب **generics** چی هستن؟

17
05:11.190 --> 05:18.470
**Generics** راهی هستن برای انعطاف‌پذیرتر و قابل استفاده‌تر کردن کد شما با اجازه‌دادن بهش که با هر

18
05:18.470 --> 05:18.950
**data type** کار کنه.

19
05:18.980 --> 05:24.590
**Generics** رو مثل **template**هایی در نظر بگیرید که می‌تونید موقع استفاده، با **type**های مختلف پرشون کنید.

20
05:24.590 --> 05:26.450
خب چرا باید از **generics** استفاده کنید؟

21
05:26.450 --> 05:33.050
اول از همه برای انعطاف‌پذیریش، می‌تونید یک **method**، **class** یا **interface** بنویسید و اون رو با

22
05:33.050 --> 05:36.590
**data type**های مختلف استفاده کنید بدون اینکه نیاز به نوشتن چندین نسخه داشته باشید.

23
05:36.590 --> 05:38.540
بعد نکته‌ی دوم **type safety** هست.

24
05:38.540 --> 05:45.220
خب، **generics** کمک می‌کنه خطاها رو در زمان **compile** بگیرید نه در زمان **runtime**، که کد شما رو امن‌تر می‌کنه.

25
05:45.220 --> 05:52.390
و بعد شماره سه **performance** هست، **generics** از نیاز به **boxing** و **unboxing** هنگام کار با

26
05:52.390 --> 05:54.850
**value type**ها جلوگیری می‌کنه که می‌تونه **performance** رو بهبود ببخشه.

27
05:54.850 --> 05:59.080
و این مفهوم چیزیه که **Yannick** قراره عمیق‌تر بهش بپردازه.

28
05:59.080 --> 06:02.680
خب، یک مثال برای **generic method** چیه؟

29
06:02.680 --> 06:07.580
خب، تصور کنید می‌خواید یک **method** بنویسید که عناصر یک **array** رو چاپ کنه.

30
06:07.580 --> 06:10.130
می‌تونید **method**های جداگانه برای هر **type** بنویسید.

31
06:10.130 --> 06:14.750
مثلاً برای **int**ها، برای **string**ها، برای هر **type** دیگه‌ای که دارید.

32
06:14.750 --> 06:19.100
یا می‌تونید از یک **generic method** استفاده کنید که با هر **type**ی کار می‌کنه.

33
06:19.100 --> 06:21.320
خیلی خب، بیاید مثال اینجا رو ببینیم.

34
06:21.320 --> 06:26.480
پس یک مثال کد کوچک دارم که می‌گه: **public static void print int array**.

35
06:26.480 --> 06:29.680
و کاری که انجام می‌ده اینه که یک **int array** به عنوان پارامتر می‌گیره.

36
06:29.680 --> 06:34.720
و بعد از این حلقه‌ی **for each** استفاده می‌کنه تا از تک تک آیتم‌های داخل اون **array** عبور کنه.

37
06:34.720 --> 06:37.840
و اون آیتم رو روی **console** می‌نویسه.

38
06:37.840 --> 06:43.000
و بعد یک **method** دیگه دارم که **public static void print string array** هست.

39
06:43.000 --> 06:49.180
خب، کاری که انجام می‌ده همون کاریه که این **print int array** انجام می‌ده، فقط با این تفاوت که الان این کار رو

40
06:49.180 --> 06:49.840
با **string**ها انجام می‌ده.

41
06:49.840 --> 06:52.210
پس به جای استفاده از **int**، از **string** استفاده می‌کنه.

42
06:52.210 --> 06:54.540
پس یک **array** داریم که **type**ش **string** هست.

43
06:54.540 --> 06:59.070
و بعد این حلقه‌ی **for each** رو داریم که از تک تک آیتم‌های داخل اون **array** عبور می‌کنه

44
06:59.070 --> 07:01.020
و اون آیتم رو چاپ می‌کنه.

45
07:01.020 --> 07:01.710
اوکی.

46
07:01.710 --> 07:04.440
پس اگه فقط دو تا **type** داشته باشید، خوبه.

47
07:04.440 --> 07:04.710
درسته؟

48
07:04.710 --> 07:10.980
اما اگه ندونید چه **type**ی وارد می‌شه و می‌خواید در هر صورت قابل مدیریت باشه، اون موقع

49
07:10.980 --> 07:12.330
می‌تونید از **generics** استفاده کنید.

50
07:12.330 --> 07:15.630
پس بیاید این دو **method** رو در یک **method** بسازیم.

51
07:15.630 --> 07:19.130
و دوباره فقط تصور کنید که این ۲۰ تا **method** هست، اوکی؟

52
07:19.130 --> 07:20.900
چون دارید ۲۰ تا **type** مختلف رو پوشش می‌دید.

53
07:20.900 --> 07:22.040
اگه یک **bool** وارد بشه چی؟

54
07:22.040 --> 07:23.990
اگه یک **double** وارد بشه چی؟

55
07:23.990 --> 07:28.610
یا اگه یک **array** از **type** هر **class**ی وارد بشه.

56
07:28.610 --> 07:29.930
حتی **class**ها، درسته.

57
07:29.930 --> 07:35.930
حتی **object**هایی که پیچیده‌تر از فقط **data type**های ساده مثل **string** و **int** هستن.

58
07:35.930 --> 07:43.150
پس بیاید یک **method** بسازیم که به ما اجازه بده هر **data type**ی رو بگیریم.

59
07:43.150 --> 07:45.910
و برای انجام این کار باید از **generics** استفاده کنیم.

60
07:45.910 --> 07:47.500
خب، یک **generic** چطوری به نظر می‌رسه؟

61
07:47.500 --> 07:49.930
و ما قبلاً کمی **generics** رو دیدیم.

62
07:49.930 --> 07:53.110
پس یک **method** **public static** ایجاد می‌کنم.

63
07:53.110 --> 07:58.030
و از **static keyword** استفاده می‌کنم چون داخل **internal class program** با **static void main** هستم،

64
07:58.030 --> 08:05.530
می‌خوام بتونم از **method** داخل **main method** استفاده کنم، پس اسم این یکی فقط **print array** خواهد بود.

65
08:05.530 --> 08:06.220
**Array**.

66
08:06.220 --> 08:10.030
پس فرقی نمی‌کنه که **string array** باشه یا **int array** یا هر چیز دیگه‌ای.

67
08:10.030 --> 08:14.080
پس اینجا قسمتیه که **generics** وارد عمل می‌شه.

68
08:14.080 --> 08:21.970
پس این **angle bracket**ها **t** دارن نشون می‌دن که این یک **generic method** هست.

69
08:21.970 --> 08:26.050
پس یک **method** که **generic data type** می‌گیره.

70
08:26.050 --> 08:32.390
پس اینجا می‌تونم بگم فقط **t** نه **task** بلکه **t** و بعد **square bracket**ها.

71
08:32.390 --> 08:34.550
و بعد یک اسم بهش می‌دم، مثلاً **array**.

72
08:34.550 --> 08:38.120
و بعد از این **print array** استفاده می‌کنم.

73
08:38.120 --> 08:41.390
و راستی، باید یک **data type** اضافه کنم.

74
08:41.390 --> 08:43.820
پس این **void** خواهد بود، چیزی برنمی‌گردونه.

75
08:43.820 --> 08:50.570
پس این **print array** حالا فقط یک حلقه‌ی **for each** خواهد داشت که از تک تک آیتم‌ها عبور می‌کنه

76
08:50.570 --> 08:53.440
و هر تک آیتم رو روی **console** می‌نویسه.

77
08:53.440 --> 08:57.910
پس این کد اینجا تقریباً همون چیزیه که اینجا بود، فقط با این تفاوت که.

78
08:57.910 --> 09:06.100
حالا به جای گفتن **string**، می‌گیم **t** و **t item in array** و می‌تونید اینجا ببینید که از این **t** استفاده کردیم و از

79
09:06.100 --> 09:07.030
**t** استفاده کردیم.

80
09:07.030 --> 09:13.150
پس این **T** فقط یک کاراکتر جایگزین برای هر **data type**ی هست.

81
09:13.150 --> 09:18.360
پس فقط می‌گه هر **data type**ی که به من بدی، کاری که می‌کنم اینه که چاپش می‌کنم.

82
09:18.360 --> 09:19.080
اوکی.

83
09:19.080 --> 09:25.470
پس حالا این به من اجازه می‌ده که برم جلو و **array**ام رو چاپ کنم.

84
09:25.470 --> 09:29.460
پس اینجا می‌تونم یک **array** از **type int** ایجاد کنم.

85
09:29.460 --> 09:32.760
و این **array** چند تا عدد خواهد داشت.

86
09:32.760 --> 09:37.050
پس ۱، ۲، ۳، ۴، ۵، فکر می‌کنم کافی باشه.

87
09:37.050 --> 09:37.980
اینجوری.

88
09:37.980 --> 09:41.990
و بعد یک **array** دیگه خواهم داشت که یک **string array** خواهد بود.

89
09:41.990 --> 09:50.870
و حالا این **string array** مقادیری مثل **one**, **two**, **three** و غیره خواهد داشت.

90
09:50.870 --> 09:52.790
و راستی، این باید یک **string** باشه، مشخصه.

91
09:52.790 --> 09:57.440
پس **string array**، ۱، ۲، ۳ و بعد شاید ۴ هم همینطور.

92
09:57.440 --> 09:59.600
مثل شخصیت مورد علاقه‌مون، **Jin**.

93
09:59.600 --> 10:00.680
پس اینم از این.

94
10:00.680 --> 10:09.090
پس حالا کاری که می‌تونیم انجام بدیم اینه که **array** رو یا با **int array**مون چاپ کنیم که کار می‌کنه، یا با

95
10:09.090 --> 10:09.870
**string array**مون.

96
10:09.870 --> 10:11.310
و اون هم کار می‌کنه.

97
10:11.340 --> 10:12.030
اوکی.

98
10:12.030 --> 10:15.450
پس حالا اینو اجرا می‌کنیم و خواهیم دید.

99
10:15.450 --> 10:21.630
و در واقع، بیاید مطمئن بشیم که **console dot read key** رو هم داریم تا بتونیم اجراش کنیم و متوقف نشه.

100
10:21.630 --> 10:22.380
و بتونیم واقعاً ببینیم چه خبره.

101
10:22.380 --> 10:30.440
پس ۱، ۲، ۳، ۴، ۵، ۱، ۲، ۳، ۴. اوکی، پس می‌بینید حلقه‌ی **for each** ما

102
10:30.440 --> 10:36.140
براش مهم نبود که یک **int** گرفته، یک **string** گرفته، یا هر چیز دیگه‌ای.

103
10:36.350 --> 10:36.920
اوکی.

104
10:36.920 --> 10:39.530
و اینجاست که قسمت **generics** وارد می‌شه.

105
10:39.530 --> 10:45.260
پس این یک **generic method** هست که یک **generic data type** رو می‌پذیره.

106
10:45.260 --> 10:46.820
پس هر معنی که بده.

107
10:46.820 --> 10:56.260
پس در این مورد، یک **array** از هرچیزیه، **string**، **int**، **double**، **class**، **class** خودتون، **custom data type**ی

108
10:56.260 --> 10:59.560
که دارید ایجاد می‌کنید، با هرچیزی کار می‌کنه.

109
10:59.590 --> 11:06.790
پس حالا به جای داشتن این **method** و این **method** که کار رو انجام می‌دن، و همیشه باید **method** درست رو **call** کنم تا کار درست رو انجام بدم.

110
11:06.790 --> 11:09.100
که کار درست رو انجام بدم.

111
11:09.100 --> 11:16.630
می‌تونستم فقط این کار رو اینجا انجام بدم، یک **method** ایجاد کنم و حالا برای تمام **data type**ها ازش استفاده کنم، که خیلی باحاله.

112
11:16.630 --> 11:21.120
پس این نحوه‌ی کار **generics** در یک کلامه.

113
11:21.120 --> 11:22.320
واقعاً ساده‌ان.

114
11:22.320 --> 11:27.480
اما مثال، همونطور که گفتم، خیلی عمیق‌تر می‌ریم یا **Yannick** خیلی عمیق‌تر به این موضوع می‌پردازه.

115
11:27.480 --> 11:32.010
اگه احساس می‌کنید این کافی نبود، فصل رو همین الان بررسی کنید، اما اگه احساس می‌کنید: خب، خوبه،

116
11:32.010 --> 11:38.040
بیاید بپریم به ویدیوی بعدی که قراره از **generics** در مثال **delegate** استفاده کنیم تا یک حس واقعاً خوب

117
11:38.040 --> 11:40.260
در مورد **delegate**ها پیدا کنیم.

118
11:40.290 --> 11:42.240
اوکی، پس شما رو در ویدیوی بعدی می‌بینم.