Now, back to the topic of how the garbage collector determines when an object is no longer needed. To understand the details, you need to be aware of the notion of application roots. Simply put, a root is a storage location containing a reference to an object on the managed heap. Strictly speaking, a root can fall into any of the following categories:
References to global objects (though these are not allowed in C#, CIL code does permit allocation of global objects)
References to any static objects/static fields
References to local objects within an application's code base
References to object parameters passed into a method
References to objects waiting to be finalized (described later in this chapter)
Any CPU ...