
1
00:00.110 --> 00:00.830
خوش آمدید.

2
00:00.830 --> 00:02.420
تو این ویدیو قراره درباره‌ی structها صحبت کنیم.

3
00:02.420 --> 00:06.770
و شاید بخوایم بیشتر از یک ویدیو بهشون بپردازیم.

4
00:06.770 --> 00:09.530
خب، structها خیلی شبیه کلاس‌ها هستن.

5
00:09.530 --> 00:16.550
اونا تقریباً همه‌ی قابلیت‌های کلاس‌ها رو دارن، اما تو چند جنبه‌ی اصلی و همچنین در نحوه‌ی استفاده، با هم فرق می‌کنن.

6
00:16.550 --> 00:17.090
خب.

7
00:17.090 --> 00:23.720
بعداً به structای به اسم DateTime نگاه می‌کنیم، یک struct واقعاً قوی که

8
00:23.720 --> 00:29.360
به ما اجازه می‌ده از زمان تو برنامه‌مون استفاده کنیم و بدونیم چه تاریخی هست و غیره، که

9
00:29.360 --> 00:31.080
دونستنش به عنوان یک برنامه‌نویس خیلی مهمه.

10
00:31.080 --> 00:36.270
اما قبلش، فکر کردم خیلی عاقلانه باشه که اول structها رو ببینیم و بفهمیم چطور کار می‌کنن.

11
00:36.270 --> 00:42.030
خب، بزرگترین تفاوت بین این دو اینه که structها انواع مقداری (Value Types) هستن،

12
00:42.030 --> 00:49.350
یعنی روی استک (Stack) ذخیره می‌شن و با مقدار (by value) پاس داده می‌شن، در حالی که کلاس‌ها انواع مرجعی (Reference Types) هستن که

13
00:49.350 --> 00:52.080
روی هیپ (Heap) ذخیره می‌شن و با مرجع (by reference) پاس داده می‌شن.

14
00:52.080 --> 00:56.510
بعداً توی یک مثال واقعی می‌بینیم که این به چه معناست، و اون موقع خیلی بیشتر منطقی به نظر میاد،

15
00:56.510 --> 00:59.150
چون چیزی که الان گفتم خیلی انتزاعیه.

16
00:59.150 --> 01:02.300
اما وقتی یک مثال واقعی داشته باشیم، خیلی بیشتر منطقی خواهد بود.

17
01:02.300 --> 01:08.390
structها برای آبجکت‌های کوچیک و سبک مناسبن که به وراثت (inheritance) نیازی ندارن.

18
01:08.390 --> 01:10.610
این دومین تفاوت بزرگ بین این دو هست.

19
01:10.640 --> 01:13.340
اوکی، پس structها اجازه‌ی وراثت نمی‌دن.

20
01:13.340 --> 01:14.330
ولی کلاس‌ها اجازه می‌دن.

21
01:14.330 --> 01:16.190
پس این‌ها دو تا از بزرگترین تفاوت‌ها هستن.

22
01:16.190 --> 01:18.260
تفاوت‌های دیگه رو هم خواهیم دید.

23
01:18.280 --> 01:21.430
اما بریم جلو و یک struct بسازیم تا باهاش آشنا بشیم.

24
01:21.430 --> 01:27.880
پس یک public struct ایجاد می‌کنم و اسمش رو می‌ذارم Point، اوکی؟

25
01:27.880 --> 01:30.640
publicش می‌کنم تا بتونم بعداً بهش دسترسی داشته باشم.

26
01:30.640 --> 01:33.670
و تو این struct قراره دو تا پراپرتی (property) داشته باشم.

27
01:33.670 --> 01:39.430
پس یکی int x و دیگری int y خواهد بود.

28
01:39.430 --> 01:39.730
اوکی.

29
01:39.730 --> 01:43.580
پس فقط این دو تا پراپرتی رو ایجاد می‌کنم.

30
01:43.580 --> 01:46.430
و بعد structها می‌تونن سازنده (constructor) هم داشته باشن.

31
01:46.430 --> 01:47.600
پس Ctor.

32
01:47.810 --> 01:55.040
و این Point به یک int x و یک int y نیاز داره.

33
01:55.040 --> 01:59.600
و کاری که می‌خوام انجام بدم اینه که x رو برابر x و y رو برابر y قرار بدم.

34
01:59.600 --> 02:02.360
و structها می‌تونن متد (method) هم داشته باشن، اوکی؟

