WEBVTT

1
00:00:00.120 --> 00:00:04.719
<v Speaker 1>Imagine you spend like two solid years writing this highly

2
00:00:04.719 --> 00:00:10.039
<v Speaker 1>proprietary algorithmic trading engine. I mean it's your company's absolute

3
00:00:10.119 --> 00:00:10.800
<v Speaker 1>secret sauce.

4
00:00:10.880 --> 00:00:12.320
<v Speaker 2>Oh yeah, the crown jewels of.

5
00:00:12.240 --> 00:00:15.160
<v Speaker 1>The business exactly. So you compile the application you deployed

6
00:00:15.199 --> 00:00:17.519
<v Speaker 1>to a server, and you think your intellectual property is

7
00:00:17.559 --> 00:00:18.760
<v Speaker 1>completely secure.

8
00:00:18.600 --> 00:00:19.800
<v Speaker 2>Right because it's compiled.

9
00:00:20.000 --> 00:00:23.640
<v Speaker 1>Yeah, but here's the crazy part. Anyone with a free

10
00:00:23.760 --> 00:00:27.640
<v Speaker 1>open source tool can just take your compiled executable file

11
00:00:28.399 --> 00:00:32.960
<v Speaker 1>and decompile it back into perfectly readable C sharp source

12
00:00:33.000 --> 00:00:34.840
<v Speaker 1>code in seconds.

13
00:00:34.640 --> 00:00:36.280
<v Speaker 2>Which is wild to think about.

14
00:00:36.280 --> 00:00:39.520
<v Speaker 1>It really is. I mean, in almost any other programming ecosystem,

15
00:00:39.920 --> 00:00:43.240
<v Speaker 1>that kind of transparency is a catastrophic security flaw, but

16
00:00:43.280 --> 00:00:46.479
<v Speaker 1>in c sharp it is this deliberate, genius architectural choice.

17
00:00:46.560 --> 00:00:49.119
<v Speaker 2>Yeah, it all comes down to the intermediate language or IL.

18
00:00:49.240 --> 00:00:51.799
<v Speaker 2>It leaves all the rich metadata completely intact.

19
00:00:51.520 --> 00:00:53.439
<v Speaker 3>So it's basically an open book pretty much.

20
00:00:53.479 --> 00:00:56.679
<v Speaker 2>And I mean that level of exposure feels terrifying initially,

21
00:00:56.759 --> 00:00:59.520
<v Speaker 2>but when you really look under the hood, that exact

22
00:00:59.560 --> 00:01:04.120
<v Speaker 2>transparency is the engine powering the entire dot net ecosystem.

23
00:01:04.599 --> 00:01:09.920
<v Speaker 2>It's the fundamental mechanism that enables cross platform capabilities. Dynamic

24
00:01:10.000 --> 00:01:12.879
<v Speaker 2>memory safety and cross language interoperability.

25
00:01:12.959 --> 00:01:15.239
<v Speaker 1>Well, welcome to this custom tailor deep dive. Today we

26
00:01:15.280 --> 00:01:18.599
<v Speaker 1>are cracking open the blueprint of this architecture. We're using

27
00:01:18.680 --> 00:01:21.280
<v Speaker 1>the book c sharp seven point zero in a nutshell,

28
00:01:21.599 --> 00:01:24.640
<v Speaker 1>the Definitive Reference by Joseph and Ben Albahari.

29
00:01:24.799 --> 00:01:27.120
<v Speaker 2>It's a massive book, but there is so much good

30
00:01:27.120 --> 00:01:27.680
<v Speaker 2>stuff in there.

31
00:01:27.760 --> 00:01:31.359
<v Speaker 1>Oh completely, Yeah, So okay, let's unpack this. Our mission

32
00:01:31.359 --> 00:01:34.640
<v Speaker 1>today is to explore how c sharp balance is incredibly

33
00:01:34.680 --> 00:01:38.359
<v Speaker 1>strict bunker level compile time rules with the run time

34
00:01:38.439 --> 00:01:39.840
<v Speaker 1>flexibility of a pop up tent.

35
00:01:40.000 --> 00:01:40.959
<v Speaker 2>That's a great way to put it.

36
00:01:41.000 --> 00:01:43.359
<v Speaker 1>We are going to extract the underlying mechanics of how

37
00:01:43.400 --> 00:01:46.760
<v Speaker 1>this language evolve from this rigid Windows only desktop tool

38
00:01:46.959 --> 00:01:51.280
<v Speaker 1>into a framework powering everything from Linux servers to iOS

39
00:01:51.319 --> 00:01:51.959
<v Speaker 1>mobile games.

40
00:01:52.079 --> 00:01:55.000
<v Speaker 2>Yeah, and to truly appreciate the advanced optimizations in the

41
00:01:55.000 --> 00:01:57.120
<v Speaker 2>seven point zero release, we first have to examine the

42
00:01:57.120 --> 00:01:58.439
<v Speaker 2>foundational DNA.

43
00:01:58.280 --> 00:02:00.640
<v Speaker 3>Right right where it all started exactly.

44
00:02:00.840 --> 00:02:00.920
<v Speaker 1>So.

45
00:02:01.040 --> 00:02:04.799
<v Speaker 2>C sharp is historically rooted as a statically typed language,

46
00:02:05.120 --> 00:02:08.639
<v Speaker 2>but it actively subverts its own strict identity by pulling

47
00:02:08.639 --> 00:02:11.039
<v Speaker 2>in heavy functional programming concepts.

48
00:02:11.280 --> 00:02:14.560
<v Speaker 1>I definitely notice that tension while reviewing the sources. You

49
00:02:14.639 --> 00:02:19.439
<v Speaker 1>have this rigid type enforcement where you simply cannot implicitly

50
00:02:19.520 --> 00:02:21.639
<v Speaker 1>coerce a string into an integer.

51
00:02:21.879 --> 00:02:23.560
<v Speaker 2>No, the compiler will just yell at you.

52
00:02:23.800 --> 00:02:28.000
<v Speaker 1>Right. But simultaneously you have these functional constructs like delegates,

53
00:02:28.120 --> 00:02:31.159
<v Speaker 1>where functions themselves are treated as first class citizens.

54
00:02:31.199 --> 00:02:33.879
<v Speaker 2>Yeah, you can pass methods around as arguments.

55
00:02:33.439 --> 00:02:36.800
<v Speaker 1>Exactly and use Lamba expressions to spin up anonymous functions

56
00:02:36.800 --> 00:02:39.599
<v Speaker 1>on the fly. Plus, there is this aggressive push toward

