Несмотря на определенную путаницу в терминах, которые вы используете (я позволю кому-то еще заняться этим вопросом), я думаю Я понимаю, что вы говорите, и вы в основном правы.
В частности, ваш коллега считает, что это происходит:
// Now there is this "SomeFoo" object somewhere in memory.
SomeFoo fooClassInstance = new SomeFoo("test");
// Now there is this "IFoo" object somewhere in memory.
IFoo fooInterface = (IFoo)fooClassInstance;
// Let's say down the road somewhere, fooClassInstance is set to null or a different
// object. Your coworker believes that the object it originally pointed to will then
// have no references to it and will thus be eligible for garbage collection?
Если вышеизложенное является точным представлением того, что думает ваш коллега, тогда ваш коллег неправ, и вы правы. Переменная fooInterface
содержит ссылку на тот же объект, на который ссылалась fooClassInstance
. Вы можете легко проверить это, просто выполнив следующее:
SomeFoo fooClassInstance = new SomeFoo("test");
IFoo fooInterface = (IFoo)fooClassInstance;
bool sameObject = ReferenceEquals(fooClassInstance, fooInterface);
Если ReferenceEquals
возвращает true
, то две переменные ссылаются на один и тот же объект в памяти.
Если вашему коллеге нужна дополнительная убедительность, попробуйте показать ему что-то вроде этого:
List<int> list = new List<int> { 1, 2, 3 };
// This cast is actually not needed; I'm just including it so that it mirrors
// your example code.
IList<int> ilist = (IList<int>)list;
// Now we remove an item from the List<int> object referenced by list.
list.Remove(3);
// Is it in ilist? No--they are the same List<int> object.
Console.WriteLine(ilist.Contains(3));
// How about we remove an item using ilist, now?
ilist.Remove(2);
// Is it in list? Nope--same object.
Console.WriteLine(list.Contains(2));
// And here's one last thing to note: the type of a VARIABLE is not the same
// as the type of the OBJECT it references. ilist may be typed as IList<int>,
// but it points to an object that is truly a List<int>.
Console.WriteLine(ilist.GetType());