.NET 런타임이 참조 내용에 대한 액세스를 관리한다는 점을 제외하고, 참조는 포인터와 뜻이 같다. 참조도 그 값을 알 수 없다. 이를 통해 가비지 컬렉션은 사용자가 모르는 사이에 참조로 지정된 메모리를 필요에 따라 옮길 수 있다. C#에서 포인터를 사용할 수도 있지만 이는 안전하지 않은 컨텍스트에서만 가능하다.
가비지 컬렉션
프로그래머는 메모리 할당을 추적해야 하며 사용 후에는 할당된 메모리를 해제해야 한다. 그렇지 않으면 애플리케이션의 메모리 사용량이 지속적으로 증가할 것이다. 이를 ‘메모리 누수’라고 한다. 메모리를 수동으로 할당하고 해제하면 버그가 발생하기 쉽다. 프로그래머는 메모리를 해제하는 것을 잊어버리거나 심지어 이미 해제된 메모리를 다시 해제하려고 할 수 있다. 이는 여러 보안 관련 버그의 원인이 된다.
수동으로 메모리를 관리하던 문제를 해결하기 위해 처음 제안된 해결책 중 하나는 참조 카운트 방식이었다. 이것은 가비지 컬렉션의 원시적인 형태로 볼 수 있다. 프로그래머가 메모리를 해제하도록 주도권을 주는 대신 런타임은 할당된 각 객체에 대해 내부적으로 카운터를 갖고 있다. 주어진 객체에 대한 참조는 카운터를 증가시킬 것이고, 이 객체를 참조하는 변수가 스코프를 벗어날 때마다 카운터는 다시 감소할 것이다. 카운터가 0이 된다면 이는 객체를 참조하는 변수가 없다는 것을 의미하며 이때 카운터를 해제할 수 있다.