Silverlight傳遞Managed Type到Javascript端時,跟.NET中的原則相仿,Value Type是使用By Value方式,而Reference Type則是By Reference。
[ScriptableType]
public class RefTypeSample
{
public string Name { get; set; }
}
private RefTypeSample _rt = new RefTypeSample()
{
Name = "RefType"
};
[ScriptableMember]
public RefTypeSample ByRefTest1()
{
return _rt;
}
[ScriptableMember]
public void ByRefTest2()
{
MessageBox.Show(_rt.Name);
}
[ScriptableType]
public struct ValueTypeSample
{
public string Name { get; set; }
}
private ValueTypeSample _vt = new ValueTypeSample()
{
Name = "ValueType"
};
[ScriptableMember]
public ValueTypeSample ByValTest1()
{
return _vt;
}
[ScriptableMember]
public void ByValTest2()
{
MessageBox.Show(_vt.Name);
}
在以上的程式中,我們宣告了class RefTypeSample及struct ValueTypeSample。在.NET裡,雖然都只有一個Name屬性,二者最主要的差別在於RefTypeSample類別(class)是Reference Type,而ValueTypeSample結構(struc)是Value Type。[參考: Value Types and Reference Types]。而我們在Silverlight端分別建立了RefTypeSample及ValueTypeSample的實體,將其傳回至Javascript端,並各提供另一個參數用來檢查實體的Name屬性是否被改變。
var slCtl = sender.getHost();
var jssk = slCtl.Content.JavascriptSidekick;
var rt = jssk.ByRefTest1();
alert(rt.Name);
rt.Name = "ModifiedByJs";
jssk.ByRefTest2();
var vt = jssk.ByValTest1();
alert(vt.Name);
vt.Name = "ModifiedByJs";
jssk.ByValTest2();
在這個測試中,ByRefTest2()會彈出"ModifiedByJs",證明Silverlight端的物件屬性也被修改了,而ByValTest2()則還是"ValueType",證明RefTypeSample是By Reference傳遞,而ValueTypeSample是By Value傳遞,報告完畢!