57
00:02:39.639 --> 00:02:41.680
<v Speaker 1>immutability in the language design.

58
00:02:41.639 --> 00:02:44.599
<v Speaker 2>And that functional borrowing. I mean, it's an incredibly pragmatic

59
00:02:44.680 --> 00:02:47.599
<v Speaker 2>choice by the language designers. When you treat functions as

60
00:02:47.719 --> 00:02:52.000
<v Speaker 2>values and favor read only immutable types, you drastically reduce

61
00:02:52.080 --> 00:02:52.919
<v Speaker 2>unintended side.

62
00:02:52.759 --> 00:02:54.719
<v Speaker 3>Effects, which is huge for debugging.

63
00:02:54.919 --> 00:02:57.680
<v Speaker 2>Oh massive. It becomes critical when you start dealing with

64
00:02:57.759 --> 00:03:02.599
<v Speaker 2>concurrent execution across multiple threats because immutable states simply cannot

65
00:03:02.639 --> 00:03:04.120
<v Speaker 2>be corrupted by race conditions.

66
00:03:04.159 --> 00:03:05.400
<v Speaker 1>That makes total sense.

67
00:03:05.439 --> 00:03:09.319
<v Speaker 2>But the strictness you mentioned the static typing is equally important. Now.

68
00:03:09.360 --> 00:03:12.479
<v Speaker 2>Some developers feel that static typing creates friction, you know.

69
00:03:12.599 --> 00:03:13.280
<v Speaker 1>Oh for sure.

70
00:03:13.400 --> 00:03:16.759
<v Speaker 2>They argue they lose agility when forced to rigidly define

71
00:03:16.960 --> 00:03:19.319
<v Speaker 2>every interface and type boundary up front.

72
00:03:19.400 --> 00:03:22.439
<v Speaker 1>I will admit I have felt that friction myself. If

73
00:03:22.479 --> 00:03:25.800
<v Speaker 1>I compare it to a dynamic language like Python or JavaScript,

74
00:03:26.080 --> 00:03:28.800
<v Speaker 1>where I can just start writing logic and assigning variables

75
00:03:29.080 --> 00:03:32.639
<v Speaker 1>without declaring their shapes, right, you just go yeah, exactly,

76
00:03:32.960 --> 00:03:34.759
<v Speaker 1>c sharp can feel like it requires a lot of

77
00:03:34.759 --> 00:03:37.439
<v Speaker 1>bureaucratic overhead before you even get to run the code.

78
00:03:37.520 --> 00:03:40.120
<v Speaker 2>What's fascinating here is the counter argument presented by the

79
00:03:40.159 --> 00:03:43.840
<v Speaker 2>Albahari brothers. They argue that this strictness is actually a

80
00:03:43.919 --> 00:03:45.599
<v Speaker 2>massive development accelerant.

81
00:03:45.879 --> 00:03:47.560
<v Speaker 1>Really how so well.

82
00:03:47.879 --> 00:03:51.960
<v Speaker 2>By enforcing type safety at compile time, c sharp completely

83
00:03:52.120 --> 00:03:55.280
<v Speaker 2>shifts the burden of discovering bugs. You aren't relying on

84
00:03:55.400 --> 00:03:58.439
<v Speaker 2>massive suites of run time unit tests just to catch

85
00:03:58.439 --> 00:03:59.719
<v Speaker 2>a basic type mismatch.

86
00:04:00.120 --> 00:04:02.120
<v Speaker 1>Because the compiler just refuses to build.

87
00:04:01.960 --> 00:04:03.639
<v Speaker 3>The application exactly.

88
00:04:03.719 --> 00:04:06.400
<v Speaker 2>It stops you before you even start. And beyond that,

89
00:04:06.639 --> 00:04:10.080
<v Speaker 2>because the environment knows the precise memory layout and type

90
00:04:10.240 --> 00:04:14.919
<v Speaker 2>of every single object, that rich metadata feeds directly into

91
00:04:14.919 --> 00:04:16.000
<v Speaker 2>your ide.

92
00:04:15.879 --> 00:04:17.360
<v Speaker 1>Oh like IntelliSense.

93
00:04:17.480 --> 00:04:20.439
<v Speaker 2>Yes, tools like intell a Sense aren't just guessing. They

94
00:04:20.519 --> 00:04:24.120
<v Speaker 2>actively generate code and suggest valid methods based on the

95
00:04:24.160 --> 00:04:26.279
<v Speaker 2>absolute certainty of the type system.

96
00:04:26.600 --> 00:04:29.560
<v Speaker 1>Let's transition to how that memory is actually managed. Because

97
00:04:29.839 --> 00:04:33.199
<v Speaker 1>the garbage collector within the Common language runtime handles an

98
00:04:33.319 --> 00:04:34.680
<v Speaker 1>enormous amount of heavy lifting.

99
00:04:34.800 --> 00:04:37.120
<v Speaker 2>It really does. It's the unsung hero, right.

100
00:04:37.439 --> 00:04:40.560
<v Speaker 1>Instead of forcing the developer to manually allocate and free

101
00:04:40.639 --> 00:04:44.160
<v Speaker 1>up individual bites of memory, the COLR operates as a

102
00:04:44.199 --> 00:04:47.240
<v Speaker 1>background night watchman. I like that analogy, and it isn't

103
00:04:47.279 --> 00:04:50.839
<v Speaker 1>just cleaning up orphaned objects. The garbage collector actually physically

104
00:04:50.879 --> 00:04:55.120
<v Speaker 1>compacts the memory heap. It moves active objects closer together

105
00:04:55.199 --> 00:04:57.079
<v Speaker 1>to prevent fragmentation.

106
00:04:56.759 --> 00:05:00.120
<v Speaker 2>Which ensures much faster CPU cash access when the program

107
00:05:00.160 --> 00:05:03.759
<v Speaker 2>is running. And that compaction process is a brilliant piece

108
00:05:03.800 --> 00:05:09.319
<v Speaker 2>of runtime engineering. It utilizes a generational model, categorizing objects

109
00:05:09.319 --> 00:05:12.839
<v Speaker 2>into generation zero, one, or two based on how long

110
00:05:12.879 --> 00:05:14.519
<v Speaker 2>they have survived in memory.

111
00:05:14.240 --> 00:05:16.480
<v Speaker 1>So it knows what to check and what to ignore. Right.

112
00:05:16.560 --> 00:05:19.920
<v Speaker 2>It optimizes the scanning process. But doing this requires the

113
00:05:20.000 --> 00:05:22.920
<v Speaker 2>run time to briefly pause application.

