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