Tôi nghĩ rằng bạn đang nhầm lẫn các lớp học với trong đó thời gian sử dụng bộ nhớ với cách giữ bộ nhớ. Khi bạn tạo một thể hiện của một lớp bình thường, bộ nhớ của cá thể đó tồn tại trên heap. Tài liệu tham khảo đối với trường hợp này có thể nằm trong đối tượng trên heap (nếu bạn đặt biến thành viên bên trong một đối tượng khác của đối tượng vào nó); hoặc một biến ngăn xếp (nếu bạn khai báo một biến cho đối tượng bên trong một phương thức hoặc truyền cho một hàm gọi), hoặc nó có thể nằm trong danh sách các rễ toàn cầu (nếu nó là một tham chiếu tĩnh, ví dụ như một tham chiếu Singleton).
Không thể khởi tạo lớp tĩnh. Không có "tham chiếu" cho lớp ở bất kỳ đâu (ngoại trừ thông tin kiểu). Các phương thức của nó chỉ là các hàm được nạp vào bộ nhớ khi CLR nạp assembly. Bạn có thể tạo một delegate trỏ đến một trong những phương thức này, nhưng điều đó cũng không tạo ra một tham chiếu tới một cá thể lớp. Đó chỉ là một con trỏ đến một hàm.
Ví dụ, nhìn vào mã này:
class ObjectWrapper
{
Object obj = new Object();
}
static void Main(string[] args)
{
ObjectWrapper wrapper = new ObjectWrapper();
...
}
Phương pháp chính tạo ra một thể hiện của một lớp ObjectWrapper. Ví dụ này tồn tại trên heap.
Bên trong cá thể ObjectWrapper, có một cá thể của đối tượng lớp đang tồn tại trên vùng heap. Tham chiếu đến lớp này là bên trong thể hiện, vì vậy tôi đoán bạn có thể nghĩ đến tham chiếu là "sống trong đống".
Bây giờ, so sánh này để đoạn mã sau:
class Singleton
{
static readonly instance = new Singleton();
}
Các thể hiện của đối tượng Singleton sống trên đống, quá. Tuy nhiên, tham chiếu là tham chiếu tĩnh. Nó được CLR duy trì trong một danh sách các tham chiếu toàn cục hoặc "root".
Bây giờ nhìn vào lớp tĩnh này:
class ObjectWrapper
{
Object obj = new Object();
}
static class HelperMethods
{
static int DoSomethingUseful(ObjectWrapper wrapper1)
{
ObjectWraper wrapper2 = wrapper1;
// code here
}
}
HelperMethods là một lớp tĩnh. Bạn không thể khởi tạo lớp HelperMethods. Không thể có bất kỳ đối tượng nào từ lớp này trên heap. Tuy nhiên, trong phương thức DoSomethingUseful, nó có hai tham chiếu đến một cá thể của lớp ObjectWrapper trên ngăn xếp. Một được thông qua, và một được khai báo bên trong phương thức.
Tôi không hiểu bất kỳ phần nào của câu hỏi này. Bạn có ý nghĩa gì bởi "giá trị của nó" và "ref của nó"? –
Tôi hy vọng anh ấy đang nói về cách nó tách mã thực thi khỏi các thành viên dữ liệu. –
Trong số các vấn đề khác, đó là "của nó". – jason