时间: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. 关于yield和yield from

    一.简单示例 def yield_func(): for _ in range(2): yield "12" def yield_from_func(): for _ in ran ...

  2. 盘点10个CAD难点,看看有没有让你崩溃的,解决方法一并奉上

    蜀道难,难于上青天”,对于很多学习CAD的小伙伴来说CAD就跟蜀道一样,太难了,下面小编分享几个在学习CAD过程中会遇到的问题以及解决的方法,一起来看看吧! 1. 如何替换找不到的原文字体? 答:复制 ...

  3. 自定义栈Stack 和 队列Queue

    自定义栈 接口 package com.test.custom; public interface IStack<E> { E pop(); void push(E e); E peek( ...

  4. JavaScript初探 四 (程序结构)

    JavaScript 结构 JavaScript 程序结构 JavaScript支持几乎和C语言一样的程序结构 分支结构 循环结构 分支结构 条件分支 if-else if语句:判断条件为true则执 ...

  5. msf中的情报搜集

    msf中的情报搜集 被动的信息搜集 ​ 使用被动的.间接的信息搜索技巧,可以在目标不察觉的情况下挖掘目标的相关信息. 公开渠道情报搜集 对公开的和已知的信息进行检索筛选,获取到目标的情报集合,一系列的 ...

  6. NDK简介

    一.NDK简介: C/C++的动态库.Dalvik通过JNI编程方式调用C/C++代码. NDK编程提高软件性能,加密保护APK文件 ndk-build        NDK编译生成脚本 Java编译 ...

  7. VS2019专业版和企业版激活密钥

    Visual Studio 2019 Professional NYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y Visual Studio 2019 EnterpriseBF8Y8-GN2 ...

  8. c# WF 第9节 button控件

    本节内容: 1:实现实例 1:实现实例 每当点击一个确定就出现一个窗口,当点击最后的确定时,关闭所有的窗口. 实现: 步骤1:对Form 1 -Form3 依次进行如下设置: 步骤2 : 当每点击一个 ...

  9. 201871010111-刘佳华《面向对象程序设计(java)》第十二周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十二周学习总结 实验十   集合与GUI初步 实验时间 2019-11-14 第一部分:基础知识总结 第九章知识总结 1. ...

  10. Springboot项目启动不了。也不打印任何日志信息。

    Springboot项目启动不了.也不打印任何日志信息. <!-- 在创建Spring Boot工程时,我们引入了spring-boot-starter,其中包含了spring-boot-sta ...