C#核心知识回顾——1.结构体、构造函数、GC、成员属性、索引器

1.结构体:

        在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。例如我定义了一个结构体,它有两个变量,创建一个这个类型的结构体,通过一个变量名调用多个变量,这些变量可以在结构体中赋值,也可以在结构体外进行更改。

public struct Test{public string name;public string age;}public Test People;public void GetTest(){People.age = "2";People.name = "name";        }

结构体不能在声明时赋值

结构体是值类型,无需进行堆分配,类是引用类型
结构类型的变量直接存储数据结构,而类类型的变量存储对动态分配的对象的引用
类支持继承,结构体不支持继承
关键字简单说下,类是Class,结构体是Struct

在这里插入图片描述

2.构造函数

在实例化对象时会调用的用于初始化的函数
1.如果不写默认存在一个无参构造函数
2.没有返回值
3.函数名和类名必须相同
4.没有特殊需求时一般都是public的

5.构造函数可以被重载
6.this代表当前调用该函数的对象自己


注意!!
如果不自己实现无参构造函数而实现了有参构造函数
会失去默认的无参构造

其中有一种特殊写法:

class Person
{public string name;public int age;public Person(){name = "name";age = 1;}/// <summary>/// 特殊写法,:this()表示先执行this()构造方法,然后再执行:this()前面的构造方法/// </summary>public Person(string name, int age) : this(name){this.name = name;this.age = age;}public Person(string name){this.name = name;}
}
3.垃圾回收机制

垃圾回收,英文简写GC(Garbage Collector)
垃圾回收的过程是在遍历堆(Heap)上动态分配的所有对象
通过识别它们是否被引用来确定哪些对象是垃圾,哪些对象仍要被使用
所谓的垃圾就是没有被任何变量,对象引用的内容
垃圾回收有很多种算法,比如
//引用计数(Reference Counting)
//标记清除(Mark Sweep)
//标记整理(Mark Compact)
//复制集合(Copy Collection)

注意!!:
GC只负责堆(Heap)内存的垃圾回收
引用类型都是存在堆(Heap)中的,所以它的分配和释放都通过垃圾回收机制来管理
栈(Stack)上的内存是由系统自动管理的
值类型在栈(Stack)中分配内存的,他们有自己的申明周期,不用对他们进行管理,会自动分配和释放

内存回收原理:

0代内存        1代内存        2代内存

        代是垃圾回收机制使用的一种算法(分代算法)新分配的对象都会被配置在第e代内存中
每次分配都可能会进行垃圾回收以释放内存(e代内存满时)


在一次内存回收过程开始时,垃圾回收器会认为堆中全是垃圾,会进行以下两步:
        1.标记对象从根(静态字段、方法参数)开始检查引用对象,标记后为可达对象,未标记为不可达对象,不可达对象就认为是垃圾


        2.搬迁对象压缩堆(挂起执行托管代码线程)释放未标记的对象搬迁可达对象修改引用地址


        大对象总被认为是第二代内存目的是减少性能损耗,提高性能,不会对大对象进行搬迁压缩85000字节(83kb)以上的对象为大对象

        0代内存满了时候,会对0代内存进行垃圾回收,释放掉不可达对象,将可达对象迁移到1代内存压缩堆,1代内存满了时,对0代、1代内存都进行垃圾回收,迁移1代内存到2代内存,2代也是类似如此。

4.成员属性:

1.用于保护成员变量
2.为成员属性的获取和赋值添加逻辑处理
3.解决3P的局限性
public—内外访问 

private—内部访问

protected一内部和子类访问

属性可以让成员变量在外部:

只能获取   不能修改   或者   只能修改   不能获取