114
00:05:22.560 --> 00:05:25.240
<v Speaker 3>Execution, the dreaded GC pause.

115
00:05:25.360 --> 00:05:28.639
<v Speaker 2>Yeah. For the vast majority of applications, that pause is

116
00:05:28.639 --> 00:05:32.680
<v Speaker 2>completely imperceptible. However, if a developer is writing a highly

117
00:05:32.680 --> 00:05:36.639
<v Speaker 2>performance critical system, say a high frequency trading platform or

118
00:05:36.680 --> 00:05:38.639
<v Speaker 2>a low level graphics engine.

119
00:05:38.319 --> 00:05:39.720
<v Speaker 1>Where every millisecond counts.

120
00:05:39.759 --> 00:05:45.160
<v Speaker 2>Exactly in those cases that garbage collection pause introduces unacceptable latency.

121
00:05:45.439 --> 00:05:47.759
<v Speaker 1>And this is where c sharp offers a really fascinating

122
00:05:47.839 --> 00:05:50.519
<v Speaker 1>escape patch. The language does not actually lock you out

123
00:05:50.560 --> 00:05:52.680
<v Speaker 1>of direct manual memory manipulation.

124
00:05:52.920 --> 00:05:54.839
<v Speaker 2>Now, it gives you the keys if you really want them.

125
00:05:54.920 --> 00:05:58.079
<v Speaker 1>Yeah, you can still use explicit memory pointers to bypass

126
00:05:58.120 --> 00:06:01.879
<v Speaker 1>the garbage collector entirely catch is that you must explicitly

127
00:06:01.920 --> 00:06:05.360
<v Speaker 1>wrap those specific code blocks in an unsafe context.

128
00:06:05.480 --> 00:06:07.439
<v Speaker 2>The unsafe keyword, right.

129
00:06:07.680 --> 00:06:09.879
<v Speaker 1>It is the compiler's way of letting you take the

130
00:06:09.920 --> 00:06:14.160
<v Speaker 1>safety rails off, provided you explicitly acknowledge the risk of

131
00:06:14.199 --> 00:06:16.959
<v Speaker 1>introducing memory leaks or buffer overflows.

132
00:06:17.199 --> 00:06:20.839
<v Speaker 2>And the inclusion of that unsafe keyword really highlights the

133
00:06:20.879 --> 00:06:24.759
<v Speaker 2>strict boundary between the managed environment and raw machine execution.

134
00:06:25.360 --> 00:06:27.959
<v Speaker 2>Because c sharp code is never executed directly by.

135
00:06:27.879 --> 00:06:30.279
<v Speaker 3>The processor, right, there's a middleman exactly.

136
00:06:30.800 --> 00:06:34.279
<v Speaker 2>The compiler acts as a first stage translator, converting your

137
00:06:34.399 --> 00:06:37.959
<v Speaker 2>high level syntax into intermediate language and then packaging it

138
00:06:38.040 --> 00:06:38.879
<v Speaker 2>into an assembly.

139
00:06:39.040 --> 00:06:42.279
<v Speaker 1>And going back to our opening hook, this assembly isn't

140
00:06:42.360 --> 00:06:45.360
<v Speaker 1>just a basic container for instructions. It is packed with

141
00:06:45.480 --> 00:06:46.680
<v Speaker 1>comprehensive metadata.

142
00:06:46.720 --> 00:06:52.399
<v Speaker 2>We're talking complete type definitions, method signatures, properties, events.

143
00:06:52.000 --> 00:06:55.680
<v Speaker 1>Everything, and tools like aslespy use that exact medidata to

144
00:06:55.720 --> 00:06:58.560
<v Speaker 1>reverse engineer the original C sharp code. So if a

145
00:06:58.600 --> 00:07:01.480
<v Speaker 1>developer needs to protect their intel sellectual property, they have

146
00:07:01.519 --> 00:07:05.160
<v Speaker 1>to rely on third party obbusekaters to actively scramble that

147
00:07:05.199 --> 00:07:06.600
<v Speaker 1>metadata before deployment.

148
00:07:07.000 --> 00:07:10.480
<v Speaker 2>Yeah, they have to intentionally break the readability. But the

149
00:07:10.560 --> 00:07:14.120
<v Speaker 2>deliberate decision to ship assemblies with that level of introspection

150
00:07:14.240 --> 00:07:18.000
<v Speaker 2>is what makes dynamic linking possible without complex C plus

151
00:07:18.040 --> 00:07:19.399
<v Speaker 2>plus style header files.

152
00:07:19.519 --> 00:07:20.360
<v Speaker 3>Oh, that makes sense.

153
00:07:20.560 --> 00:07:23.800
<v Speaker 2>When one assembly references another the common language, run time

154
00:07:24.000 --> 00:07:28.240
<v Speaker 2>uses that embedded metadata to verify type safety and memory

155
00:07:28.319 --> 00:07:30.600
<v Speaker 2>layouts instantaneously.

156
00:07:29.800 --> 00:07:31.399
<v Speaker 1>So they could just talk to each other naturally.

157
00:07:31.560 --> 00:07:36.240
<v Speaker 2>Exactly. It allows completely different languages to interact seamlessly. A

158
00:07:36.319 --> 00:07:39.040
<v Speaker 2>library written in F sharp can be natively consumed by

159
00:07:39.079 --> 00:07:42.639
<v Speaker 2>a C sharp application because both compilers output the exact

160
00:07:42.639 --> 00:07:45.319
<v Speaker 2>same self describing intermediate language, and.

161
00:07:45.240 --> 00:07:49.279
<v Speaker 1>The final translation step happens at the absolute last possible millisecond.

162
00:07:49.920 --> 00:07:53.639
<v Speaker 1>The just in time compiler or JIT takes that intermediate

163
00:07:53.720 --> 00:07:55.959
<v Speaker 1>language and converts it into native machine.

164
00:07:55.639 --> 00:07:56.879
<v Speaker 2>Code right at the finish line.

165
00:07:56.959 --> 00:07:59.600
<v Speaker 1>Yeah, and it analyzes the specific hardware it is currently

166
00:07:59.600 --> 00:08:02.600
<v Speaker 1>executeting on. If the server has in x sixty four

167
00:08:02.639 --> 00:08:07.240
<v Speaker 1>processor with advanced vector extensions, the JIT optimizes the machine

168
00:08:07.240 --> 00:08:10.279
<v Speaker 1>code specifically to leverage that hardware.

169
00:08:09.959 --> 00:08:13.240
<v Speaker 2>Architecture, which is something a standard ahead of time compiler

