Creo que está confundiendo con clases donde la memoria vive con cómo la memoria se lleva a cabo en el. Cuando crea una instancia de una clase normal, la memoria de esa instancia vive en el montón. Una referencia a esta instancia podría estar en un objeto en el montón (si establece una variable miembro dentro de una instancia diferente de un objeto); o una variable de pila (si declaró una variable al objeto dentro de un método o la pasó a una llamada de función), o puede estar en la lista de raíces globales (si es una referencia estática, por ejemplo, una referencia Singleton).
No se puede crear una instancia de una clase estática. No hay "referencia" a la clase en ningún lado (a excepción de la información de tipo). Sus métodos son solo funciones cargadas en la memoria cuando el CLR carga el ensamblaje. Puede crear un delegado que apunte a uno de estos métodos, pero eso tampoco hace una referencia a una instancia de la clase. Eso es solo un puntero a una función.
Por ejemplo, un vistazo a este código:
class ObjectWrapper
{
Object obj = new Object();
}
static void Main(string[] args)
{
ObjectWrapper wrapper = new ObjectWrapper();
...
}
el principal método crea una instancia de una clase ObjectWrapper. Esta instancia vive en el montón.
Dentro de la instancia de ObjectWrapper, hay una instancia de clase Object que vive en el montón. La referencia a esta clase está dentro de la instancia, así que supongo que podrías pensar en la referencia como "vivir en el montón".
Ahora, compare esto con el siguiente código:
class Singleton
{
static readonly instance = new Singleton();
}
La instancia del objeto Singleton vive en el montón, también. Sin embargo, la referencia es una referencia estática. Lo mantiene el CLR en una lista de referencias globales o "raíz".
Ahora mira esta clase estática:
class ObjectWrapper
{
Object obj = new Object();
}
static class HelperMethods
{
static int DoSomethingUseful(ObjectWrapper wrapper1)
{
ObjectWraper wrapper2 = wrapper1;
// code here
}
}
HelperMethods es una clase estática. No se puede crear una instancia de la clase HelperMethods. No puede haber ningún objeto de esta clase en el montón. Sin embargo, en el método DoSomethingUseful, tiene dos referencias a una instancia de la clase ObjectWrapper en la pila. Uno se pasa y uno se declara dentro del método.
No entiendo ninguna parte de esta pregunta. ¿Qué quiere decir con "su valor" y "su ref"? –
Espero que esté hablando de cómo separa el código ejecutable de los miembros de datos. –
Entre otros problemas, es "es". – jason