一、分类

C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。

C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。

二。参数传递

  对于引用类型,不管是将其作为值参数传递还是引用参数传递,都可以在方法成员内部修改其内容。而值类型则不能修改。首先举一个简单的例子

(1)引用类型和值类型作为参数传递的区别:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 引用类型问题
{
class Program
{
static void test1(ref int val1,int val2)
{
val1 = ;
val2 = ;
Console.WriteLine("val1={0},val2={1}", val1, val2);
} static void Main(string[] args)
{
myclass mc = new myclass();
test1(ref mc.val1, mc.val2);
Console.WriteLine("函数调用后:val1={0},val2={1}", mc.val1, mc.val2);
Console.ReadKey();
}
} class myclass
{
public int val1 = ;
public int val2 = ;
}
}

输出结果是:  val1=10,val2=20
        函数调用后:val1=10,val2=0

  

  引用类型中,如果在方法内创建新对象并赋值给形参会产生什么结果呢?

(1)引用类型作为值参数传递时,如果在方法内创建对象并赋值给形参,将切断形参与实参之间的联系,并在方法调用结束后,新对象也不复存在

class myclass
{
public int val1 = ;
} class Program
{
static void test1(myclass f1)
{
f1.val1 = ;
Console.WriteLine("创建新对象前:val1={0}", f1.val1);
f1 = new myclass();
Console.WriteLine("创建新对象后:val1={0}", f1.val1); } static void Main(string[] args)
{
myclass mc = new myclass();
Console.WriteLine("函数调用...");
test1(mc);
Console.WriteLine("函数调用后:val1={0}", mc.val1);
Console.ReadKey();
}
}

输出结果为:  函数调用...
        创建新对象前:val1=60
        创建新对象后:val1=10
        函数调用后:val1=60

值得注意的是,函数调用结束后并没有改变val1的值,因为在方法调用结束后新对象已经不存在了。

(2)引用类型对象作为引用参数传递时,如果在方法内创建对象并赋值给形参,在方法结束后该对象依然存在,并且是实参所引用的值

class myclass
{
public int val1 = ;
} class Program
{
static void test1(ref myclass f1)
{
f1.val1 = ;
Console.WriteLine("创建新对象前:val1={0}", f1.val1);
f1 = new myclass();
Console.WriteLine("创建新对象后:val1={0}", f1.val1); } static void Main(string[] args)
{
myclass mc = new myclass();
Console.WriteLine("函数调用...");
test1(ref mc);
Console.WriteLine("函数调用后:val1={0}", mc.val1);
Console.ReadKey();
}
}

这段代码和上面几乎没区别,只是在引用参数调用的时候添加了ref关键字,但结果却不一样

输出结果为:  函数调用...
        创建新对象前:val1=60
        创建新对象后:val1=10
        函数调用后:val1=10

函数调用后val1的值也变成了10.

最新文章

  1. LEETCODE —— Binary Tree的3 题 —— 3种非Recursive遍历
  2. phpweb /version.php Vul
  3. 挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(二)
  4. 支持Android iOS,firefox(其它未测)的图片上传客户端预览、缩放、裁切。
  5. C#:控制WinForm界面的显示
  6. Swift语言学习之OC和Swift混编
  7. VC++ 网络编程总结(二)
  8. Tiny6410 交叉编译helloworld程序
  9. 在线编辑器kindEditor
  10. Powershell错误处理,try catch finally
  11. Advanced Replication同步复制实验(基于Trigger&基于Materialized View)
  12. Machine Learning - XI. Machine Learning System Design机器学习系统的设计(Week 6)
  13. C++迭代器 iterator【转】
  14. h5之scrollIntoView控制页面元素滚动
  15. 浅谈JavaScript和DOM中的类数组对象
  16. The `XXXX` target overrides the `HEADER_SEARCH_PATHS` build setting defined in `Pods/Target Support Files/Pods-game-desktop/Pods-game-desktop.release.xcconfig'. This can lead to prob
  17. Angular20 nginx安装,angular项目部署
  18. 内连接、左外连接、右外连接、全外连接、交叉连接(CROSS JOIN)-----小知识解决大数据攻略
  19. centos7 + python 2.7 + pip + openvswitch 杂项问题
  20. 安装 mongo 4.0

热门文章

  1. c3p0----获取不到链接
  2. 设计模式之组合模式(Composite Pattern)
  3. 用注册表禁止windows添加新用户
  4. webapi 用腾讯云手机短信验证码
  5. go语言最快最好运用最广的web框架比较(大多数人不了解的特性)
  6. WPF添加样式字典Style
  7. pageadmin CMS网站制作教程:模板中的站点数据调用
  8. cpu缓存java性能问题初探
  9. fluentd 推送 mariadb audit log
  10. easyUI取消选中的所有行