170
00:08:13.319 --> 00:08:15.560
<v Speaker 2>can only guess at during the build process.

171
00:08:15.639 --> 00:08:18.720
<v Speaker 1>Exactly, it's building the plane while flying it, but in

172
00:08:18.759 --> 00:08:19.759
<v Speaker 1>the best way possible.

173
00:08:19.879 --> 00:08:23.519
<v Speaker 2>The JT compiler optimizes for the execution environment rather than

174
00:08:23.519 --> 00:08:28.680
<v Speaker 2>the build environment. It continuously profiles the running application, identifying

175
00:08:28.720 --> 00:08:34.679
<v Speaker 2>which methods are called frequently, and aggressively optimizes those hot paths.

176
00:08:34.600 --> 00:08:37.200
<v Speaker 1>While largely ignoring dead code exactly.

177
00:08:37.360 --> 00:08:40.720
<v Speaker 2>And this architecture, the IL, the rich metadata, and the

178
00:08:40.840 --> 00:08:46.279
<v Speaker 2>GIT compiler forms the absolute bedrock of c sharp's platform independence,

179
00:08:46.519 --> 00:08:46.919
<v Speaker 2>and that.

180
00:08:46.919 --> 00:08:50.480
<v Speaker 1>Intermediate state is the exact mechanism that allowed the ecosystem

181
00:08:50.519 --> 00:08:53.600
<v Speaker 1>to break out of its Windows only origins. Because you

182
00:08:53.639 --> 00:08:57.360
<v Speaker 1>aren't compiling to operating system specific machine code.

183
00:08:57.039 --> 00:09:00.000
<v Speaker 2>You merely need a run time environment on the target device.

184
00:09:00.240 --> 00:09:01.960
<v Speaker 1>Right, So what does this all mean for you as

185
00:09:01.960 --> 00:09:05.000
<v Speaker 1>a developer? This architectural pivot led to dot net core

186
00:09:05.120 --> 00:09:08.480
<v Speaker 1>for Linux and macOS and zamorin for iOS and Android.

187
00:09:08.639 --> 00:09:09.720
<v Speaker 2>It opened the floodgates.

188
00:09:10.000 --> 00:09:12.799
<v Speaker 1>It really did. You can write an enterprise back end

189
00:09:13.000 --> 00:09:16.240
<v Speaker 1>running on a Headlessubuntu server and a mobile client app

190
00:09:16.240 --> 00:09:20.000
<v Speaker 1>on an iPhone utilizing the exact same language and logic.

191
00:09:19.879 --> 00:09:23.679
<v Speaker 2>But to remain highly performant across all those disparate platforms,

192
00:09:24.080 --> 00:09:28.120
<v Speaker 2>the language itself had to undergo rapid, massive mutations over

193
00:09:28.159 --> 00:09:28.559
<v Speaker 2>the years.

194
00:09:28.639 --> 00:09:28.799
<v Speaker 1>Oh.

195
00:09:28.799 --> 00:09:31.600
<v Speaker 2>Absolutely, the history of c sharp really serves as a

196
00:09:31.639 --> 00:09:37.759
<v Speaker 2>master class in solving structural developer bottlenecks without breaking backward compatibility.

197
00:09:38.159 --> 00:09:41.320
<v Speaker 2>We see this super clearly in how Microsoft addressed the

198
00:09:41.360 --> 00:09:43.919
<v Speaker 2>performance overhead of early collection types.

199
00:09:44.000 --> 00:09:46.120
<v Speaker 1>Oh I was reading the breakdown on how early sea

200
00:09:46.159 --> 00:09:49.960
<v Speaker 1>sharp handled data collections. It sounded painful. If you wanted

201
00:09:49.960 --> 00:09:51.720
<v Speaker 1>a simple list of integers, you had to use a

202
00:09:51.759 --> 00:09:54.600
<v Speaker 1>collection that treated everything as a generic base object.

203
00:09:54.720 --> 00:09:56.360
<v Speaker 2>Yeah, the old array list right.

204
00:09:56.879 --> 00:09:59.440
<v Speaker 1>And an integer is a value type, meaning it's stored

205
00:09:59.480 --> 00:10:02.799
<v Speaker 1>efficiently on the memory stack, but objects live on the heap,

206
00:10:03.000 --> 00:10:05.679
<v Speaker 1>So the runtime had to constantly box the integer by

207
00:10:05.720 --> 00:10:08.960
<v Speaker 1>allocating memory on the heap and wrapping it in an object.

208
00:10:08.759 --> 00:10:11.679
<v Speaker 2>And then unbox it later by extracting the value back out.

209
00:10:11.960 --> 00:10:16.200
<v Speaker 1>Yes, the CPU cycles wasted on allocating and garbage collecting

210
00:10:16.240 --> 00:10:19.279
<v Speaker 1>those tiny objects were massive.

211
00:10:19.039 --> 00:10:22.639
<v Speaker 2>Huge bottleneck, but the introduction of generics and c sharp

212
00:10:22.679 --> 00:10:26.120
<v Speaker 2>two point zero fundamentally solve that memory overhead. Instead of

213
00:10:26.159 --> 00:10:30.159
<v Speaker 2>boxing everything into base objects, developers could define strongly typed

214
00:10:30.200 --> 00:10:33.480
<v Speaker 2>collections using a placeholder type parameter, and.

215
00:10:33.440 --> 00:10:36.000
<v Speaker 1>That required a totally new CLR. Didn't it.

216
00:10:36.000 --> 00:10:39.840
<v Speaker 2>It did because c sharp utilizes reheffied generics, meaning the

217
00:10:39.960 --> 00:10:44.440
<v Speaker 2>runtime generates specific, highly optimized implementations for each type used.

218
00:10:44.799 --> 00:10:48.360
<v Speaker 2>It eliminated the performance penalty of boxing entirely while preserving

219
00:10:48.399 --> 00:10:50.399
<v Speaker 2>absolute compile time type safety.

220
00:10:50.679 --> 00:10:53.840
<v Speaker 1>Another massive bottleneck they had to fix was data query.

221
00:10:54.440 --> 00:10:57.279
<v Speaker 1>When developers needed to filter a data set or query

222
00:10:57.279 --> 00:11:01.120
<v Speaker 1>a database, they wrote deeply nested loops. Worse, embedded raw

223
00:11:01.159 --> 00:11:03.919
<v Speaker 1>sequel strings directly into their c sharp code.

224
00:11:04.039 --> 00:11:05.879
<v Speaker 2>Oh the magic strings. They were a nightmare.

