时间:2019年08月19日


前言

今天去面试,技术主管问我值类型和引用类型有什么区别,面对如此基础的知识只能怪自己没有好好准备以及只顾写代码对一些基础知识其然不知所以然,于是我含含糊糊回答了一番:

  • 值类型
  • 数据类型 int float double datetime等数据类型为值类型。
  • 引用类型
  • 类型 String,Array,List,Dictionary ,queue等都是引用类型,我们也可以自己用class定义引用类型。
  • 而这些类型最终都继承Object类型。

技术主管:

  1. 值类型与引用类型都可以用Equals来比较吗?
  2. 如何将一个数组a的值赋予数组b然后对b做修改而不影响原来的数组?

以上问题也就是技术主管平时遇到的坑吧。上述的我就不献丑了,所以也是含糊其辞直接回答。所以在面试完了以后我专门针对性的上网查了资料,以下是我的总结,若有错误望博友多多指正_

C#值类型和引用类型

  • 类型
  • 值类型
  • 引用类型

基类(共同点)

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 坑!

总结:原来数组为引用类型,直接赋值等于是将每个元素的地址复制

  1. 如果是引用传递,可以直接将数组变量通过'='赋值
  2. 如果是值传递的话,那么可以使用 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};
}

符合预期。

总结一些东西:

  1. 值类型与引用类型最终都继承最终都继承System.Object但值类型中间继承System.ValueType。

    2。 对于引用类型以及值类型一定要分清,不然编程过程中容易出bug

更新

20190819 21:46 删除了装箱值类型 (现在还不清楚装箱值类型是怎么写上去的)。

C#面试基础知识点:值类型和引用类型(1)(填坑文)的更多相关文章

  1. c#1所搭建的核心基础之值类型和引用类型

    这个主题很重要,在.NET中做的一切其实都是在和一个值类型或者引用类型打交道. 现实世界中的值和引用 假定你在读一份非常棒的东西,希望一个朋友也去读他.于是你到复印室里复印了一份.这个时候他获得了属于 ...

  2. 1.C#知识点:值类型和引用类型

    一.什么是值类型?什么引用类型? 1.值类型的值是存储在栈上的.引用类型是存在堆上的.  2.值类型变量声明之后,不管是否已经分配内存,编译器在堆上为其分配内存.  3.引用类型声明的时候,这时候只在 ...

  3. C#基础:值类型、引用类型与ref关键字

    在C#中,ref的意思是按引用传递.可以参考C++: int a = 10, b = 20; void swap(int x, int y) { int temp = x; x = y; y = te ...

  4. .NET基础知识(01)-值类型与引用类型

    常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum.int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆 ...

  5. .NET面试题解析(01)-值类型与引用类型

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还 ...

  6. c#基础系列1---深入理解值类型和引用类型

    "大菜":源于自己刚踏入猿途混沌拾起,自我感觉不是一般的菜,因而得名"大菜",于自身共勉. 不知不觉已经踏入坑已10余年之多,对于c#多多少少有一点自己的认识, ...

  7. C#基础知识1-深入理解值类型和引用类型

    C#值类型和引用类型这个概念在刚学习的时候应该就知道了.但是我们并没有深入的去理解它.越是基础知识其实才是最有用的.对代码的优化,代码质量的提升都有帮助.通过整理本文章,对很多知识也起到了巩固的作用吧 ...

  8. C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)

    前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...

  9. C#基础--值类型和引用类型

    C#中大多数类型都是引用类型,只有个别特殊情况是值类型. 值类型: 枚举(enum) 结构(struct) 基础类型:int, short, char, bool....(string是引用类型) 引 ...

随机推荐

  1. python基础(32):进程(二)

    1. multiprocess模块 仔细说来,multiprocess不是一个模块而是python中一个操作.管理进程的包. 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含 ...

  2. Vue中computed和watch的区别

    在vue中computed和watch的真正区别是:computed产生于它的依赖,而watch产生于它的依赖的变化.只要依赖存在,我们就能访问到其对应的computed属性:但只有依赖发生了改变,我 ...

  3. 「SAP 技术」SAP MM 给合同的ITEM上传附件以及附件查询

    SAP MM 给合同的ITEM上传附件以及附件查询 1,使用事务代码 CV01N为合同上传附件, Document:输入6100000829, Document type 101 (contract) ...

  4. swift(五)swift的函数

    /** * 函数的定义和调用 */ func showIntegerArray(array:[Int]) { for a in array { println("\(a)") } ...

  5. 使用 Vim 搭建 C/C++ 开发环境

    原文链接: https://spacevim.org/cn/use-vim-as-a-c-cpp-ide/ SpaceVim 是一个模块化的 Vim IDE,针对 C/C++ 语言的支持主要依靠 la ...

  6. layui js 常用语句语法

    烂笔头: layui组件使用 注意layui的版本. 在head里需要引入css/js文件. 出现 form.verify,form.val is not a function的错误信息时,注意版本, ...

  7. DataGuard搭建逻辑StandBy

    DataGuard搭建逻辑StandBy 原创 作者:bayaim 时间:2016-03-31 17:23:48 272 0删除编辑   物理StandBy优点是效率高,缺点是只读模式不能恢复,恢复模 ...

  8. openresty安装笔记

    目录 安装步骤: openresty安装在ubuntu下的安装 参考 安装OpenResty(Nginx+Lua)开发环境 安装步骤: # 创建目录/usr/servers,以后我们把所有软件安装在此 ...

  9. 安装fiddler后,willow安装

    willow 安装需要与fiddler安装在同一个磁盘,如果出现报错找不到路径,请按下面地址下载willow后重新安装 willow下载地址: https://github.com/QzoneTouc ...

  10. postman---postman参数化

    我们在做接口测试的过程中,都会遇到同一个接口不同的数据,每次去一个个填写数据就太麻烦了,今天我们一起学习下如何通过postman进行参数化 参数化 参数化就是1个接口请求不同的数据,我们可以通过把请求 ...