在处理自定义对象时,我注意到了C#中的一些奇怪之处。我相信这只是我理解不足,也许有人可以启发我。
如果我创建一个自定义对象,然后将该对象分配给另一个对象的属性,并且第二个对象修改了分配给它的对象,则即使没有返回任何内容,这些更改也会反映在执行分配操作的同一类中。
需要英文示例?以下是一个例子:
class MyProgram
{
static void Main()
{
var myList = new List<string>();
myList.Add("I was added from MyProgram.Main().");
var myObject = new SomeObject();
myObject.MyList = myList;
myObject.DoSomething();
foreach (string s in myList)
Console.WriteLine(s); // This displays both strings.
}
}
public class SomeObject
{
public List<string> MyList { get; set; }
public void DoSomething()
{
this.MyList.Add("I was added from SomeObject.DoSomething()");
}
}
在上面的示例中,我本以为由于
SomeObject.DoSomething()
返回void,因此此程序将仅显示"I was added from MyProgram.Main()."
。然而,实际上List<string>
包含了该行和"I was added from SomeObject.DoSomething()"
。以下是另一个示例。在这个示例中,字符串保持不变。有何区别,我漏掉了什么?
class MyProgram
{
static void Main()
{
var myString = "I was set in MyProgram.Main()";
var myObject = new SomeObject();
myObject.MyString = myString;
myObject.DoSomething();
Console.WriteLine(myString); // Displays original string.
}
}
public class SomeObject
{
public string MyString { get; set; }
public void DoSomething()
{
this.MyString = "I was set in SomeObject.DoSomething().";
}
}
这个程序示例最终显示"我在MyProgram.Main()中设置"
。在看到第一个示例的结果后,我本以为第二个程序会用"我在SomeObject.DoSomething()中设置"
覆盖原有字符串。我认为我肯定是有什么误解。
DoSomething()
做了this.MyList = new List<string> { "Added from SomeObject" };
,那么我将创建一个新对象,而Main()
没有引用它。 - ChevmyList
和myObject.MyList
并不是指向List<string>
的不同实例。 - jasonthis.MyString += "I was updated in SomeObject.DoSomething().";
,那么你就需要解释新的字符串是通过"拼接"创建的,而第一个字符串并没有被更新。 - tsimbalar