将ViewModel实例发送到另一个ViewModel构造函数

时间:2013-10-20 15:15:26

标签: c#

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上?

3 个答案:

答案 0 :(得分:2)

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

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

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关键字就是规避所述问题的一种方法。

答案 1 :(得分:1)

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

如果你想将非引用类型(例如,基本类型作为int)作为引用传递给参考,那么ref可能是有用的。所以作为指针。

您可以阅读msdn, about ref

  

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

答案 2 :(得分:1)

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