Я думаю, что вы путаете классы с где память живет с как память держится на. Когда вы создаете экземпляр нормального класса, память этого экземпляра живет в куче. A ссылка на этот экземпляр может находиться в объекте в куче (если вы установите переменную-член внутри другого экземпляра объекта); или переменной стека (если вы объявили переменную объекту внутри метода или передали его вызову функции), или он может быть в списке глобальных корней (если это статическая ссылка, например, ссылка Singleton).
Статический класс не может быть создан. Нет никакой ссылки на класс в любом месте (кроме информации о типе). Его методы - это просто функции, загружаемые в память, когда среда CLR загружает сборку. Вы можете создать делегат, который указывает на один из этих методов, но это также не делает ссылку на экземпляр класса. Это просто указатель на функцию.
Например, посмотрите на этот код:
class ObjectWrapper
{
Object obj = new Object();
}
static void Main(string[] args)
{
ObjectWrapper wrapper = new ObjectWrapper();
...
}
Главный метод создает экземпляр класса ObjectWrapper. Этот экземпляр живет в куче.
Внутри экземпляра ObjectWrapper есть экземпляр класса Object, который живет в куче. Ссылка на этот класс находится внутри экземпляра, поэтому, я думаю, вы могли бы считать ссылку «живущей в куче».
Теперь сравните это с помощью следующего кода:
class Singleton
{
static readonly instance = new Singleton();
}
Экземпляр объекта Singleton живет в куче, тоже. Однако ссылка является статической ссылкой. Он поддерживается CLR в списке глобальных или «корневых» ссылок.
Теперь посмотрим на этот статический класс:
class ObjectWrapper
{
Object obj = new Object();
}
static class HelperMethods
{
static int DoSomethingUseful(ObjectWrapper wrapper1)
{
ObjectWraper wrapper2 = wrapper1;
// code here
}
}
HelperMethods является статическим классом. Вы не можете создать экземпляр класса HelperMethods. В куче не может быть объектов этого класса. Однако в методе DoSomethingUseful он имеет две ссылки на экземпляр класса ObjectWrapper в стеке. Один передается, и один из них объявляется внутри метода.
Я не понимаю какой-либо части этого вопроса. Что вы подразумеваете под «своей ценностью» и «ее ссылкой»? –
Я ожидаю, что он говорит о том, как он отделяет исполняемый код от членов данных. –
Среди других вопросов это «его». – jason