class Person
{private string name;private int age;private int id;/// <summary>/// 属性命名 帕斯卡命名 开头大写/// </summary>public string Name{get { //将属性值传递出去return name;}set {//value 关键字,外部传入的值name = value;}}
}/// <summary>
/// 成员属性的使用
/// </summary>
class GetName
{Person p = new Person();void Start(){//set{}p.Name = "name";//get{}Debug.Log(p.Name);}
}

成员属性可以用来进行加密处理,例如:

public int Age{get {//解密处理return age - 5;}set {//加密处理age = value + 5;}}

同时也可以用来防止数据错误:

  public int Age{get {//解密处理return age - 5;}set {if(age < 0 ){age = 0;Debug.Log("年龄不能小于0岁,已改为0岁");}//加密处理age = value + 5;}}

注意!!成员属性set、get可以加访问修饰符
1.默认不加会使用属性申明时的访问权限
2.加的访问修饰符要低于属性的访问权限
3.不能让get和set的访问权限都低于属性的权限

 public int Age{//添加了private以后,get属性在外部就不能被得到了//但是不能set 和 get 都加privateprivate get {return age;}set {age = value;}}

set、get可以只有一个

如果类中有一个特征是只希望外部能得不能改的又没什么特殊处理
那么可以直接使用自动属性

   public int Hight{get;private set;}

5.索引器:

让对象可以像数组一样通过索引访问其中元素,使程序看起来更直观,更容易

class Person
{private string name;    private int age;private Person[] ids;/// <summary>/// 索引器定义/// </summary>/// <param name="index"></param>/// <returns></returns>public Person this[int index]{get{return ids[index];}set{ids[index] = value;}}
}class GetPeson
{void Start () { Person p = new Person();//像获取数组一样获取值p[0]=new Person();Debug.Log(p[0]);}
}
class Person
{private string name;public String this[int index]{get{return name;}set{name = value;}}
}
public class GetInfo : MonoBehaviour
{private void Start(){Person p = new Person();p[0] = "shgd";Debug.Log(p[0]);//shgd}
}

索引器可以写一些逻辑:

 get{//索引器中可以写逻辑//如果ids数组为空或者索引大于数组长度,直接返回空if (ids == null|| ids.Length - 1 < index){return null;}return ids[index];}set{//ids数组为空,为数组新建一个元素if (ids == null){ids = new Person[] {value};}//传进来的值索引大于ids数组长度,(把值赋给最后一个元素,自定义的规则)else if(index>ids.Length-1){ids[ids.Length-1] = value;}ids[index] = value;}

索引器重载(同时可以根据传入参数返回对应值):

private string name;    private int age;private Person[] ids;public Person this[int index]{get{return ids[index];}set{ids[index] = value;}}/// <summary>/// 索引器重载/// </summary>public string this[string str]{get{switch (str){case "name":return name;case "age":return age.ToString();}return "";}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/7558.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习复习7

机器学习复习7 1 - 根据下图中绘制的决策树&#xff0c;如果一个动物的耳朵是软的&#xff0c;脸型是圆的&#xff0c;并且有胡须&#xff0c;那么这个模型会预测它是猫还是不是猫&#xff1f; A. 不是猫 B. 是猫 **答案&#xff1a;B ** 2 - 以一棵决策树学习来对垃圾邮件和非…

uniapp radio如何实现取消选中

uniapp 内置radio组件明确表示&#xff0c;不能取消选中&#xff0c;那如果要实现取消选中呢&#xff1f; 只要在外层加上label或者其他标签包裹&#xff0c;或者直接加入click事件然后加入事件控制radio的值改变即可 <label class"radio" click"changeAll&…

vue 连载软件大陆 vue之新手村,vue创建运行指导(如:vue脚手架,创建启动项目,配置等)

第一章 ’vue功法启动‘ 宇宙之间&#xff0c;开天辟地&#xff0c;从无到有&#xff0c;有一颗蔚蓝色的星球&#xff0c;名为软件大陆&#xff0c;如今大陆上有着众多老牌家族势力的诞生,如&#xff1a;c家族、c家族、java家族、.net家族、等&#xff0c; 而我们今天要说的是…

机器人学科建设沙盘套件!mechArm机械臂智慧农业3D分拣套装详解

作为最热门的技术领域&#xff0c;机器人技术正在彻底改变产业&#xff0c;并推动全球的创新。为了满足这个快速发展的领域对技术人才日益增长的需求&#xff0c;高校开发了一个开创性的机器人教育解决方案。这个创新的解决方案将自动化水果采摘机的模拟与水果分拣和运送的自动…

Simulink 中基于 FPGA 的波束成形:算法设计(附源码)

一、前言 本示例显示了在 Simulink中开发适用于在硬件&#xff08;如现场可编程门阵列 &#xff08;FPGA&#xff09;&#xff09;上实现的波束成形器的工作流程的前半部分。它还演示如何将实现模型的结果与行为模型的结果进行比较。 示例 Simulink 中基于 FPGA 的波束成形&…

docker专题系列之十五:卸载docker

一、准备工作 1.杀死docker有关的容器&#xff1a; docker kill $(docker ps -a -q)2.删除所有docker容器&#xff1a; docker rm $(docker ps -a -q)3.删除所有docker镜像&#xff1a; docker rmi $(docker images -q)4.停止 docker 服务&#xff1a; systemctl stop dock…

redis知识复习

redis知识复习 redis基础知识一. redis的认识1. 非关系型数据库 与 传统数据库 的区别2. 安装redis并设置自启动3. 熟悉命令行客户端4. 熟悉图形化工具RDM 二. redis的命令与数据结构1. 数据结构介绍2. redis通用命令&#xff08;熟练掌握&#xff09; 三. redis的Java客户端1.…

背光图像增强论文调研

背光图像增强 M. Akai, Y. Ueda, T. Koga and N. Suetake, “A Single Backlit Image Enhancement Method For Improvement Of Visibility Of Dark Part,” 2021 IEEE International Conference on Image Processing (ICIP), Anchorage, AK, USA, 2021, pp. 1659-1663, doi: 10…

springboot中Thymeleaf模板插入Freemarker模板页面

概述 最近在修改springboot架构的项目&#xff0c;项目之前配置的是Thymeleaf模板&#xff0c; 但是在我新加的功能中&#xff0c;我非常想用Freemarker模板来新加一些页面功能。 看到网上很多其他地方描述&#xff0c;要么用不同的文件后缀来区分(如html文件为Thymeleaf&…

C# 交错数组学习

C# 交错数组是元素为数组的数组。 一个示例&#xff1b; using System;class Program {static void Main(string[] args) {string[][] weeks new string[3][];weeks[0] new string[] { "星期日", "星期一", "星期二", "星期三", &…

举例说明什么是循环神经网络

循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种处理时间序列数据和自然语言等具有顺序信息的数据的神经网络模型。与普通的前馈神经网络&#xff08;Feedforward Neural Network&#xff09;不同&#xff0c;RNN具有循环连接&#xff0c;使得网络能…

区块链技术如何改变Web3认证的现状?

随着加密货币和区块链技术的迅猛发展&#xff0c;Web3钱包成为了数字经济时代中的重要组成部分。Web3钱包是一种工具&#xff0c;用于存储、管理和交互加密货币及其他数字资产&#xff0c;以及与去中心化应用程序&#xff08;DApp&#xff09;进行交互。它们是实现Web3.0理念的…