225
00:11:06.000 --> 00:11:09.080
<v Speaker 1>Right. The compiler couldn't verify the syntax of those sequel strings,

226
00:11:09.159 --> 00:11:12.039
<v Speaker 1>meaning a simple typo would compile perfectly fine but cause

227
00:11:12.039 --> 00:11:15.200
<v Speaker 1>a catastrophic crash at runtime. C sharp tackled this in

228
00:11:15.279 --> 00:11:18.360
<v Speaker 1>version three point zero by introducing Language Integrated Query or

229
00:11:18.480 --> 00:11:19.000
<v Speaker 1>LA and Q.

230
00:11:19.320 --> 00:11:22.320
<v Speaker 2>The underlying mechanics of LA and Q are just brilliant.

231
00:11:22.799 --> 00:11:26.679
<v Speaker 2>It leverages extension methods lambda expressions and deferred execution.

232
00:11:26.759 --> 00:11:28.679
<v Speaker 1>Deferred execution, that's the key part. Yeah.

233
00:11:28.960 --> 00:11:31.480
<v Speaker 2>When a developer writes a L and Q query, the

234
00:11:31.559 --> 00:11:34.840
<v Speaker 2>program does not immediately fetch the data. Instead, it builds

235
00:11:34.840 --> 00:11:37.960
<v Speaker 2>an expression tree, which is a memory representation of the

236
00:11:38.000 --> 00:11:38.679
<v Speaker 2>query logic.

237
00:11:38.759 --> 00:11:40.559
<v Speaker 3>It's just mapping out the plan exactly.

238
00:11:40.960 --> 00:11:43.879
<v Speaker 2>The query is only executed at the exact moment the

239
00:11:43.879 --> 00:11:47.799
<v Speaker 2>code actually attempts to iterate over the results. This deferred

240
00:11:47.799 --> 00:11:52.320
<v Speaker 2>execution allows the underlying provider like entity framework to heavily

241
00:11:52.360 --> 00:11:55.159
<v Speaker 2>optimize the query before ever sending it to the database.

242
00:11:55.399 --> 00:11:59.120
<v Speaker 1>It's so smart, But I think my favorite architectural shift

243
00:11:59.360 --> 00:12:02.720
<v Speaker 1>is how c SHP are five point zero addressed UI freezing.

244
00:12:03.360 --> 00:12:06.639
<v Speaker 1>We have all used applications that lock up entirely while

245
00:12:06.679 --> 00:12:08.759
<v Speaker 1>downloading a file or processing data.

246
00:12:08.919 --> 00:12:10.960
<v Speaker 2>Oh the spinning wheel of death right.

247
00:12:11.120 --> 00:12:13.679
<v Speaker 1>And this happens because the heavy operation is blocking the

248
00:12:13.679 --> 00:12:18.000
<v Speaker 1>main user interface thread. The historical solution was manually spawning

249
00:12:18.039 --> 00:12:21.759
<v Speaker 1>background threads and managing complex callback delegates.

250
00:12:21.360 --> 00:12:24.799
<v Speaker 2>Which quickly devolved into unreadable spaghetti.

251
00:12:24.399 --> 00:12:28.919
<v Speaker 1>Like code completely but the asynchronous programming model flattened that

252
00:12:28.960 --> 00:12:33.799
<v Speaker 1>complexity entirely by introducing the ASNC and AWAKE keywords. Developers

253
00:12:33.840 --> 00:12:38.759
<v Speaker 1>could write asynchronous operations that visually resemble synchronous linear code.

254
00:12:39.240 --> 00:12:42.360
<v Speaker 2>It reads top to bottom just like normal code, but

255
00:12:42.440 --> 00:12:45.720
<v Speaker 2>the compiler is doing intense gymnastics under the hood to

256
00:12:45.759 --> 00:12:46.879
<v Speaker 2>make that syntax work.

257
00:12:47.000 --> 00:12:48.720
<v Speaker 1>Yeah, when it hits in a way keyword, it doesn't

258
00:12:48.759 --> 00:12:52.320
<v Speaker 1>just plause the thread. The compiler actually generates a hidden

259
00:12:52.559 --> 00:12:54.080
<v Speaker 1>i asink state machine.

260
00:12:54.159 --> 00:12:56.519
<v Speaker 2>It's basically rewriting your methods exactly.

261
00:12:56.720 --> 00:12:59.879
<v Speaker 1>It effectively chops your method in half, unwinds the call stack,

262
00:13:00.399 --> 00:13:02.879
<v Speaker 1>and immediately returns control to the main thread, so the

263
00:13:02.960 --> 00:13:06.320
<v Speaker 1>user interface remains highly responsive. And then it just waits right,

264
00:13:06.360 --> 00:13:09.080
<v Speaker 1>And once the background task finishes fetching the data, the

265
00:13:09.120 --> 00:13:12.759
<v Speaker 1>state machine restores the local variables and resumes executing the

266
00:13:12.799 --> 00:13:15.639
<v Speaker 1>remainder of the method from the exact point it left off.

267
00:13:15.840 --> 00:13:20.159
<v Speaker 2>All of these continuous, complex language improvements required a highly

268
00:13:20.200 --> 00:13:24.159
<v Speaker 2>adaptable compiler infrastructure, and this culminated in c sharp six

269
00:13:24.200 --> 00:13:25.919
<v Speaker 2>point zero with Project Rosalin.

270
00:13:26.080 --> 00:13:27.559
<v Speaker 1>Here's where it gets really interesting.

271
00:13:27.840 --> 00:13:31.799
<v Speaker 2>Yeah, Microsoft completely rewrote the c sharp compiler from scratch

272
00:13:32.120 --> 00:13:36.000
<v Speaker 2>using c sharp itself. They exposed the entire compilation pipeline

273
00:13:36.039 --> 00:13:38.480
<v Speaker 2>as a set of open source libraries.

274
00:13:38.000 --> 00:13:40.440
<v Speaker 1>So developers can now use the compiler as a service,

275
00:13:40.559 --> 00:13:43.120
<v Speaker 1>feeding its source code and asking it for a syntax

276
00:13:43.159 --> 00:13:45.679
<v Speaker 1>tree or deep smantic analysis on the fly.

277
00:13:45.960 --> 00:13:48.440
<v Speaker 2>It opened up so many doors for custom tooling.

278
00:13:48.600 --> 00:13:51.559
<v Speaker 1>It really did, and this massive rewrite set the stage

279
00:13:51.559 --> 00:13:53.519
<v Speaker 1>for the rapid cadence of features we see in C

