C#返回类型的函数

时间:2011-10-01 15:19:29

标签: c#

GetNode返回什么,副本或对真实值的引用?

public GraphNode GetNode(int idx)
{
    return Nodes[idx];
}

换句话说,此代码会更改实际值还是会更改从GetNode返回的副本?

GetNode(someIndex).ExtraInfo = something;

由于

5 个答案:

答案 0 :(得分:5)

取决于GraphNode是类或结构的位置。如果是课程,你将改变“真正的”价值。结构正好相反。

答案 1 :(得分:3)

这取决于您对 GraphNode 的定义。

如果是(通过引用),它将返回相同的实例;

或者如果它是 struct (值类型),那么您将获得一个新实例。

答案 2 :(得分:1)

  

换句话说,此代码会改变实际值,否则会改变   从GetNode返回的副本?

GetNode(someIndex).ExtraInfo = something;

如果GetNode()返回struct /值类型,您实际上会在C#中收到编译错误:

  

无法修改'GetNode(someIndex)'的返回值,因为它是   不是变量

这正是因为编译器试图保护您不会更改无法复制的复制的值。只有当GetNode()返回引用类型时,您的示例才有意义。

获取示例以编译值类型的唯一方法是将返回值与属性赋值的检索分开:

var node = GetNode(someIndex);
node.ExtraInfo = something;

在这种情况下,正如其他海报所提到的,它取决于GetNode()是返回引用类型还是值类型。对于引用类型,您要更改GetNode()返回引用的原始类实例,对于要修改新的复制实例的值类型。

答案 3 :(得分:0)

类在C#中的工作方式是它们可以作为指针传递。

您可以像在示例中一样设置其中的值,它将更改原始值。 但是,如果没有包装器,就无法设置实际的类。

答案 4 :(得分:0)

它会将一个引用(如果GraphNode是一个类)返回给GraphNode对象,因此原始对象将被更改。