该值按值传递给Add
方法;然而,如果你传递一个引用类型(一个类总是一个引用类型),那么这个值本身就是一个引用。所以问题不在于值是通过值还是通过引用传递,但是如果类型是值类型或引用类型。
class MyClass
{
public int Number { get; set; }
}
有了这个声明,我们得到:
MyClass m = new MyClass();
List<MyClass> myList = new List<MyClass>();
myList.Add(m);
myList[0].Number += 1;
Console.WriteLine(myList[0].Number); // Displays 1
Console.WriteLine(m.Number); // Displays 1
myList[0].Number += 1;
Console.WriteLine(myList[0].Number); // Displays 2
Console.WriteLine(m.Number); // Displays 2
请注意,这不会有struct
工作,因为myList[0]
返回的值将被存储在列表中的值的副本。 += 1
只会增加此临时副本的Number
属性,因此除了占用几个处理器周期之外没有其他影响。因此,仅创建不可变结构是一个很好的建议。
如果你想直接显示对象,覆盖ToString
class MyClass
{
public int Number { get; set; }
public override string ToString()
{
return Number.ToString();
}
}
现在,你可以写
myList[0].Number += 1;
Console.WriteLine(myList[0]);
Console.WriteLine(m);
你甚至可以让myList[0] += 1
工作与运算符重载。在MyClass
声明
public static MyClass operator +(MyClass m, int i)
{
m.Number += i;
return m;
}
但这是有点不可思议,除非你的类代表一个数字,但在这种情况下,一个不变的struct
将是首选,因为数字通常被认为是不可变的值类型。
public static MyStruct operator +(MyStruct m, int i)
{
return new MyStruct(m.Number + i);
}
“结果会是” - 不是很难尝试自己!它是由引用btw ... –
除了你从来没有说过,你的'myClass'是 - 一个参考或值类型 – horgh
我假设它是一个参考类型在这里 –