namespace Program
{
class Path
{
private readonly MapLocation[] _path;
public Path(MapLocation[] path)
{
_path = path;
}
}
}
我無法理解_path = path;
如何理解這是如何工作的以及爲什麼需要它?C# - 新增陣列,需要澄清
namespace Program
{
class Path
{
private readonly MapLocation[] _path;
public Path(MapLocation[] path)
{
_path = path;
}
}
}
我無法理解_path = path;
如何理解這是如何工作的以及爲什麼需要它?C# - 新增陣列,需要澄清
class Path
{
private readonly MapLocation[] B;
public Path(MapLocation[] A)
{
B = A;
}
}
基本上要分配陣列由構造傳入到可變_path路徑,在上面的例子中我已重命名他們甲和乙,因此被分配所述陣列maplocations從構造函數到對象變量(B)進行存儲。
Path
是一類。在課堂之外,您可以創建一個或多個Path
類型的對象。
每個Path
對象都有對MapLocation
對象數組的私有引用。這個數組引用被稱爲_path
。
當Path
對象被構造,另一個參考MapLocation
對象數組傳遞到Path()
構造作爲參數調用path
。可能期望的是,被引用的數組已經包含一些MapLocation
對象。
您所問的代碼行的目的是使_path
引用與path
相同的MapLocation數組。因此,創建的Path
的新實例將能夠訪問/使用該數組。
有幾件事情你需要在這裏理解,所以我們一步一個腳印吧。
值類型VS引用類型
值類型:
在C#中,有些事情是按值傳遞而另一些則通過引用傳遞。下面是一些按值傳遞一個例子:
class Path
{
private int _number;
public Path(int number)
{
_number = number;
}
}
這裏是我們如何使用上面的類:
int number = 5;
Path p1 = new Path(number);
變量number
是按值傳遞。這意味着什麼:將存儲在number
中的值的副本傳遞給p1
對象。因此,如果您在Path
類別中更改它的值,我們通過的值number
不會更改。它只會在p1
對象內發生變化。請閱讀更多關於C# value types。
引用類型:
陣列是其通過引用在C#傳遞的事情之一。這是一個例子。稍後我會解釋readonly
:
class Path
{
private readonly MapLocation[] _path;
public Path(MapLocation[] path)
{
_path = path;
}
}
這裏是我們如何使用上面的類:
// 2 is max number of items for this array
MapLocation[] locations = new MapLoations[2];
locations[0] = new MapLocation();
Path p1 = new Path(locations);
變量locations
通過引用傳遞。這意味着:對存儲位置locations
的引用將傳遞給p1
對象。因此,如果您在Path
類中更改了它的值,例如,如果向陣列中添加其他項目,您會注意到locations
中的更改。爲什麼?由於您傳遞了存儲位置locations
的引用,因此無論誰(例如Path
)都有權訪問它,它們可以在該位置更改內容。請閱讀更多關於C# Reference types。因此,我們將locations
的引用傳遞給Path
構造函數,並在構造函數中將其分配給_path
變量。
理解參考類型最簡單的方法就是想象你通過一根連接到內存位置的繩索。任何擁有繩索的人都可以找到通向內存位置的路,並將其更改爲。因此,在我們的示例中,我們創建了一個名爲locations
的變量,然後我們將一條繩索與它結合。我們將繩索的另一端傳遞給構造函數Path
,並在構造函數內將繩索傳遞給_path
變量。現在從課堂內部,您可以使用名爲_path
的繩索並找到存儲位置,直至locations
。這根繩子可以跨越很多種類和方法等等。無論如何足夠用繩子。
那麼什麼是readonly
?這意味着對變量的賦值只能在構造函數中發生,而不能在其他地方發生。所以在你的例子中,_path
只能從它出現的類的構造函數中分配,在這種情況下是Path
。但是你問爲什麼有人想要這樣做?好的,有時候你想創建一個類,給變量賦值,然後你永遠不想讓任何人再次賦值。
希望有所幫助。
參考和價值類型與這個問題有什麼關係? – Enigmativity
我現在開始放棄... –
@ColeConnelly如果答案不夠充分,我建議您重新解釋您的問題。如果你的第一語言不是C#,你應該告訴我們你的第一語言和你對事物應該如何工作的期望/爲什麼這會讓你感到困惑。 – john
這是一個'readonly'字段的構造函數賦值。默認情況下,類有一個無參數的構造函數,你用'MapLocation'數組作爲參數聲明一個構造函數方法,並將其分配給'readonly'字段。它需要在構造函數中賦值'readonly'的值,因爲'readonly'的值只能在其聲明或初始化期間的類構造函數中賦值。 –
這不回答我的問題。 –
@ColeConnelly我會說它的確如此。爲了說明Yamamoto san的說法,只能在類的構造函數中指定只讀字段(_path)。之後,其他方法可以讀取它,但不能寫入。構造函數path的參數只能在構造函數中訪問。您不能在其他地方使用它,因此您需要在類實例級別聲明變量(_path),以便數據可以被類中的其他方法/屬性訪問。 Readonly確保在實例化類後不能更改引用。 – john