C#函数的返回类型

问题描述:

GetNode返回什么,副本或对真实值的引用?C#函数的返回类型

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

换句话说,这段代码是否会改变真实值,或者它会改变从GetNode返回的副本?

GetNode(someIndex).ExtraInfo = something; 

感谢

根据地方GraphNode是一个类或结构。如果是上课,你会改变“真实”价值。结构是相反的。

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

您可以在其中设置值,就像您在示例中那样,它会更改原始值。 虽然没有包装,但设置实际的类本身不能完成。

它将返回一个引用(如果GraphNode是一个类)到一个GraphNode对象,所以原始对象将被更改。

+3

你确定'GraphNode'是'class'吗? – svick

这取决于您的定义GraphNode

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

或者如果它是结构(值类型),那么你会得到一个新的实例。

换句话说,这段代码是否会改变实际值,或者它会改变从GetNode返回的副本 ?

GetNode(someIndex).ExtraInfo = something; 

如果GetNode()返回struct /值类型,你会真正得到在C#编译错误:

不能修改的返回值 'GetNode(someIndex)',因为它是 不一个变量

这正是因为编译器试图保护你免于更改复制价值无处可去。你的例子只有在GetNode()返回一个引用类型时才有意义。

获得的例子就是编译值类型的唯一方法是通过从属性赋值分离的返回值检索:作为其他海报提到它不依赖于是否

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

在这种情况下, GetNode()返回一个引用类型或值类型。对于引用类型,您正在更改GetNode()返回引用的原始类实例,对于正在修改新的复制实例的值类型。