前言

工作之中,我们习惯了碰到任务就直接去实现其业务逻辑,但是C#真正的一些基础知识,在我们久而久之不去了解巩固的情况下,就会忽视掉。我深知自己正一步步走向只知用法却不知原理的深渊,所以工作之余,一直想找一些能深入讲解C#基础知识和底层原理的书籍,有幸在网上看到了《.net之美》一书,(--张子阳作 )开始只是简单的做了阅读,但是越往下读,发现书中所述都是自己所薄弱或者是工作中遇到但是解释不清其原理的知识点,为了加深自己的印象,故萌生出写下读书笔记的想法,也是为自己的学习有个记录,方便日后查阅,加深理解。

一. C#语言基础

1.1 C# 类型基础

C#的类型共分为两种: 值类型和引用类型. 当然,区分他们的不同是以其在计算机内存中的分配方式不同

来划分的

1.值类型总是分配到它声明的地方:

a.作为引用类型的成员变量分配到“堆”上

b.作为方法的局部变量时分配到“栈”上

2.引用类型总是被分配到"堆"上
3.当声明一个值类型的变量时,变量本身包含了值类型的全部字段,该变量将被分配在线程堆栈上。
4.当声明一个引用类型变量,并使用new操作符创建引用类型实例的时候,该引用类型的变量会被分配到线程栈上,变量保存了位于堆上引用类型的实例的内存地址。变量本身不包含任何类型所定义的数据。
public class RefPoint
{
public int x;
public RefPoint(int x){
this.x=x;
}
public RefPoint(){};
}

当仅声明不实例化时,RefPoint r1; 只在线程栈上创建一个不包含任何数据,也不指向任何对象 (不包含内存地址)的变量

当使用new操作符实例化该变量时,r1=new RefPoint(1);将完成以下几件事

  • 在应用程序堆上创建一个引用类对象的实例,并为其分配内存地址
  • 自动传递该实例的引用给构造函数。
  • 调用该类型的构造函数 public RefPoint(int x){}
  • 返回该实例的引用,赋值给r1变量。
5.装箱和拆箱

装箱就是将一个值类型转换成等价的引用类型,拆箱则是将一个已装箱的引用类型转换为值类型。

注:拆箱操作需要显示声明拆箱后转换的类型。因为拆箱装箱需要反复在内存堆上进行,因此,在我们实际的程序应用中,应该避免没有意义的装箱和拆箱操作,以此来减少我们的内存消耗。

6.引用类型判等

System.Object基类中,定义了实例方法Equals(object obj)、静态方法Equals(object objA,object objB)、静态方法 ReferenceEquals(Object objA,Object objB) 三种方法来判断两个引用类型是否相等。

作者给出了以上三种方法的具体实现,如下所示:

public static bool ReferenceEquals (Object objA, Object objB)
{
return objA == objB; // #1
}
public virtual bool Equals(Object obj)
{
return InternalEquals(this, obj); // #2
}
public static bool Equals(Object objA, Object objB) {
if (objA==objB) { // #3
return true;
}
if (objA==null || objB==null) {
return false;
}
return objA.Equals(objB); // #4
}

ReferenceEquals(),判断的是两个引用变量是不是指向了同一个变量,如果是,则返回true,这种相等就是引用相等。等同于==。

另外需要注意的就是 对于引用类型,即使类型的实例包含的值相等,但是如果变量指向的是不同的对象,即引用值针的地址不相等,那么这两个变量也是不相等的。

7.简单值类型判等

简单值类型:值类型的成员仅包含值类型;

复杂值类型:值类型的成员包含引用类型;

值类型的判等,会调用System.ValueType的Equals()方法。方法内容简单的来讲就是 先判断两个对象是不是同一个类型,如果不是,直接返回false,接着来判断对象内所有的字段,利用反射机制取到值类型的所有字段,遍历字段,进行字段与字段的比较。

8.对象复制

浅度复制:对于值类型成员,会复制其本身;对于引用类型成员,仅仅复制引用,而不在堆上重新创建对象。结果就是 新对象的引用成员和复制对象的引用成员指向了同一个对象。

相对的,深度复制:就是将引用成员指向的对象也进行复制。过程就是创建新的引用成员指向的对象,然后复制对象中所包含的数据。

9.常量性和原子性

对象的原子性:对象的状态是一个整体,如果一个字段改变,其他字段也要同时做出相应改变。

如何实施?? 添加一个构造函数,在构造函数中为对象的所有字段赋值。

对象的常量性:对象的状态一旦确定,就不能再次更改了。如果想再次更改,需要重新创建新的对象。

如何实施??可将属性中的set访问器删除,同时将字段声明为readonly只读状态。

二.小结

作者在这一章节主要讲解了C#中的类型,包括值类型和引用类型,以及简单类型和拆箱装修的过程,以及后续的对象判等、深浅复制及对象的一些特性等。通过对此章节的阅读,加深并巩固了我对于C#这些基础概念的理解,大学肯定也学过这些,但是随着步入工作后,慢慢接触到的都是工作中的业务逻辑处理了,关心的也是业务逻辑该如何实现等,很少再有精力去回过头了解基础的一些知识点。

今天上午还在网上看到某个大佬发布的一篇博文,大概意思就是30+的程序员面试的一些过程,看完感觉感触很深,虽然我今年27,离30+也不远了,但是工作中,总感觉自己一旦闲下来就很慌,是那种不知所措的心里慌,很想去看点关于基础知识点的书籍,但是一看到知识点概念就看不进去了,偶尔还有其他事情要忙,只能草草收场,等到下次再想起来的时候,已经记不清上次自己看到哪里了,所以写下这篇文章也是为了防止自己再放弃,算是给自己一个鼓励吧。