280
00:13:53.639 --> 00:13:56.759
<v Speaker 1>sharp seven point zero, where the focus shifted aggressively toward

281
00:13:56.840 --> 00:14:00.480
<v Speaker 1>reducing visual noise and developer fiction. Let's look at some

282
00:14:00.519 --> 00:14:03.120
<v Speaker 1>of the syntactic sugar that cleans up modern code basis.

283
00:14:03.279 --> 00:14:08.039
<v Speaker 2>My favorite is the null conditional operator. It drastically reduces

284
00:14:08.080 --> 00:14:09.039
<v Speaker 2>boilerplate logic.

285
00:14:09.159 --> 00:14:10.679
<v Speaker 1>Oh the Elvis operator, Yes.

286
00:14:10.559 --> 00:14:15.399
<v Speaker 2>The Elvis operator. Because checking for null references historically required

287
00:14:15.440 --> 00:14:19.480
<v Speaker 2>deeply nestative statements just to safely access a property buried

288
00:14:19.519 --> 00:14:21.039
<v Speaker 2>within an object hierarchy.

289
00:14:20.720 --> 00:14:23.919
<v Speaker 3>If the parent, then the child, then the grandchild exactly.

290
00:14:24.240 --> 00:14:28.360
<v Speaker 2>The null conditional operator allows developers to safely chain property accesses.

291
00:14:29.000 --> 00:14:31.399
<v Speaker 2>If any link in the chain is null, the evaluation

292
00:14:31.480 --> 00:14:34.000
<v Speaker 2>stops immediately and quietly returns null.

293
00:14:34.080 --> 00:14:37.840
<v Speaker 1>It prevents a runtime null reference exception without cluttering the

294
00:14:37.879 --> 00:14:41.360
<v Speaker 1>screen with logic. It provides an incredibly elegant syntax.

295
00:14:41.440 --> 00:14:41.919
<v Speaker 2>Definitely.

296
00:14:42.120 --> 00:14:46.039
<v Speaker 1>They also introduce numeric literal underscores in seven point zero.

297
00:14:46.840 --> 00:14:49.360
<v Speaker 1>If you need a variable to define a memory byte limit,

298
00:14:49.759 --> 00:14:53.039
<v Speaker 1>writing out one billion as a string of nine zeros

299
00:14:53.399 --> 00:14:55.840
<v Speaker 1>is a recipe for an undetected typo.

300
00:14:55.759 --> 00:14:58.120
<v Speaker 2>Because the human eye just blurs them all together.

301
00:14:58.320 --> 00:15:01.519
<v Speaker 1>Right. So C sharp seven point zero allows you to

302
00:15:01.639 --> 00:15:05.559
<v Speaker 1>insert underscores anywhere within the numeric literal. You write one

303
00:15:05.759 --> 00:15:08.519
<v Speaker 1>underscore zero zero zero underscore.

304
00:15:08.120 --> 00:15:09.919
<v Speaker 2>Just like writing commas in a normal number.

305
00:15:10.039 --> 00:15:13.080
<v Speaker 1>Yeah, the compiler strips the underscores out entirely during the

306
00:15:13.080 --> 00:15:17.320
<v Speaker 1>build process, leaving the machine code unaffected while significantly improving

307
00:15:17.399 --> 00:15:18.320
<v Speaker 1>human readability.

308
00:15:18.960 --> 00:15:21.480
<v Speaker 2>But I'd say the most profound structural change in version

309
00:15:21.559 --> 00:15:25.720
<v Speaker 2>seven point zero involves tuples. Returning multiple distinct values from

310
00:15:25.759 --> 00:15:29.679
<v Speaker 2>a single method has historically been a clumsy, high friction process.

311
00:15:29.720 --> 00:15:31.879
<v Speaker 1>I was actually looking at the Albahari breakdown of the

312
00:15:31.919 --> 00:15:35.120
<v Speaker 1>legacy workarounds for that. The old method was either using

313
00:15:35.200 --> 00:15:38.960
<v Speaker 1>out parameters, which forced you to declare variables before calling

314
00:15:38.960 --> 00:15:40.559
<v Speaker 1>the function, breaking the natural flow.

315
00:15:40.799 --> 00:15:42.519
<v Speaker 3>Yeah, that was always so annoying, right.

316
00:15:42.519 --> 00:15:45.080
<v Speaker 1>Or you had to build a custom class purely to

317
00:15:45.080 --> 00:15:48.600
<v Speaker 1>hold a return data. It's like packing for a quick

318
00:15:48.600 --> 00:15:51.679
<v Speaker 1>weekend trip. You don't want to buy and label this massive, expensive,

319
00:15:51.720 --> 00:15:54.639
<v Speaker 1>heavy duty suitcase. Just to carry a toothbrush and one

320
00:15:54.639 --> 00:15:55.279
<v Speaker 1>pair of socks.

321
00:15:55.360 --> 00:15:57.720
<v Speaker 2>No, you just need a lightweight Duffel bag exactly.

322
00:15:57.960 --> 00:16:01.000
<v Speaker 1>Building a formal class is the heavy suitcase. You are

323
00:16:01.039 --> 00:16:04.480
<v Speaker 1>allocating a reference type on the heap, which the garbage

324
00:16:04.480 --> 00:16:07.080
<v Speaker 1>collector now has to track and clean up just to

325
00:16:07.120 --> 00:16:09.399
<v Speaker 1>pass a couple of integers out of a function.

326
00:16:09.399 --> 00:16:13.080
<v Speaker 2>And tupples bypass that overhead entirely. The c sharp seven

327
00:16:13.120 --> 00:16:17.000
<v Speaker 2>point zero implementation introduces native language support backed by the

328
00:16:17.120 --> 00:16:17.879
<v Speaker 2>value tupples.

329
00:16:17.879 --> 00:16:20.440
<v Speaker 3>Struct and structs are value types right yes.

330
00:16:20.679 --> 00:16:23.519
<v Speaker 2>Meaning they are allocated highly efficiently on the memory stack

331
00:16:23.600 --> 00:16:27.000
<v Speaker 2>rather than the heap. When the method finishes execution, the

332
00:16:27.039 --> 00:16:30.879
<v Speaker 2>stack frame pops and the memory is instantly reclaimed.

333
00:16:30.440 --> 00:16:32.480
<v Speaker 1>Completely avoiding any garbage collection over.

334
00:16:32.440 --> 00:16:36.360
<v Speaker 2>It exactly, and the syntax is incredibly clean. Now you

335
00:16:36.399 --> 00:16:39.200
<v Speaker 2>wrap your return values in parentheses and you can name

