我在閱讀關於C#中的結構和類,並且我的理解結構是值類型,類是引用類型。但是我對當類對象作爲參數傳遞給方法時的行爲有些困惑。引用類型與值類型
假設我有以下代碼:
public class Program
{
public static void Main(string[] args)
{
var program = new Program();
var person = new Person
{
Firstname = "Bob",
};
Console.WriteLine(person.Firstname);
program.ChangeName(person);
Console.WriteLine(person.Firstname);
program.Kill(person);
Console.WriteLine(person.Firstname);
Console.Read();
}
public void ChangeName(Person p)
{
p.Firstname = "Alice";
}
public void Kill(Person p)
{
p = null;
}
}
當我通過我的Person
類的實例來Program.ChangeName()
和改變person.Firstname
到Alice
值,更改將反映原來的人對象上的實例我的Program.Main()
這是我所期望的,p
參數是對person
的參考。但是,當我嘗試將p
設置爲null
時,看起來沒有變化。爲什麼是這樣?
參數的人員P是一個對象的引用。當你將它清空 - 你只是將參考而不是對象歸零。 – tim
因爲'p'是被調用方法的局部變量。你所做的只是將局部變量的引用改爲null,而不是傳入的person對象。 – itsme86
C#中的所有參數都通過值*傳遞,除非它們特別標記爲'ref'或'out'。在結構體的情況下,結構體的全部內容都是傳遞的值。如果修改它,則更改不會影響原始內容,因爲您修改了副本。在類的情況下,只有對象的引用被傳遞,但*引用*是通過值傳遞的。重新分配參考副本不會影響原稿。但是,您可以操作對象的內容,因爲原始引用和複製的引用指向同一對象。 –