曾经问过一位博主大佬,为什么文章写的那么好,感觉什么都能拿来作文章的素材,再看看自己,虽然也在努力,但是没有目标,没有方向。2020年也快过完了,去年定下的目标也忘的差不多了,就希望接下来的时间里,能抓紧时间,充实自己吧。

【记】《.net之美》之读书笔记(一) C#语言基础的更多相关文章

  1. 《玩转Django2.0》读书笔记-Django建站基础

    <玩转Django2.0>读书笔记-Django建站基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.网站的定义及组成 网站(Website)是指在因特网上根据一 ...

  2. 《Go并发编程实战》读书笔记-初识Go语言

    <Go并发编程实战>读书笔记-初识Go语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讲解怎样用Go语言之前,我们先介绍Go语言的特性,基础概念和标准命令. 一. ...

  3. 《Essential C++》读书笔记 之 C++编程基础

    <Essential C++>读书笔记 之 C++编程基础 2014-07-03 1.1 如何撰写C++程序 头文件 命名空间 1.2 对象的定义与初始化 1.3 撰写表达式 运算符的优先 ...

  4. pancake的排序- 1.3 一摞烙饼的排序 《编程之美》读书笔记03

    问题:     星期五的晚上,一帮同事在希格玛大厦附近的“硬盘酒吧”多喝了几杯.程序员多喝了几杯之后谈什么呢?自然是算法问题.有个同事说:“我以前在餐馆打工,顾客经常点非常多的烙饼.店里的饼大小不一, ...

  5. 《UNIX-Shell编程24学时教程》读书笔记Chap1,2 Shell基础,脚本基础

    Chap1 Shell基础 知道该使用哪种命令是依赖于经验的.----惟手熟尔. 1.1 什么是命令 其实知道这些名词好像也没什么帮助,嘻嘻 1.2 什么是Shell 不同用户不同的提示符:不同的环境 ...

  6. R语言实战读书笔记(一)R语言介绍

    1.3.3 工作空间 getwd():显示当前工作目录 setwd():设置当前工作目录 ls():列出当前工作空间中的对象 rm():删除对象 1.3.4 输入与输出 source():执行脚本

  7. OCM读书笔记(2) - PL/SQL 基础

    1. % type 用法,提取% type所在字段的类型 declare     myid dept.deptno % type;    myname dept.dname % type;begin  ...

  8. 《Effective C#》读书笔记-1.C# 语言习惯-1.使用属性而不是可访问的数据成员

    思维导图: 大纲: 1.使用属性而不是可访问的数据成员    属性        指定不同的访问权限        隐式属性降低了声明属性的工作量        允许将数据成员作为公共接口的一部分暴露 ...

  9. 《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)

    概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识 ...

随机推荐

  1. 理解传输层中UDP协议首部校验和以及校验和计算方法的Java实现

    UDP,全称User Datagram Protocol,用户数据报协议,是TCP/IP四层参考模型中传输层的一种面向报文的.无连接的.不能保证可靠的.无拥塞控制的协议.UDP协议因为传输效率高,常用 ...

  2. 3D渲染集群,你了解多少?

    摘要:渲染是批处理运行模式,那能不能使用Docker容器技术,做大规模的渲染集群呢? 我们先说说3D渲染涉及哪些领域: 1.什么是3D渲染 简单粗暴的讲:就是将虚拟世界里的3D模型,变为(人眼看到)平 ...

  3. JVM系列.历史上出现过的Java虚拟机

    HotSpot绝对是当今商用虚拟机的王者,但是在Java历史上出现过很多Java虚拟机,这篇文章就来整理下历史上出现过的Java虚拟机以及他们的特性. Sun Classic Sun Classic虚 ...

  4. Python发送get、post请求

    import json import requests #获取北京天气 # #url= "https://wis.qq.com/weather/common?source=xw&we ...

  5. 23种设计模式 - 单一职责(Decorator - Bridge)

    其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 单一职责 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀, ...

  6. 【Pod Terminating原因追踪系列之一】containerd中被漏掉的runc错误信息

    前一段时间发现有一些containerd集群出现了Pod卡在Terminating的问题,经过一系列的排查发现是containerd对底层异常处理的问题.最后虽然通过一个短小的PR修复了这个bug,但 ...

  7. 神奇的BUG系列-01

    有时候遇见一个bug,感觉就是他了 其实他也不过是你职业生涯中写的千千万万个bug中的一员 你所要做的,是放下 日子还长,bug很多,不差这一个 就此别过,分手快乐 一辈子那么长,一天没放下键盘 你就 ...

  8. 【小白学PyTorch】4 构建模型三要素与权重初始化

    文章目录: 目录 1 模型三要素 2 参数初始化 3 完整运行代码 4 尺寸计算与参数计算 1 模型三要素 三要素其实很简单 必须要继承nn.Module这个类,要让PyTorch知道这个类是一个Mo ...

  9. 深入了解Redis【二】对象及数据结构综述

    引言 Redis中每个键值对都是由对象组成: 键总是一个字符串对象(string) 值可以是字符串对象(string).列表对象(list).哈希对象(hash).集合对象(set).有序集合对象(z ...

  10. 微服务实战SpringCloud之Spring Cloud Feign替代HTTP Client

    简介 在项目中我们有时候需要调用第三方的API,微服务架构中这种情况则更是无法避免--各个微服务之间通信.比如一般的项目中,有时候我们会使用 HTTP Client 发送 HTTP 请求来进行调用,而 ...