336
00:16:39.240 --> 00:16:43.639
<v Speaker 2>the elements directly. A method simply returns, say, parentheses string name.

337
00:16:43.600 --> 00:16:47.639
<v Speaker 1>In age, and the calling code accesses those properties instantaneously

338
00:16:48.080 --> 00:16:50.279
<v Speaker 1>without needing a formal class blueprint.

339
00:16:50.480 --> 00:16:53.559
<v Speaker 2>Right And to complement the creation of tupples, seven point

340
00:16:53.639 --> 00:16:58.600
<v Speaker 2>zero also introduced deconstructors. Now a standard constructor takes independent

341
00:16:58.679 --> 00:17:01.960
<v Speaker 2>variables and package them into a unified object right.

342
00:17:01.879 --> 00:17:02.799
<v Speaker 1>Right, it puts them together.

343
00:17:03.120 --> 00:17:07.240
<v Speaker 2>A deconstructor is the exact mechanical inverse. It allows you

344
00:17:07.279 --> 00:17:10.119
<v Speaker 2>to take an object or a tuple and unpack its

345
00:17:10.160 --> 00:17:14.279
<v Speaker 2>internal values directly into separate, brand new local variables in

346
00:17:14.319 --> 00:17:16.200
<v Speaker 2>a single fluid line of code.

347
00:17:16.359 --> 00:17:19.440
<v Speaker 1>It effectively dissolves the container and leaves you with just

348
00:17:19.519 --> 00:17:21.559
<v Speaker 1>the raw data variables you actually.

349
00:17:21.200 --> 00:17:24.640
<v Speaker 2>Need exactly the language actively tries to get out of

350
00:17:24.640 --> 00:17:25.559
<v Speaker 2>the developer's way.

351
00:17:25.759 --> 00:17:29.039
<v Speaker 1>I see that same philosophy applied to local methods. Often

352
00:17:29.240 --> 00:17:32.160
<v Speaker 1>a developer writes a highly specialized helper function that is

353
00:17:32.200 --> 00:17:34.680
<v Speaker 1>strictly used by one specific method.

354
00:17:34.480 --> 00:17:36.359
<v Speaker 2>Like a calculation you only need in one spot.

355
00:17:36.519 --> 00:17:39.079
<v Speaker 1>Yeah, and defining it at the class level just clutters

356
00:17:39.160 --> 00:17:42.559
<v Speaker 1>up the object's public blueprint. Local methods allow you to

357
00:17:42.640 --> 00:17:45.839
<v Speaker 1>define a fully functional method nested inside the body of

358
00:17:45.880 --> 00:17:46.559
<v Speaker 1>another method.

359
00:17:46.839 --> 00:17:50.680
<v Speaker 2>They provide stronger encapsulation than lambda expressions, and they avoid

360
00:17:50.759 --> 00:17:53.119
<v Speaker 2>the hidden delegate allocation overhead.

361
00:17:53.319 --> 00:17:56.359
<v Speaker 1>Plus, the local method can access the local variables of

362
00:17:56.400 --> 00:17:57.720
<v Speaker 1>its parent function directly.

363
00:17:58.240 --> 00:18:01.279
<v Speaker 2>Right. It keeps the logic isolated and defined exactly where

364
00:18:01.319 --> 00:18:04.359
<v Speaker 2>it is invoked, which hugely improves maintainability.

365
00:18:04.759 --> 00:18:09.039
<v Speaker 1>Another powerful feature drastically reducing boilerplate is the expansion of

366
00:18:09.039 --> 00:18:13.720
<v Speaker 1>pattern matching C sharp seven point zero significantly upgraded the

367
00:18:13.799 --> 00:18:17.119
<v Speaker 1>capabilities of the eyes operator and the switch statement.

368
00:18:17.400 --> 00:18:20.839
<v Speaker 2>Oh this is a game changer. In earlier versions, a

369
00:18:20.839 --> 00:18:24.799
<v Speaker 2>switchblock operated as a basic routing table strictly for specific

370
00:18:25.000 --> 00:18:26.359
<v Speaker 2>constant values like.

371
00:18:26.279 --> 00:18:28.799
<v Speaker 1>If it's one, do this, if it's two, do that exactly.

372
00:18:29.279 --> 00:18:33.000
<v Speaker 2>But the new pattern matching capabilities allow developers to evaluate

373
00:18:33.039 --> 00:18:36.240
<v Speaker 2>the actual type of an object directly within the switch

374
00:18:36.240 --> 00:18:37.279
<v Speaker 2>statement's conditions.

375
00:18:37.359 --> 00:18:37.759
<v Speaker 1>Wow.

376
00:18:38.160 --> 00:18:40.599
<v Speaker 2>Yeah, you can pass a completely unknown object into a

377
00:18:40.640 --> 00:18:43.440
<v Speaker 2>switch block and program logic that says, you know, if

378
00:18:43.440 --> 00:18:46.720
<v Speaker 2>this object evaluates as a string type, execute this case block.

379
00:18:46.759 --> 00:18:49.759
<v Speaker 2>If it evaluates as an integer array, execute this one.

380
00:18:50.039 --> 00:18:52.279
<v Speaker 1>And the best part is that it combines the type

381
00:18:52.319 --> 00:18:55.799
<v Speaker 1>check and the casting operation into a single efficient step.

382
00:18:56.079 --> 00:18:57.599
<v Speaker 2>Yes, that saves so much time.

383
00:18:58.079 --> 00:19:01.480
<v Speaker 1>If the object matches the string pattern, you instantly assign

384
00:19:01.519 --> 00:19:04.720
<v Speaker 1>it to a new, strongly typed string variable right there

385
00:19:04.720 --> 00:19:08.359
<v Speaker 1>in the case declaration. The CPU only performs the expensive

386
00:19:08.359 --> 00:19:10.160
<v Speaker 1>type checking instruction once.

387
00:19:10.240 --> 00:19:12.680
<v Speaker 2>Rather than checking the type entering the block and then

388
00:19:12.799 --> 00:19:16.359
<v Speaker 2>executing a separate cast operation on the variable. It really

389
00:19:16.400 --> 00:19:19.640
<v Speaker 2>reduces the amount of casting logic developers have to write.

390
00:19:19.400 --> 00:19:22.519
<v Speaker 1>Ensuring the code remains focused on business logic rather than

391
00:19:22.559 --> 00:19:23.279
<v Speaker 1>just type wrangling.

392
00:19:23.400 --> 00:19:23.880
<v Speaker 2>Exactly.

