以下行为的C#语言规范是什么。保留属性的值,但新实例(null或新对象)不会更新为实际参数。除了更改它所指向的对象外,它基本上都是作为ref的函数。
main函数中的对象保持不变(非null)但字符串属性已更改为“Hello World”
class Program
{
class MyClass
{
public string str;
}
static void MyMethod(MyClass obj)
{
obj.str = "Hello World";
obj = null;
}
static void Main(string[] args)
{
MyClass o = new MyClass();
o.str = "Hello";
Console.WriteLine(o.str);
MyMethod(o);
Console.WriteLine(o.str); // prints "Hello World"
}
}
答案 0 :(得分:4)
在.NET语言中,对象引用按值传递。
那是什么意思?从概念上讲,您的代码与此相同,指针是明确的:
static void MyMethod(MyClass *obj)
{
obj->str = "Hello World";
obj = NULL;
}
static void Main(string[] args)
{
MyClass *o = new MyClass();
o->str = "Hello";
Console.WriteLine(o->str);
MyMethod(o);
Console.WriteLine(o->str); // prints "Hello World"
}
传递给MyMethod
的参数是指针o
的值,指向MyClass
实例。您可以取消引用指针以设置str
的值,但将实际指针值设置为null不会影响调用方法中的变量。
您可以通过引用传递引用:
以下行为的C#语言规范是什么。保留属性的值,但新实例(null或新对象)不会更新为实际参数。除了更改它所指向的对象外,它基本上都是作为ref的函数。
class Program
{
class MyClass
{
public string str;
}
static void MyMethod(ref MyClass obj)
{
obj.str = "Hello World";
obj = null;
}
static void Main(string[] args)
{
MyClass o = new MyClass();
o.str = "Hello";
Console.WriteLine(o.str);
MyMethod(ref o);
Console.WriteLine(o.str); // throws NullReferenceException, o is now null
}
}
答案 1 :(得分:2)
您通过引用传入对象值。这允许您更改对象中属性的值,并且将在调用方法中看到更改。但是,在调用方法中将看不到变量obj
引用的变化。
如果希望在整个过程中更改变量引用,则需要通过引用传递引用。为此,您应该将方法声明更改为:
static void MyMethod(ref MyClass obj){...}
可以找到参考文档here