时间: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. PHP作用域和文件夹操作

    1.作用域      1.1变量作用域      1.全局变量:在函数外面       2.局部变量:在函数里面,默认情况下,函数内部是不会访问函数外部的变量       3.超全局变量:可以在函数内 ...

  2. JDBC连接mysql的url的写法和常见属性

    URL=jdbc:mysql://[host][:port]/[database] 其后可以添加性能参数:?[propertyName1=propertyValue1] & [property ...

  3. Meterpreter初探

    Meterpreter Meterpreter号称"黑客瑞士军刀",Meterpreter是Metasploit框架中的一个杀手锏,通常作为漏洞溢出后的攻击载荷使用,攻击载荷在触发 ...

  4. 从0系统学Android-2.1Activity的使用

    更多精品文章分类 第二章:先从看的到的入手-Activity 上一章成功创建了自己的第一个项目.这一章从页面入手,来进行学习. 2.1 Activity 是什么 Activity 是一种可以包含用户界 ...

  5. laravel 数据库操作之 DB facade & 查询构造器 & Eloquent ORM

    <?php namespace App\Http\Controllers; use App\Student; use Illuminate\Support\Facades\DB; class S ...

  6. SRDC - ORA-1555 during Export: Checklist of Evidence to Supply (Doc ID 1682706.1)

    SRDC - ORA-1555 during Export: Checklist of Evidence to Supply (Doc ID 1682706.1) Action Plan 1. Exe ...

  7. cluster集群基本概念

    cluster集群种类: 1,LB(Load Balance)负载均衡集群: 弱点:当横向扩展到一定机器后,发现在怎么横向加机器也没有效果的时候,瓶颈就卡在分发的服务器上了,也就是LB机器上了,如何解 ...

  8. Shell类

    70个经典的 Shell 脚本面试问题   1) 如何向脚本传递参数 ? ./script argument 例子: 显示文件名称脚本 ./show.sh file1.txt cat show.sh ...

  9. C++学习一 结构与结构体

    结构体属于C++与C区别之一. 代码例子如下(来自<C++程序设计>): #include <iostream> #include <string> using n ...

  10. pymongo 笔记(转)

    1. 安装MongoDB并启动服务,安装PyMongo2. 连接MongoDB,并指定连接数据库.集合 import pymongo client = pymongo.MongoClient(host ...