我剛開始使用 OOP 并試圖理解下面的代碼。為什么 book2 物件會改變它的值,即使我沒有將它定義為其他東西,只是使用該物件來定義書籍陣列中物件的值。
Book[] books = new Book[5];
Book book2 = new Book("test", "test1", 800);
for (int i = 0; i < books.Length; i )
{
books[i] = book2;
Console.WriteLine(books[i].pages);
books[i].pages = 10;
}
關于物件,我是否遺漏了一些基本的東西?在我看來,這段代碼應該回傳 800,5 次。
公正和解釋我的想法是如何有缺陷的
uj5u.com熱心網友回復:
您正在為陣列中的所有位置分配相同的物件參考。所以你正在做的 Page = 10 總是在同一個物件上完成。
這就是為什么您會看到 800、810、820 等。
uj5u.com熱心網友回復:
在 C# 中,就記憶體表示而言,有兩種型別的物件,分別是“值型別”和“參考型別”。
值型別通過實體保存它們的值,并且這種型別是大多數簡單型別(整數數字型別、浮點數字型別、bool和char)的基礎
參考型別是(簡化的)“其他任何東西”。準確地說,使用以下任何關鍵字定義:類、介面、委托、記錄、動態。內置型別object、dynamic和string也是參考型別。
這種差異的原因可以用性能來概括。雖然存盤數字的資料位非常有效,但對于復雜物件,使用參考代替,可以將其視為用于存盤主要資料的“記憶體暫存器的編號”。這個“注冊號”可以非常有效地處理。
正如您所定義class Book {...}的,您創建了一個參考型別變數。您的 for 回圈正在為每個 books[] 項分配“值”book2,它們都被初始化為指向同一塊記憶體。因此,修改這些實體之一將依次修改修改所有這些實體。
如果你需要獨立的實體,那么你已經分配了一個包含 new 關鍵字的值,就像前面顯示的 fabian 一樣。最終你會發現擁有一個“復制建構式”會非常方便(比如在 中var anotherBook = new Book(existingBook);)
uj5u.com熱心網友回復:
對于那本書是參考型別,并且所參考的書籍 [i] 與書籍 2 的值存盤在堆上是相同的,例如書籍 [i]--> 物件(在堆上)和書籍--> 物件(在堆上)的值是同樣。這就是為什么值分別輸出為 800,810,820,830,840
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/532985.html
標籤:C#哎呀
上一篇:如何從另一個班級帶來一個陣列?
下一篇:在C#中保存與不保存物件實體化