35
02:02.360 --> 02:06.440
پس یک struct می‌تونه یک متد public void داشته باشه.

36
02:06.440 --> 02:08.280
و اسم این متد display (نمایش) خواهد بود.

37
02:08.280 --> 02:11.820
و کاری که می‌کنه اینه که فقط نقطه‌ی x و y رو نمایش می‌ده.

38
02:11.850 --> 02:19.650
پس CW و می‌گم dollar sign و "نقطه در" (Point is at).

39
02:19.650 --> 02:28.710
و بعد موقعیت X و همچنین موقعیت y که با یک کاما و داخل پرانتز از هم جدا شدن.

40
02:28.710 --> 02:32.590
خب حالا بریم جلو و از structمون استفاده کنیم.

41
02:32.620 --> 02:35.770
خب، همون روشی رو داره که از یک کلاس استفاده می‌کنیم.

42
02:35.770 --> 02:39.820
پس می‌ریم جلو و می‌گیم Point، مثلاً P1 new Point.

43
02:39.820 --> 02:45.820
و بعد می‌بینید که من چیزی رو به سازنده‌ی Point اینجا اضافه نکردم.

44
02:45.820 --> 02:47.890
اما یک سربار (overload) دیگه وجود داره، اوکی؟

45
02:47.890 --> 02:54.190
وقتی روش هاور می‌کنید، می‌بینید که یک سربار دیگه وجود داره، به این معنی که یک سازنده‌ی پیش‌فرض (default constructor)

46
02:54.190 --> 02:55.570
تو یک struct وجود داره.

47
02:55.570 --> 02:57.720
پس تو مثال ما اینجا Public Point.

48
02:57.720 --> 03:03.810
می‌بینید، این سربار خودمون یا سازنده‌ی سفارشی خودمون هست که ساختیم و توش یک مقدار X و

49
03:03.810 --> 03:04.680
یک مقدار y می‌گیریم.

> NESA:
50
03:04.680 --> 03:06.990
و این همون چیزیه که قراره اینجا بذارم.

51
03:07.020 --> 03:07.440
اوکی.

52
03:07.440 --> 03:08.850
پس Point P1.

53
03:08.850 --> 03:12.360
پس می‌تونیم فقط از p1.display استفاده کنیم.

54
03:12.360 --> 03:18.120
و این به ما اجازه می‌ده هر چیزی رو که داخل اون struct هست نمایش بدیم.

55
03:18.120 --> 03:21.390
و می‌بینیم که دقیقاً مثل یک متد عادی کار می‌کنه.

56
03:21.400 --> 03:23.950
نقطه رو روی کنسول می‌نویسه.

57
03:23.950 --> 03:31.150
اوکی، حالا یک تفاوت دیگه اینه که structها می‌تونن بدون کلمه‌ی کلیدی new تعریف بشن.

58
03:31.150 --> 03:37.720
پس می‌تونم بگم Point P2، نه new Point، بلکه در واقع فقط وجود داره.

59
03:37.720 --> 03:38.260
اوکی.

60
03:38.260 --> 03:45.820
و بعد می‌تونم بگم p2 x قراره 10 باشه و p2 y قراره 20 باشه.

61
03:45.820 --> 03:50.910
و بعد می‌تونم برم جلو و بگم p2.display.

62
03:50.910 --> 03:57.480
اگه چیزی که گفتم درسته، که می‌تونیم از structها بدون مقداردهی اولیه با کلمه‌ی کلیدی new استفاده کنیم،

63
03:57.480 --> 03:58.710
چرا اینجا ارور می‌گیرم؟

64
03:58.710 --> 04:01.200
و دلیلش اینه که من اینجا دارم از پراپرتی‌ها استفاده می‌کنم.

65
04:01.200 --> 04:04.950
اگه از فیلدها (fields) استفاده می‌کردم، چیزی که گفتم به طور ایده‌آل کار می‌کرد.

66
04:04.950 --> 04:06.720
پس بذارید فقط یک مثال بهتون نشون بدم.

67
04:06.720 --> 04:10.960
پس فقط این رو کپی می‌کنم و اینجا پایین می‌ذارم.

68
04:10.960 --> 04:12.070
اون‌ها رو کامنت می‌کنم.

69
04:12.070 --> 04:17.650
و به جای اینکه این یک پراپرتی باشه، یک فیلد خواهد بود.

