C#面试基础知识点:值类型和引用类型(1)(填坑文)
时间:2019年08月19日
前言
今天去面试,技术主管问我值类型和引用类型有什么区别,面对如此基础的知识只能怪自己没有好好准备以及只顾写代码对一些基础知识其然不知所以然,于是我含含糊糊回答了一番:
- 值类型
- 数据类型 int float double datetime等数据类型为值类型。
- 引用类型
- 类型 String,Array,List,Dictionary ,queue等都是引用类型,我们也可以自己用class定义引用类型。
- 而这些类型最终都继承Object类型。
技术主管:
- 值类型与引用类型都可以用Equals来比较吗?
- 如何将一个数组a的值赋予数组b然后对b做修改而不影响原来的数组?
以上问题也就是技术主管平时遇到的坑吧。上述的我就不献丑了,所以也是含糊其辞直接回答。所以在面试完了以后我专门针对性的上网查了资料,以下是我的总结,若有错误望博友多多指正_。
C#值类型和引用类型
- 类型
- 值类型
- 内置类型:(内置类型表)
- 用户自定义类型:(struct)
- 枚举:(enum)
- 引用类型
- 内置引用类型:(内置引用类型)
- 类(class)
- 委托
- 数组
- 接口类型(interface)
- void
- var
基类(共同点)
C#所有类型均继承System.Object
值类型继承基类(不同点)
值类型->ValueType->Object
应用类型继承
引用类型不会继承ValueType。引用类型可以继承其他类型
技术经理的问题
值类型与引用类型都可以用Equals来比较吗?
在Object中Equal的方法,可以辨别两个对象是否是一个对象的方法。
**注意,上面这句话很关键 必须是一个对象并且值一样**
引用类型以及值类型使用Obejct进行数据比较
public class test1
{
public string name { get; set;}
public int age { get; set; }
}
static void Main(string[] args)
{
test1 ts1 = new test1();
ts1.name = "lele";
ts1.age = 10;
test1 ts2 = new test1();
ts2.name = "lele";
ts2.age = 10;
bool isZLX= ts1.name.Equals(ts2.name);//值类型比较返回 true
bool isYYLX = ts1.Equals(ts2); //引用返回 false
}
通过以上的代码测试得出结论值类型是比较两个对象是否是相同内存地址
如何将一个数组a的值赋予数组b然后对b做修改而不影响原来的数组?
刚开始回答比较简单粗暴上代码:
static void Main(string[] args)
{
int[] a = { 1, 2 };
int[] b = a; \\输出: a={1,2} , b={1,2};
b[0] = 2; \\这时我做了修改 输出: a={2,2} ,b={2,2}
}
总结
以上可以看到不是我期望的那样不影响原数组a 坑!
总结:原来数组为引用类型,直接赋值等于是将每个元素的地址复制
- 如果是引用传递,可以直接将数组变量通过'='赋值
- 如果是值传递的话,那么可以使用 Array.Copy() 方法或者是Buffer.BlockCopy(),也可以通过数组变量.Clone()或者是Copy()方法
static void Main(string[] args)
{
int[] i = { 1, 2 };
int[] b = (int[])i.Clone();\\输出: a={1,2} , b={1,2};
b[0] = 2;\\输出: a={1,2} , b={2,2};
}
符合预期。
总结一些东西:
- 值类型与引用类型最终都继承最终都继承System.Object但值类型中间继承System.ValueType。
2。 对于引用类型以及值类型一定要分清,不然编程过程中容易出bug
更新
20190819 21:46 删除了装箱值类型 (现在还不清楚装箱值类型是怎么写上去的)。
C#面试基础知识点:值类型和引用类型(1)(填坑文)的更多相关文章
- c#1所搭建的核心基础之值类型和引用类型
这个主题很重要,在.NET中做的一切其实都是在和一个值类型或者引用类型打交道. 现实世界中的值和引用 假定你在读一份非常棒的东西,希望一个朋友也去读他.于是你到复印室里复印了一份.这个时候他获得了属于 ...
- 1.C#知识点:值类型和引用类型
一.什么是值类型?什么引用类型? 1.值类型的值是存储在栈上的.引用类型是存在堆上的. 2.值类型变量声明之后,不管是否已经分配内存,编译器在堆上为其分配内存. 3.引用类型声明的时候,这时候只在 ...
- C#基础:值类型、引用类型与ref关键字
在C#中,ref的意思是按引用传递.可以参考C++: int a = 10, b = 20; void swap(int x, int y) { int temp = x; x = y; y = te ...
- .NET基础知识(01)-值类型与引用类型
常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum.int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆 ...
- .NET面试题解析(01)-值类型与引用类型
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还 ...
- c#基础系列1---深入理解值类型和引用类型
"大菜":源于自己刚踏入猿途混沌拾起,自我感觉不是一般的菜,因而得名"大菜",于自身共勉. 不知不觉已经踏入坑已10余年之多,对于c#多多少少有一点自己的认识, ...
- C#基础知识1-深入理解值类型和引用类型
C#值类型和引用类型这个概念在刚学习的时候应该就知道了.但是我们并没有深入的去理解它.越是基础知识其实才是最有用的.对代码的优化,代码质量的提升都有帮助.通过整理本文章,对很多知识也起到了巩固的作用吧 ...
- C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)
前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...
- C#基础--值类型和引用类型
C#中大多数类型都是引用类型,只有个别特殊情况是值类型. 值类型: 枚举(enum) 结构(struct) 基础类型:int, short, char, bool....(string是引用类型) 引 ...
随机推荐
- 用Python程序批量删除excel里面的图片
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Rhinoceros PS:如有需要Python学习资料的小伙伴可以 ...
- liunx简单命令
mysql -h主机地址 -u用户名 -p用户密码 --进入数据库1.显示数据库列表. show databases; 2.显示库中的数据表: use mysql: //打开库 show tables ...
- Docker关于镜像、容器的基本命令
镜像 1.获取镜像 docker pull 服务器:端口/仓库名称:镜像 ➜ ~ docker pull python Using default tag: latest 2.查看镜像信息 列出本机所 ...
- SAP MM 有了采购订单历史的PO行项目里的采购附加费不允许再改了?
SAP MM 有了采购订单历史的PO行项目里的采购附加费不允许再改了? 正确答案是: 不允许,这是SAP标准逻辑. 那么问题来了!今日收到业务人员报说采购订单4300013979,完成了收货和IV, ...
- 顺F分享,你是在裸奔吗?
" 对顺F旗下各APP顺藤摸瓜分析--顺F分享." 前文对顺F速运和顺F速运国际版进行了分析,二者使用同一套接口,虽然保护强度不高,但对代码和数据的保护却区别对待,实在让人诧异. ...
- 环信即时通讯在工程中的安装——Nusen_Liu
即时通讯-环信 准备 1.下载SDK http://www.easemob.com/download 2.证书下载上传 后期发送消息 需要推送发送的内容 http://docs.easemob.com ...
- 【转载】如何在Android中避免创建不必要的对象
在编程开发中,内存的占用是我们经常要面对的现实,通常的内存调优的方向就是尽量减少内存的占用.这其中避免创建不必要的对象是一项重要的方面. Android设备不像PC那样有着足够大的内存,而且单个App ...
- [日常] 免费的文本比较工具Meld使用
需要在linux桌面环境进行文件比较的时候,发现的一款文本比较工具,并且还有windows版本.之前一直在windows下使用的是beyond compare这个的破解版,这个软件本身是收费的而且还非 ...
- [日常] Redis中set集合的使用思考
公司部门同事有个需求,就是需要把当前另一个部门a中存储的数据全部导出来,自己当前业务b的数据全部导出来,两个要取一下差集,把a中存在,b中不存在的记下来,要去调用某接口把对应的文件删除.这个我感觉可以 ...
- BouncyCastle配置
1.BouncyCastle简介 BouncyCastle是一款开源的密码包,其中包含了大量的密码算法,使用BouncyCastle的目的就是为了扩充算法支持 下载地址最新加密组件包 http://w ...