引用类型和值类型的学习笔记
2010-08-12 10:18
225 查看
1.大多数的数据类型都是值类型,值类型是存放在堆栈上的,堆栈是基于先进后出,向下填充即从高内存地址向低内存地址填充,堆栈有非常高的性能,但对于有些类型来说,使用起来还不是很灵活,因为有些类型需要在内存中存放很长时间
2.string属于引用类型(有待考证,说法不一),但是不可以被继承,因为他是抽象类,一般需要new的方法都是引用类型,引用类型需要使用托管堆,托管堆与C++使用的堆是不同的,它在垃圾收集器的控制下工作,与传统的堆相比有很显著的性能优势,引用类型的的存储方式是在堆栈上存放地址,在堆中存放实际的对象,与堆栈不同,堆上的内存是向上分配的,所以自由空间在上面
从上面可以看出,建立引用变量比建立值变量要复杂得多,且不能避免性能的降低,在一个引用变量的值赋予另一个相同类型的变量时,有两个引用内存中同一个对象的变量,删除其中一个引用变量时,只会删除堆栈上的地址,不会删除堆中的对象,只到程序停止或垃圾回收器回收
3.关于string是否是引用类型的一个例子
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ConsoleApplication4
{
/*基于string引用类型及类的考量*/
class Program
{
static void Main(string[] args)
{
/*更新字符串的值*/
string st = "原始字符串";
string s = st;
s = "更新字符串";
Console.Write(s + "\r\n");
Console.Write(st+"\r\n");
/*更新类中属性的值*/
pr pt = new pr();
pr t = pt;
t.y = 10;
Console.Write(t.y+"\r\n");
Console.Write(pt.y);
Console.ReadLine();
}
}
/*类*/
class pr
{
public int y = 0;
}
}
输出结果:
我们由这个结果及代码分析可以看出,在两个实例化对象指向同一个堆时,改变其中一个值的话,另一个对象的值也会改变,但string类型中,改变其中一个的值,另一个并不会发生改变,从这点看来string是属于值类型的,这是因为string属于引用类型,但在操作上是属于值类型的
2.string属于引用类型(有待考证,说法不一),但是不可以被继承,因为他是抽象类,一般需要new的方法都是引用类型,引用类型需要使用托管堆,托管堆与C++使用的堆是不同的,它在垃圾收集器的控制下工作,与传统的堆相比有很显著的性能优势,引用类型的的存储方式是在堆栈上存放地址,在堆中存放实际的对象,与堆栈不同,堆上的内存是向上分配的,所以自由空间在上面
从上面可以看出,建立引用变量比建立值变量要复杂得多,且不能避免性能的降低,在一个引用变量的值赋予另一个相同类型的变量时,有两个引用内存中同一个对象的变量,删除其中一个引用变量时,只会删除堆栈上的地址,不会删除堆中的对象,只到程序停止或垃圾回收器回收
3.关于string是否是引用类型的一个例子
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ConsoleApplication4
{
/*基于string引用类型及类的考量*/
class Program
{
static void Main(string[] args)
{
/*更新字符串的值*/
string st = "原始字符串";
string s = st;
s = "更新字符串";
Console.Write(s + "\r\n");
Console.Write(st+"\r\n");
/*更新类中属性的值*/
pr pt = new pr();
pr t = pt;
t.y = 10;
Console.Write(t.y+"\r\n");
Console.Write(pt.y);
Console.ReadLine();
}
}
/*类*/
class pr
{
public int y = 0;
}
}
输出结果:
我们由这个结果及代码分析可以看出,在两个实例化对象指向同一个堆时,改变其中一个值的话,另一个对象的值也会改变,但string类型中,改变其中一个的值,另一个并不会发生改变,从这点看来string是属于值类型的,这是因为string属于引用类型,但在操作上是属于值类型的
相关文章推荐
- (原创)c#学习笔记08--面向对象编程简介02--OOP技术07--引用类型和值类型
- javascript学习笔记 - 引用类型 RegExp
- <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型
- C#学习笔记 2 初识引用类型
- [学习笔记]Asp.net(C#)菜鸟进级系列之引用类型
- CLR笔记:5.基元,引用和值类型
- C#学习笔记: 值类型和引用类型
- java基础学习笔记第三天 this . static 的用法和值传递,引用传递
- css学习笔记20160130导航栏下拉菜单图像拼合媒体类型属性和值选择器
- javascript学习笔记 - 引用类型 Function
- 《JS高程》引用类型学习笔记
- JavaScript高级程序设计学习笔记--引用类型
- Javascript学习笔记05——引用类型
- javascript学习笔记 - 引用类型 基本包装类型
- C++ Primer学习笔记5 变量和基本类型(const限定符、引用、typedef名字、枚举)
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
- Effective C# 学习笔记(十八)区分值类型和引用类型
- [javase学习笔记]-6.6 基本数据类型參数与引用数据类型參数的传递过程
- js学习笔记:引用类型——Array
- 《JavaScript高级程序设计 第三版》学习笔记 (三)引用类型详解