关于路过参考,我仍然很困惑.
如果我有一个Cache对象,我想访问/可用于许多对象,我使用构造函数注入注入它.我希望它影响我创建的单个缓存对象.例如.
public class Cache {
public void Remove(string fileToRemove) {
...
}
}
public class ObjectLoader {
private Cache _Cache;
public ObjectLoader(Cache cache) {
}
public RemoveFromCacheFIleThatHasBeenDeletedOrSimilarOperation(string filename) {
_Cache.Remove(fileName);
}
}
Run Code Online (Sandbox Code Playgroud)
当我将Cache传递给ObjectLoader构造函数时,我应该使用ref吗?
sta*_*son 11
不,在这种情况下您不需要使用ref关键字.
Cache是一个类,它是一个引用类型.将引用传递给方法时,引用的副本(不是对象本身)将放入您的参数中.方法的内部和外部引用都指向堆上的同一对象,并且使用一个对象的字段的修改将反映在另一个中.
在方法调用中添加ref会传入原始引用.这在您将new在调用方法中重新分配(即通过调用)引用指向的位置的情况下非常有用.
当您需要修改引用指向的内容时,请使用'ref'关键字.当你通过引用类型到一个方法它是由值来传递,但是该值是一个拷贝,其被传递到方法,其参考的.这意味着您可以更改引用对象的常规状态(即属性/字段),但如果您尝试更改对您的引用点的影响,则只会影响副本.
例如,给定这种方法......
private void Foo( MyClass obj )
{
obj = new MyClass( );
obj.SomeProperty = true;
}
Run Code Online (Sandbox Code Playgroud)
我们可以传入参数,然后查看它是否受到影响:
MyClass test = new MyClass( );
test.SomeProperty = false;
Foo( test );
Console.WriteLine( test.SomeProperty ); // prints "False"
Run Code Online (Sandbox Code Playgroud)
现在,如果我们使用'ref'关键字定义了方法...
private void Foo( ref MyClass obj )
{
obj = new MyClass( );
obj.SomeProperty = true;
}
Run Code Online (Sandbox Code Playgroud)
输出将为"True",因为实际引用已传递给方法,而不是副本.我们更改了该参考指向函数内部的内容,并且我们看到了这些更改的效果.
当您省略'ref'关键字时,您只是在堆上创建一个指向对象的新指针.如果更改一个指针,则不会更改另一个指针.
...
那么,回答你的问题; 不,您不需要使用'ref'关键字来更改单个Cache对象传递给方法时的状态.