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

news2024/11/25 8:14:29
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 都加private
        private 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]);
    }
}

索引器可以写一些逻辑:

 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.coloradmin.cn/o/701678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Layui时间范围选择器,添加【本周、本月、本季度、本年等常用时间快捷键】

文章目录 1. 界面实现2. JS具体实现2.1 第一种实现2.2 第二种实现 1. 界面实现 <input id"Date_select" type"text" class"form-control" placeholder"请选择时间范围" style"border-radius: 4px;" /><input id&qu…

RuoYi-Vue Swagger 上传文件接口

前言 RuoYi-Vue&#xff1a; v3.8.5swagger 1.6.2 &#xff08;https://github.com/swagger-api/swagger-core, https://gitee.com/mirrors/swagger-core&#xff09; Swagger 上传接口定义 ApiOperation(value "图片上传") PostMapping(value "/upload&qu…

SpringBoo集成MongoDB

一、集成简介 spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb&#xff0c;MongoRepository操作简单&#xff0c;MongoTemplate操作灵活&#xff0c;我们在项目中可以灵活适用这两种方式操作mongodb&#xff0c;MongoRepository的缺点是不够灵活…

OpenMMLab-AI实战营第二期——相关3. RGB语义分割标注图像转为Gray格式的mask

文章目录 1. 转换代码1.1 查看原始图像1.2 转换1.3 cv::IMREAD_GRAYSCALE与CV_BGR2GRAY结果不一致1.3.1 现象描述1.3.2 原因1.3.3 推荐做法 1.4 CV_BGR2GRAY和CV_RGB2GRAY不一致 2. macOS上查看mask&#xff08;使用默认的预览&#xff09; 1. 转换代码 找到了一个语义分割的数…

rc表格卡方检验

一、案例介绍 某医院用三种穴位针刺治疗急性腰扭伤&#xff0c;现在想比较三种穴位针刺效果有无差别&#xff0c;结果汇总如下表&#xff1a; 二、问题分析 本案例想比较三种穴位针刺效果有无差别&#xff0c;可以使用RxC卡方检验进行分析。 通常情况下&#xff0c;共有三种…

uniapp项目 封装一个饼图组件 并且修改显示项的排列方式

需求如下: 真实数据渲染后的完成效果如下: 记录一下代码: <template><view><view style"height: 600rpx;"><l-echart ref"chart" finished"init"></l-echart></view></view> </template><…

【面试】一文知晓---拦截器和过滤器的区别

目录 背景关系图 拦截器和过滤器的区别实操1.过滤器1.1HttpServletRequestWrapper1.2 OncePerRequestFilter1.3 配置 2.拦截器2.1登录拦截2.2配置 3.监听器 三、注意1.静态资源问题2.登录拦截ajax重定向 总结 背景 关系图 然后具体执行流程如下&#xff1a; 拦截器和过滤器的区…

IDEA创建一个Servlet项目(tomcat10)

一、创建maven项目 org.apache.maven.archetypes:maven-archetype-webapp 二、增加Servlet依赖 tomcat9及以前依赖 <!--加入servlet依赖&#xff08;servlet的jar&#xff09;--><dependency><groupId>javax.servlet</groupId><artifactId>ja…

MoblieNet

论文信息 论文名称&#xff1a;MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 论文地址&#xff1a;https://arxiv.org/abs/1704.04861 研究背景和研究意义 之前的网络都倾向于将网络做得又大又深&#xff0c;并且不考虑网络的速度&…

测试CefSharp.WinForms的基本用法

微信公众号“dotNET全栈开发”的文章《C#使用CefSharp内嵌网页-并给出C#与JS的交互示例》介绍了CefSharp的基本用法。CefSharp支持在.net程序中内置Chromium&#xff0c;它是Chromium Embedded Framework (CEF) 的轻量化封装。   CefSharp面向Winform、wpf等提供对应的NuGet包…

