2017-08-10 158 views
-3

我开始阅读关于参考和值类型的更多信息。我有这种情况的一个问题:引用或值类型?

int[] array = { 1, 3, 5, 7, 9 }; 

var result = from element in array 
      let v = element * 100 
      where v >= 500 
      select v; 

foreach (var element in result) 
    Console.WriteLine(element); 

如何大家知道数组是引用类型,而是让我什么是中断?当我拆分数组中的值类型的部分。这些是什么?

+2

这个问题有点不清楚。 'v'是一个'int',当然也是一个值类型。什么让你困惑?你能举个例子说明你期望什么样的行为或类似的行为吗?你一定知道你的查询不会改变你的数组或其中的元素。 –

+1

这是不是很清楚你问什么。元素类型是“int”,它仍然是一个值类型。 –

+0

然而,实际的* list *是一个引用类型,其元素是值类型的实例。 – HimBromBeere

回答

1

是的,arrays总是reference types。然而,array只是一个项目的集合。收集的物品不会因为它们在集合中而改变其类型。 int几乎总是int,因此是value type,无论它是否intarray或不。

如果你改变你的代码

Console.WriteLine(element.GetType()); 

你会看到,它会输出

System.Int32 

在你的结果每个元素。

+2

“一个'int'将永远是一个'int' ...”你在这里忘记拳击。有时一个int被封装在一个对象中。 –

+1

@DavidArno真的,我的答案非常简单,我会将其改为“几乎总是”。 ;) – waka

+3

@DavidArno是真的,但在这种特殊情况下,这又是如何相关的? –

2

如果我正确理解了你,你会问当你操纵值类型时会发生什么,如int

从技术上讲,你不能操纵数值类型。相反,每次执行操作时都会创建一个新值。

所以在你的例子中v仍然是一个值类型。但是,您可以强制编译器拳击/把一个值类型为引用类型,反之亦然拆箱它:

Object obj = (object) 10; 
int i = (int) obj; 

了解更多关于这个话题here