通过参考?

the*_*rrs 10 .net c#

关于路过参考,我仍然很困惑.

如果我有一个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在调用方法中重新分配(即通过调用)引用指向的位置的情况下非常有用.


Ed *_* S. 7

当您需要修改引用指向的内容时,请使用'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对象传递给方法时的状态.