0
var sharedViewModel=new SharedViewModel;

var viewModel1 = new ViewModel1(ref sharedViewModel)
var viewModel2 = new ViewModel2(ref sharedViewModel)
var viewModel3 = new ViewModel3(ref sharedViewModel)

如果我这样做会有区别吗

var viewModel1 = new ViewModel1(sharedViewModel)
var viewModel2 = new ViewModel2(sharedViewModel)
var viewModel3 = new ViewModel3(sharedViewModel)

ViewModel1,ViewModel2,ViewModel3将对实例进行更改,在这种情况下和SharedViewModel之间有区别吗?ref SharedViewModelSharedViewModel

编辑:我的 ViewModel1、ViewModel2、ViewModel3 类中的内容示例

private SharedViewModel sharedvm;

Public ViewModel(SharedViewModel sharedViewModel)
 {
sharedvm=sharedViewModel;
sharedvm.Collection.Add(new object());
 }

private doSomthing()
 {
sharedvm.Collection.RemoveAt(0);
 }

现在的问题是,如果我将一个对象添加到我的sharedvm收藏中,这是否意味着我正在向我的sharedViewModel收藏添加一个对象?

如果我调用 doSomthing 方法,这些更改会反映在我的 sharedViewModel 上吗?

4

3 回答 3

2

是的,有区别。的值SharedViewModel可能不同,因为您将对引用(本质上是sharedViewModel变量本身)的引用传递给 ViewModel1 构造函数。

所以如果SharedViewModel在ctor中改变了,那么它将影响调用范围内的变量。通过更改,我的意思是在ViewModel1ctor 中你这样做:

sharedViewModel = new SharedViewModel()

也许,我不够清楚。

如果您使用过 C/C++,可以这样想。

object *a = new object()
object **b = &a
func(b)

但是你仍然有一个高级视图,因为一切都是由编译器完成的。

编辑:第一种情况

public ViewModel(SharedViewModel sharedViewModel)
{

    sharedvm=sharedViewModel;
    sharedvm.Collection.Add(new object());

}

与第二种情况相比

public ViewModel(ref SharedViewModel sharedViewModel)
{
  sharedvm=sharedViewModel;
  sharedvm.Collection.Add(new object());
}

在这种情况下,绝对没有区别。堆中的同一个集合正在被修改。所以调用范围可以看到集合发生了什么。

当您在第一种情况下执行以下操作时会出现差异:

sharedViewModel = new SharedViewModel()

现在您正在修改内存中一个完全不同的对象,并且调用范围看不到应用于该对象集合的更改,因为调用范围引用了一个完全不同的对象。所以通常你永远不会new使用刚刚传入的参数。但是如果由于某种原因你做new了参数,那么ref关键字是一种规避上述问题的方法。

于 2013-10-20T15:19:26.327 回答
1

不,因为 SharedViewModel 的实例是一个引用类型 sa 已经作为引用传递。对我来说,在这种情况下你不应该使用 ref 。

如果您想将非引用类型(例如,作为 int 的原始类型)作为引用传递,那么 Ref 可能很有用,因此作为指针。

正如您在msdn 上所读到的,关于 ref

不要将通过引用传递的概念与引用类型的概念混淆。这两个概念并不相同。方法参数无论是值类型还是引用类型,都可以通过 ref 进行修改。通过引用传递值类型时没有装箱。

于 2013-10-20T15:22:10.090 回答
1

类已经通过引用传递。您根本不需要ref关键字。

于 2013-10-20T15:22:27.143 回答