393
00:19:24.000 --> 00:19:26.400
<v Speaker 1>Well, let's step back and look at the massive architectural

394
00:19:26.440 --> 00:19:30.079
<v Speaker 1>blueprint we've traced today. We started with a language heavily

395
00:19:30.119 --> 00:19:33.640
<v Speaker 1>bound to the Windows operating system, strictly reliant on rigid

396
00:19:33.680 --> 00:19:34.960
<v Speaker 1>object oriented structures.

397
00:19:35.000 --> 00:19:37.319
<v Speaker 2>It was a very different beast back then, it really was.

398
00:19:37.759 --> 00:19:40.799
<v Speaker 1>But through the engineering ingenuity of the Common Language run time,

399
00:19:41.279 --> 00:19:46.359
<v Speaker 1>the highly optimized JIT compilation of intermedy language, and this

400
00:19:46.519 --> 00:19:50.799
<v Speaker 1>aggressive evolution to solve developer bottlenecks, c sharp morphed into

401
00:19:50.839 --> 00:19:53.920
<v Speaker 1>a highly performant cross platform powerhouse.

402
00:19:54.119 --> 00:19:55.880
<v Speaker 2>It balances everything so well.

403
00:19:55.960 --> 00:19:59.480
<v Speaker 1>It leverages the safety of static typing while eagerly adopting

404
00:19:59.599 --> 00:20:04.000
<v Speaker 1>function paradigms and memory efficient structs like value tuble to

405
00:20:04.039 --> 00:20:07.799
<v Speaker 1>make the developer experience as frictionless and performant as possible.

406
00:20:08.079 --> 00:20:10.960
<v Speaker 2>And you know, this continuous refinement of the compiler and

407
00:20:11.000 --> 00:20:14.000
<v Speaker 2>the runtime environment really sets the stage for where software

408
00:20:14.079 --> 00:20:18.319
<v Speaker 2>architecture is heading next Owso well, this raises an important question.

409
00:20:18.799 --> 00:20:22.440
<v Speaker 2>If we look closely at the capabilities enabled by that

410
00:20:22.640 --> 00:20:26.799
<v Speaker 2>rich metadata we discussed earlier, it surfaces a compelling, almost

411
00:20:26.839 --> 00:20:28.839
<v Speaker 2>on settling concept regarding reflection.

412
00:20:29.319 --> 00:20:31.160
<v Speaker 1>Oh, where are we going with this?

413
00:20:31.559 --> 00:20:34.359
<v Speaker 2>We covered how a C sharp program uses reflection to

414
00:20:34.400 --> 00:20:36.799
<v Speaker 2>inspect its own structural metadata right.

415
00:20:36.640 --> 00:20:38.200
<v Speaker 1>Right, checking its own types.

416
00:20:37.920 --> 00:20:41.279
<v Speaker 2>But the system dot reflection dot emit namespace takes this

417
00:20:41.359 --> 00:20:45.039
<v Speaker 2>capability an order of magnitude. Further, a running SEA sharp

418
00:20:45.119 --> 00:20:49.119
<v Speaker 2>application possesses the native ability to generate brand new intermediate

419
00:20:49.160 --> 00:20:52.680
<v Speaker 2>language instructions, wrap them in a dynamic assembly, and execute

420
00:20:52.720 --> 00:20:53.240
<v Speaker 2>them on the fly.

421
00:20:53.440 --> 00:20:56.640
<v Speaker 1>Wait. Wait, the application can actively write and execute new

422
00:20:56.680 --> 00:20:59.640
<v Speaker 1>code for itself while it is already running in production.

423
00:21:00.079 --> 00:21:04.599
<v Speaker 2>Precisely, the program can analyze its environment, evaluate logic, and

424
00:21:04.720 --> 00:21:09.119
<v Speaker 2>manufacture new executable instructions that literally did not exist when

425
00:21:09.119 --> 00:21:10.599
<v Speaker 2>the software was originally compiled.

426
00:21:10.680 --> 00:21:11.440
<v Speaker 1>That's incredible.

427
00:21:11.599 --> 00:21:15.799
<v Speaker 2>Consider the implications for highly autonomous systems. If a strictly

428
00:21:15.839 --> 00:21:20.319
<v Speaker 2>typed compiled language possesses the native architecture to introspectively look

429
00:21:20.319 --> 00:21:25.079
<v Speaker 2>at its own structure and dynamically rewrite its own execution pathways.

430
00:21:24.759 --> 00:21:27.039
<v Speaker 1>What is the limit for self modifying software?

431
00:21:27.160 --> 00:21:27.720
<v Speaker 3>Exactly?

432
00:21:27.880 --> 00:21:30.359
<v Speaker 1>That is profound. I mean, could a C sharp application,

433
00:21:30.440 --> 00:21:34.039
<v Speaker 1>perhaps driven by an integrated AI model, evaluate a new

434
00:21:34.640 --> 00:21:38.759
<v Speaker 1>unforeseen problem in production and literally write a bespoke method

435
00:21:38.799 --> 00:21:39.519
<v Speaker 1>to solve it.

436
00:21:39.400 --> 00:21:42.480
<v Speaker 2>And compile it into memory without any human intervention.

437
00:21:42.720 --> 00:21:45.559
<v Speaker 1>The foundational mechanics for that level of autonomy have been

438
00:21:45.599 --> 00:21:47.880
<v Speaker 1>sitting right there in the dot net runtime this whole time.

439
00:21:48.079 --> 00:21:51.119
<v Speaker 2>It forces developers to reconsider the boundaries of what a

440
00:21:51.119 --> 00:21:54.599
<v Speaker 2>compiled application actually is. Is it a static set of

441
00:21:54.640 --> 00:21:58.039
<v Speaker 2>predetermined instructions or is it a living engine capable of

442
00:21:58.119 --> 00:21:59.680
<v Speaker 2>infinite real time adaptation.

443
00:22:00.160 --> 00:22:02.200
<v Speaker 1>That is a phenomenal thought to ponder the next time

444
00:22:02.200 --> 00:22:05.039
<v Speaker 1>you compile. Thank you for joining us on this deep

445
00:22:05.119 --> 00:22:08.160
<v Speaker 1>dive into the underlying architecture of c sharp. Whether you

446
00:22:08.200 --> 00:22:11.359
<v Speaker 1>are building low level memory unsafe routines or highly abstract

447
00:22:11.359 --> 00:22:15.039
<v Speaker 1>the syncretous web services, just remember there is always more

448
00:22:15.079 --> 00:22:17.559
<v Speaker 1>to learn beneath the syntax until next time.
