This chapter introduced the .NET application model. Through metadata and reflection, the framework can understand enough about your application to provide many services that you do not have to implement. On the other hand, we have seen how the framework is structured so that you can substitute your own objects and implementations where needed.
Type safety enables application domains to provide an effective yet economical form of application isolation. Contexts, proxies, and interception allow the runtime to transparently provide services to parts of applications that require them.
Another aspect of the .NET application model is the pervasive use of attributes, which can be easily added to source code and is stored with the metadata. We saw examples of the use of attributes for serialization and for synchronization, and we demonstrated how to implement and use custom attributes.
.NET simplifies the programming of memory management through an efficient, generational, automatic garbage collection facility. Finalization is non-deterministic, but you can support deterministic cleanup by implementing the dispose pattern or using the delete operator explicitly.