首页 > 试题广场 >

下列说法错误的是?

[单选题]
下列说法错误的是?
  • struct声明的类型是值类型
  • 值类型是在堆上分配的
  • 值类型不会被垃圾回收
  • 值类型不需要指针来引用
  • 引用类型在堆上分配,值类型在栈上分配
值类型与引用类型区别:

值类型

引用类型

存储方式

直接存储数据本身

存储的是数据的引用,数据存储在数据堆中

内存分配

分配在栈中的

分配在堆中

效率

效率高,不需要地址转换

效率较低,需要进行地址转换

内存回收

使用完后立即回收

使用完后不立即回收,而是交给GC处理回收

赋值操作

创建一个新对象

创建一个引用

类型扩展

不易扩展,所有值类型都是密封(seal)的,所以无法派生出新的值类型

具有多态的特性方便扩展

实例分配

通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中

总是在进程堆中分配(动态分配)


编辑于 2017-09-10 10:31:34 回复(5)
发表于 2020-08-22 17:33:22 回复(4)
1、值类型和引用类型的主要区别在于:
1)范围方面
C#的值类型包括:结构体(数值类型、bool型、用户定义的结构体),枚举,可空类型。
C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。


2)内存分配方面:

数组的元素不管是引用类型还是值类型,都存储在托管堆上。

引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。简称引用类型部署在托管推上。而值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实 例)存储;作为局部变量时,存储在栈上。(栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放)

3)适用场合

值类型在内存管理方面具有更好的效率,并且不支持多态,适合用做存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。

  • 引用类型可以派生出新的类型,而值类型不能,因为所有的值类型都是密封(seal)的;
  • 引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型,如   int? a = null;  );
  • 引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。

2、回到本题,得到结论:1. struct声明的是值类型;2. 值类型在栈上分配,引用类型在堆上分配;3. 值类型不需要指针来引用。
    另外再补充一点,垃圾回收不会回收值类型,只会在引用类型上动手,回收无效空间。

3、所以,本题只有B是错的。
编辑于 2017-08-20 15:07:53 回复(3)
这是什么语言,c++好像没有这个类型
发表于 2018-08-23 20:25:51 回复(6)
加个 C# 筛选一下啊。。。C++ 里面压根没值类型这个概念
发表于 2021-08-28 11:11:36 回复(0)
选B
因为值类型在栈中分配。
发表于 2020-07-20 10:51:24 回复(0)
按Java来说,引用类型是放在栈里面的吧,对象才是在堆里
发表于 2020-05-20 12:58:54 回复(0)
这题要区分语言吧
发表于 2019-03-03 23:45:22 回复(0)
以java我感觉后面几个选项都不严谨
发表于 2018-01-22 18:22:43 回复(0)
Java表示直接看懵
发表于 2022-08-26 19:23:15 回复(0)
我都没学过这个,受教了
发表于 2022-03-16 21:30:19 回复(0)
B:值类型在栈中分配
C:值类型用完即弹出,不会被GC回收
D:值类型不需要指针引用,赋值即创建新的值
编辑于 2018-09-17 15:43:00 回复(0)
没有说什么语言,c++和c#的struct不一样。c++里,除了默认访问和继承权限都是public,其他的都跟class一样。而c#里面struct是值类型。
发表于 2018-08-30 21:17:50 回复(0)
值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。引用类型的对象总是在进程堆中分配(动态分配)。
发表于 2018-04-04 17:19:48 回复(0)
D项怎么理解呢,什么叫需要与不需要。
发表于 2017-08-19 16:34:03 回复(1)