如果在.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