黑马程序员-我的摘录-值类型和引用类型的再次了解
来源:互联网 发布:生产型进销存软件 编辑:程序博客网 时间:2024/05/29 14:25
C# 值类型和引用类型及参数传递
值类型和引用类型:
C#数据类型分为两大类:值类型和引用类型。
值类型数据主要有:结构体struct,枚举体enum,布尔型bool,浮点型,整型。
引用类型数据主要有:数组,字符串,接口,委托,类。
值类型和引用类型的区别:
引用类型继承自System.Object,值类型继承自System.ValueType。
引用类型保存到内存的堆heap中,值类型保存在内存的堆栈stack中。在.net中,栈的内存是自动释放的,而堆会有垃圾回收器GC来释放。
引用类型可以派生出新的类型,而值类型不可以。引用类型可以包含null值,而值类型不可以。
引用类型变量赋值只复制对象的引用,不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
下面一个小例子可以简单说明值类型和引用类型:
class PointR { public int x, y; } struct PointV { public int a, b; } class Program { static void Main(string[] args) { //给一个引用类型赋值将复制到一个对象的引用,而给一个值类型赋值将复制一个对象的值 PointR r; PointV v; r = new PointR(); v = new PointV(); r.x = 7; v.a = 7; PointR pr = r; PointV pv = v; pr.x = 9; pv.a = 9; Console.WriteLine(r.x);//9 Console.WriteLine(v.a);//7 Console.Read(); } }
C#参数传递:
.net默认的是通过值传送变量,但是也可以迫使值参数通过引用传送给方法。C#要求对传递给方法的参数进行初始化。在传递给方法之前,无论时按值传递,还是按引用传递,变量都必须初始化。 ref关键字:可以迫使值参数通过引用传送给方法。即:在.net中,如果把一个参数传递给方法,且这个方法的输入参数前带有ref关键字,则该方法对变量所做的任何改变都会影响原来对象的值。下面一个小例子说明按值传递和ref参数传递:
class Program { //默认值,C#的参数是按值传递的,这也是最常见的情况 static void Method1(int p) { ++p; } //为了按引用传递,C#提供了参数修饰字ref,。ref修饰字要求变量在传递给方法之前必须赋值 static void Method2(ref int p) { ++p; } static void Main(string[] args) { int x = 9; int y = 9; Method1(x); Method2(ref y); Console.WriteLine(x);//9 Console.WriteLine(y);//10 Console.Read(); } }
在方法的输入参数前面加上out关键字时,传递给该方法的变量可以不初始化。该变量通过引用传递,所以在从被调用的方法中返回时,方法对该变量进行的任何改变都会保留下来。在调用该方法时,还需要使用out关键字,这与在定义该方法时一样。并且out修饰字要求变量在从方法返回时必须赋值。举例说明:
class Program { //out修饰字要求变量在从方法返回时必须赋值 static void Split(string name, out string firstName, out string lastName) { int i = name.LastIndexOf(' '); firstName = name.Substring(0, i); lastName = name.Substring(i + 1); } static void Main(string[] args) { string a, b; Split("zhou enlai", out a, out b); Console.WriteLine("{0}+ {1}", a, b);//zhou+ erlai Console.Read(); } }
还有一个params修饰传递参数,不多说,直接举例:
class Program { //params 修饰字可以使用在方法的最后一个参数上,这样方法就可以接受任意数目的某种类型的参数 static int Add(params int[] arr) { int sum = 0; foreach (int i in arr) { sum += i; } return sum; } static void Main(string[] args) { int i = Add(1, 1, 2, 3, 4, 5, 6); Console.WriteLine(i);//22 Console.Read(); } }
新手上路,不喜勿喷,谨供新手参考学习。
- 黑马程序员-我的摘录-值类型和引用类型的再次了解
- 黑马程序员-我的摘录-C#值类型与引用类型
- 黑马程序员---值类型和引用类型
- 黑马程序员:值类型和引用类型
- 黑马程序员_总结跳转语句、枚举类型、结构体类型、类以及值类型和引用类型的区别
- 黑马程序员-值类型和引用类型、文件的操作笔记
- 黑马程序员------.Net基础之值类型和引用类型
- 黑马程序员--值类型和引用类型 (05)
- 黑马程序员-引用类型和值类型复习
- 黑马程序员_值类型和引用类型
- 【黑马程序员】C#笔记之值类型和引用类型
- 我真的了解基本数据类型和引用类型的自动拆装箱吗?
- 值类型和引用类型的区别
- 值类型和引用类型的区别
- 值类型和引用类型的区别
- 值类型和引用类型的区别
- 值类型和引用类型的不同
- 值类型和引用类型的区别
- 《UNIX环境高级编程》笔记--打开流
- 计算机的性能指标
- 出口程序的查找和开发(CMOD和SMOD)
- python使用CSV实现电话本
- Android之复选按钮、单选按钮、开关按钮
- 黑马程序员-我的摘录-值类型和引用类型的再次了解
- query的查看和寻找
- oracle中表与序列的关联
- 笔试题7-数据库(ORACLE)
- Structed Exception Handler 学习总结(三)
- GridView控件中添加CheckBox控件,并且实现选择、全选和反选
- 2014找工作阶段性总结
- 关于 Java 中 finally 语句块的深度辨析
- HNU 12727 Carpenters' Language (水)