70
04:17.680 --> 04:18.340
اوکی.

71
04:18.340 --> 04:22.180
پس حالا اگه به کدمون نگاه کنیم، می‌بینیم که ارور نمی‌گیریم.

72
04:22.180 --> 04:28.900
پس تنها چیزی که مهمه اینه که همه‌ی فیلدها باید تو نقطه‌ای که استفاده می‌شن، مقداردهی اولیه بشن.

73
04:28.900 --> 04:29.500
خب.

74
04:29.500 --> 04:33.280
تو متد display ما داریم از این فیلدها استفاده می‌کنیم، درسته.

75
04:33.280 --> 04:37.910
و چون این کار رو می‌کنیم، باید تو اون نقطه مقداردهی اولیه بشن.

76
04:37.910 --> 04:40.940
این چیزیه که سازنده‌ی ما معمولاً ازش مراقبت می‌کنه، درسته؟

77
04:40.940 --> 04:42.590
ما فقط گفتیم، اوکی، می‌دونی چیه.

78
04:42.590 --> 04:45.680
دو تا مقدار رو به ما بده و بعد می‌تونیم ازشون استفاده کنیم.

79
04:45.680 --> 04:47.660
پس این کاریه که تو این مورد انجام دادیم.

80
04:47.660 --> 04:50.210
اما تو این مورد می‌بینید که کلمه‌ی کلیدی new وجود نداره.

81
04:50.210 --> 04:52.160
هیچ مقداردهی اولیه‌ای انجام ندادیم.

82
04:52.160 --> 04:56.120
و این کار می‌کنه چون همونطور که گفتم، اون دو تا فیلد هستن.

83
04:56.120 --> 04:56.720
اوکی.

84
04:56.720 --> 04:59.710
پس این رو اجرا کنیم و ببینیم آیا هنوز کار می‌کنه.

85
04:59.710 --> 05:00.790
و در واقع کار می‌کنه.

86
05:00.790 --> 05:02.800
پس ما Point یک و Point دو رو داریم.

87
05:02.830 --> 05:03.430
اوکی.

88
05:03.430 --> 05:07.720
حالا نکته‌ی بعدی که می‌خوام نشونتون بدم اینه که structها انواع مقداری (Value Types) هستن.

89
05:07.720 --> 05:12.340
پس فرض کنید یک Point سه داریم و اسمش P3 هست.

90
05:12.340 --> 05:16.540
و حالا اون یک new Point نخواهد بود، بلکه P1 خواهد بود.

91
05:16.540 --> 05:23.020
خب حالا فرض کنید p3 x رو روی 50 سِت می‌کنم.

92
05:23.020 --> 05:29.870
بعد می‌خوام P1 و P2 یا در واقع تو این مورد P3 رو نمایش بدم.

93
05:29.870 --> 05:30.380
درسته.

94
05:30.380 --> 05:32.270
پس بفرمایید.

95
05:32.270 --> 05:36.950
و خواهیم دید که این Point یک و این Point سه هست.

96
05:36.950 --> 05:38.450
پس ما جایگزین کردیم.

97
05:38.450 --> 05:42.050
و نکته‌ی جالب اینه که فقط تونستیم مقادیر رو از Point یک بگیریم.

98
05:42.050 --> 05:45.140
و 10، 20 بود برای P3.

99
05:45.140 --> 05:47.840
پس این Point سه هست و حالا 50 هست.

100
05:47.870 --> 05:48.230
اوکی.

101
05:48.230 --> 05:50.560
پس مقدار x اون جایگزین شد.

102
05:50.560 --> 05:55.540
پس ما فقط تونستیم مقدار P1 رو تو P3 انتساب (assign) بدیم.

103
05:55.570 --> 06:00.400
اینطور نیست که ما واقعاً آبجکت P1 رو به اصطلاح تو P3 قرار داده باشیم.

104
06:00.400 --> 06:04.750
ما فقط مقادیر رو از P1 به P3 پاس دادیم.

105
06:04.780 --> 06:09.280
این موضوع وقتی که کلاس‌ها رو هم باهاش مقایسه کنیم، بیشتر منطقی خواهد بود.

> NESA:
106
06:09.520 --> 06:10.960
فکر می‌کنم برای الان کافیه.

107
06:10.960 --> 06:14.200
بیایید تو ویدیوی بعدی کمی بیشتر به structها بپردازیم.
