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 SharedViewModel
和SharedViewModel
之间是否存在差异?
编辑: 我的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上?
答案 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
个关键字。