[英]C# creating class instance syntax?
我对编码还很陌生,总是使用“ classname instancename = new classname()”创建实例,但是今天我发现以下代码无法使用,因此无法使用此语法。 我的问题是第五行会发生什么。 非常感谢你。
private void _InsertIntoBinarySearchTree(ref Element<K> p , K key)
{
if (p == null)
{
p = new Element<K>();//what happens here?
p.key = key;
}
else
{
if (p.key.CompareTo(key) > 0)
{
_InsertIntoBinarySearchTree(ref p.left, key);
}
else if (p.key.CompareTo(key) < 0)
{
_InsertIntoBinarySearchTree(ref p.right, key);
}
else
{
throw new Exception("");
}
}
}
p
如果通过方法中的ref
进行操作,则您所做的任何事情都会在方法之外受到影响; 这意味着当您为它分配new
的p
,方法参数p
的调用者也会被重新分配。
您要说明它是参数中的Element<K>
类型,因此p
必须符合该类型。
在有问题的方法行中,您可以通过以下方式将p
重新分配给new Element<K>
p = new Element<K>();//what happens here?
就如何使用它而言,它与p = new Element()
相同,但是由于Element
类型需要通用类型引用(可以是K
或其他任何值),因此您还需要使用相同的方式重新分配它类型K
传递给该方法。 因为我们不确定何时调用K
类型。
您不使用var p =...
或Element<K> p =..
的原因是因为参数中已经将p
声明为该类型。 这是一个ref
参数,因此您可以按照所述重新分配它。
该方法的调用者可能仅作为示例是这样的:
Element<string> p = null;
string k = "someKey";
_InsertIntoBinarySearchTree(ref p, k); //Here p goes into the method as ref; the method performs the null check and sets p as new Element<string>()
希望这可以帮助...
首先,您不能为变量p
使用类型说明符,因为您没有声明新变量p
,而是为现有变量分配了一个值。 也可以看看:
int myVal;
myVal = 5;
其次,好吧,您要分配给变量p
。 因此,它将使用新值(在本例中为new Element<K>()
覆盖之前的任何内容。 从技术上讲,它可以是任何值,但是由于您调用了new
,所以它将创建一个新变量并调用适当的构造函数。 不必担心内存泄漏-C#将跟踪孤立的引用并为您清理它们。
最后,由于p
是作为ref
传递到您的方法的,因此将其赋值将在方法的本地范围内编辑变量p
以及从调用范围传递给您的方法的引用,因此为什么将p
用作在这里输出。
您会注意到第一行的方法签名中p变量的类是Element<K>
。 暂时忽略ref传递的代码,它类似于以下代码。
Element<K> p = new Element<K>();
元素是类型K的泛型类。K是要排序的对象的类型。 之所以通用,是因为您可以选择要排序的元素的类型。 因此,例如,如果您要对汽车进行分类。
Element<Car> c = new Element<Car>();
在通用Element<K>
类的定义内定义了允许哪种类型的逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.