如果在.NET中創建類,它將是引用類型。在這個例子中,我在SomeMethod中設置了MyClass的名字。現在在Main方法中,我不需要從SomeMethod中分配返回值,因爲傳入的參數是引用類型。我想在主要方法中的實例具有新的更新名稱「約翰」,它的確如此。將返回值分配給.NET中的引用類型
爲了便於閱讀,我經常爲受讓人返回返回值,即使這不是必要的,以便將更新後的屬性重新分配給main中的原始實例。我的假設是編譯器足夠聰明,不會在Main方法內重新創建MyClass的新引用。真的嗎?或者編譯器實際上是否創建了一個新的引用,並在爲自己分配返回值時指向更新後的值?
//My class will be a reference type
public class MyClass
{
public int ID { get; set; }
public string name { get; set; }
}
public class Main
{
//Main method of application
public void Main()
{
MyClass myClass = new MyClass();
//return value back to itself
myClass = SomeMethod(myClass);
}
public MyClass SomeMethod(MyClass myClass)
{
myClass.name = "John";
return myClass;
}
}
這裏是IL
instance void Main1() cil managed
{
// Method begins at RVA 0x207c
// Code size 15 (0xf)
.maxstack 2
.locals init (
[0] class Test.MyClass myClass
)
IL_0000: newobj instance void Test.MyClass::.ctor()
IL_0005: stloc.0
IL_0006: ldarg.0
IL_0007: ldloc.0
IL_0008: call instance class Test.MyClass Test.Main::SomeMethod(class Test.MyClass)
IL_000d: stloc.0
IL_000e: ret
} // end of method Main::Main1
你確定它變成了「this.SomeMethod」嗎?考慮到Main是一種靜態方法?雖然我注意到你省略了「靜態」關鍵字(在這種情況下,你的答案可能是正確的)。 –
你是對的,我創建了主類。但編譯器使用靜態方法(沒有「this」)做同樣的事情。而OP也沒有靜態方法 –
是的,看起來你是正確的。我在原帖中添加了IL。 – Thomas