SpringBoot初始化接口CommandLineRunner

CommandLineRunner的使用 接口定义使用执行顺序使用 Order 注解实现Orderd接口排序总结 接口定义 Spring官方给出的接口定义 package org.springframework.boot;FunctionalInterface public interface CommandLineRunner {void run(String... args) throws Exception; }在 Sp…

卡方检验之多重比较

一、案例介绍 某医师研究物理疗法、药物治疗和外用膏药3种疗法治疗周围性面神经麻痹的疗效&#xff0c;通过整体卡方检验已经得知3种疗法有效率的差异有统计学意义&#xff08;χ221.0377&#xff0c;p0.000&#xff09;的结论。现在想进一步知道&#xff0c;具体是哪两种疗法…

Android后台应用开启前台服务---android8到android12梳理

1、Android 8.0 异常报错 在Android 8.0 系统中&#xff0c;处于后台的应用想要开启前台服务&#xff0c;必须满足两点&#xff1a; 在Activity中调用startForegroundService()方法所调起的Service必须执行startForeground(int id, Notification notification)方法&#xff0…

计算几何——gitf-wrapping算法

几何中的"gift-wrapping"算法&#xff0c;又称为"Jarvis算法"&#xff0c;是一种用于计算凸包(convex hull)的方法。下面我将为你解释一下该算法的步骤&#xff1a; 1. 找到具有最小x坐标的点P&#xff0c;我们将其作为凸包的起点。 2. 将P标记为当前点&a…

doker安装RabbitMQ以及用java连接

目录 doker安装&#xff1a; RabitMq安装&#xff1a; java链接 doker安装&#xff1a; 参考链接&#xff08;非常详细&#xff09;&#xff1a; docker安装以及部署_docker bu shuminio_春风与麋鹿的博客-CSDN博客 安装好后开启doker //启动docker服务 systemctl start do…

PromQL讲解与实战操作

PromQL讲解与实战操作 一、PromQL 介绍 PromQL&#xff08;Prometheus Query Language&#xff09;是 Prometheus 内置的数据查询语言&#xff0c;它能实现对事件序列数据的查 询、聚合、逻辑运算等。它并且被广泛应用在 Prometheus 的日常应用当中&#xff0c;包括对数据查询…

在Linux服务器上简单部署一个Python项目

一、在对应的服务器上检查有无Python环境 大部分Linux系统都是自带了Python环境的&#xff0c;查看是否具备Python的运行环境&#xff0c;可以通过命令Python --version 或者 Python3 --version 查看。如果你的项目需要Python3的环境&#xff0c;而系统又没有&#xff0c;则需要…

Linux 开启 swap 分区详细教程

故事背景&#xff1a; 哥们云机器内存资源不足&#xff0c;搞个 kafka eagle 监控&#xff0c;刚跑起来就卡死了&#xff0c;就很无语&#xff0c;哥们忙活&#xff0c;算了直接开搞&#xff0c;内存不够&#xff0c;硬盘来凑&#xff0c;拿着硬盘去做swap分区&#xff0c;也能…

JavaEE-SpringMVC-云借阅图书管理系统(包含源码、数据库sql文件、报告)

文章目录 前言云借阅系统功能结构图云借阅系统结构层次云借阅系统项目文件组织结构开发环境具体操作1. Maven仓库修改2. MySQL数据库配置文件3. Tomcat运行截图 总结 前言 参考借鉴黑马程序员书籍&#xff1b;和老师上课讲解的代码和PPT。核心代码由自己编写完成&#xff0c;核…

【夜深人静学数据结构与算法】回溯算法

目录 前言&#xff1a; 回溯算法&#xff1a; 回溯法的常见应用: 回溯法的模板: 回溯法的图解&#xff1a;​ 案例&#xff1a; 77. 组合 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; 前言&#xff1a; 回溯算法是一个比较抽象的算法&#xff0c;因此我们…