Distinguish Between Value Types and Reference Types - Effective C#学习笔记(6)
2008-06-18 21:47
399 查看
在C#中,
值类型(Value Type)是指用struct关键字声明的结构体
引用类型(Referecnce Type) 是指用class关键字声明的类
在本质上,我们这里说的
值类型是存储在栈(stack)上的,当执行到大括号结束时,会被自动弹出(Pop)。
引用类型是存储的堆(heep)上的,在栈上存储一个指向它(在堆上)的引用(其实就是指针)。
C++和C#不一样,在C++中,结构体和类除了成员的默认访问级别不同以外,完全相同。都相当与C#中的值类型。C++中的引用类型就是直接声明指针了。
引用类型的效率会比值类型低,这是因为引用类型要先找到它的指针,然后再到堆内存里去找实际的对象。值类型就少了这么一个过程。更重要的是,当引用类型的指针从栈中弹出时,它所指向的对象就跟断线的风筝似的,你再也无法访问到了,这就形成了垃圾(garbage)。需要等待垃圾回收器(GC)来把他们释放掉,这个过程是很耗时的。
在C#中,尽管struct的效率稍高,但是我们大多数情况还是在用class。这是因为struct不支持继承(支持接口实现),不支持多态,而且栈内存是有限的,不适合大量数据存储。在多数情况下,class完全面向对象,更加灵活。
究竟是选用struct还是class?有一个简单的原则,就是少量数据存储用struct,行为用class。
值类型(Value Type)是指用struct关键字声明的结构体
引用类型(Referecnce Type) 是指用class关键字声明的类
在本质上,我们这里说的
值类型是存储在栈(stack)上的,当执行到大括号结束时,会被自动弹出(Pop)。
引用类型是存储的堆(heep)上的,在栈上存储一个指向它(在堆上)的引用(其实就是指针)。
C++和C#不一样,在C++中,结构体和类除了成员的默认访问级别不同以外,完全相同。都相当与C#中的值类型。C++中的引用类型就是直接声明指针了。
引用类型的效率会比值类型低,这是因为引用类型要先找到它的指针,然后再到堆内存里去找实际的对象。值类型就少了这么一个过程。更重要的是,当引用类型的指针从栈中弹出时,它所指向的对象就跟断线的风筝似的,你再也无法访问到了,这就形成了垃圾(garbage)。需要等待垃圾回收器(GC)来把他们释放掉,这个过程是很耗时的。
在C#中,尽管struct的效率稍高,但是我们大多数情况还是在用class。这是因为struct不支持继承(支持接口实现),不支持多态,而且栈内存是有限的,不适合大量数据存储。在多数情况下,class完全面向对象,更加灵活。
究竟是选用struct还是class?有一个简单的原则,就是少量数据存储用struct,行为用class。
相关文章推荐
- Effective C# Item 6: Distinguish Between Value Types and Reference Types
- Item 18: Distinguish Between Value Types and Reference Types(Effective C#)
- Item 6: Distinguish Between Value Types and Reference Types
- Effective C#之6:Distinguish Between Value Type and Reference Type
- CLR.via.Csharp.3rd Chapter 5: Primitive, Reference, and Value Types
- Distinguish between pointers and references in C++
- Primitive, Reference, and Value Types(Chapter 5 of CLR via C#)
- Type Fundamentals (.NET: Primitive types, reference types and value types )
- Differenct between return by value and by reference
- Differenct between return by value and by reference
- CLR via C# 总结之Chap5 Primitive, Reference, and Value Types
- CLR Via C# 3rd 阅读摘要 -- Chapter 5 - Primitive, Reference, and Value Types
- Datatypes translation between Oracle and SQL Server
- notice: javascript's by value and by reference
- Value object and Reference object
- what the difference between __weak and __block reference?
- The Difference Between “Add Web Reference” and “Add Service Reference”
- ORACLE查询表最近更改的数据 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
- CLR 是怎样去处理Boxing and Unboxing Value Types?
- Reference Types and Values Types