C#笔记(3)

好的OOP程序--->模块合理、结构清晰、程序规范、注释明确、运行流畅、维护容易、扩展方法。

OOP是学习各种编程的原则、方法、技巧、经验、模式、架构等。

所有面向对象的编程语言,都是把我们要处理的”数据“和”行为“封装到类中。

1、设计类

2、关联类

3、使用类

类的基本组成与对象

1、类名定义:名词,要求首字母大写,避免单词缩写

2、字段和属性,用来描述这个对象的静态信息(数据存储)

3、方法和接口,用来说明这个对象的行为特征(方法操作)

访问修饰符 class 类名

{

     //定义字段部分

         字段1的类型  字段1

     字段2的类型  字段2

              ...

     //定义属性部分

         属性1的类型   属性1

         属性2的类型   属性2

                         ...

         //定义方法部分

         方法1

         方法2

     ...

}

总结1:一个类其实就是相关数据和特定方法”结构的封装“

类 对象名 = new 类();

总结2:对象是按照类创建的一个具有”特定数据的实例“,通过对象调用类所封装的数据和方法!

访问修饰符

1、类的访问修饰符

作用:限制这个类可被使用的范围

类型:只有俩个(public和internal)

2、类成员访问修饰符

作用:限制类的字段、属性、方法的可访问范围

类型:private(私有的,仅供类的内部使用)、public(公有的,可以通过对象从外面使用)

注意:方法内部的变量,称为:“局部变量”是没有访问修饰符的

类的属性(Property)

1、属性的使用

作用:在OOP中主要用来封装数据

要求:一般采用Pascal命名法,数据类型和字段要一致,使用public修饰。

读取:属性通过get方法,返回私有字段的值。

赋值:属性通过set方法,借助于value给私有字段赋值

本质:属性本身是没有保存数据的,字段才是数据的存储单元。属性的本质是方法

2、属性的定义

private int courseId;//返回私有字段的值

public int CourseId

{

    get{return courseId;}

    //通过value给私有字段赋值

    set{courseId = value;}//C#3.0以后使用自动属性public int CourseId{get;set;}

}

  1. 属性特性
    1. 扩展业务逻辑

在属性get和set方法中添加业务逻辑,从而有效避免非法数据,示例:

            

Private int courseId = 0;Public int CourseId{get{return courseId;}set{if(value<0)courseId = 1000;elsecourseId = value;}}

    2.控制读写操作

根据需求设置为只读属性

//只读属性1,直接去掉set方法,可以在定义的时候初始化

Public string CoureName {get;} = “.Net”;

//只读属性2,直接去掉set方法,并在get中添加业务逻辑

Public string CourseInfo

{

   Get{return $"课程名称:{CourseName}课程编号:{courseId}课程价格:{UnitPrice}";}

}

属性和字段的总结

  1. 字段(成员变量):
    1. 内容使用:字段主要是为类的内部数据交换使用,字段一般是private。
    2. 数据存储:字段只是用来存储数据,如果不是静态字段,生命周期和对象共存亡。
    3. 读写不限:我们可以给字段赋值,也可以获取字段的值(非常常用)(readonly除外)
  2. 属性(字段封装)
    1. 外部使用:属性一般是向外提供数据访问,属性是public修饰,用来对外表示对象的静态特征。
    2. 业务扩展:属性内部可以添加我们需要的业务逻辑,可以避免非法数据,或完成其他相关任务。
    3. 读写可控:属性可以根据需要设置为只读属性,更好的体现面向对象的”封装特性“!也就是安全性。
  3. 使用
    1. 常规化使用:对象本身的”对外“数据保存,都是通过属性完成的,调用者都可以使用。
    2. 强制性使用:公有化字段,在很多时候是无法被解析的。(比如dgv、combobox的显示问题)

方法

  1. 概念:方法表示这个对象能够做什么,也就是封装了这个对象行为。
  2. 类型:实例方法——》静态方法——》(抽象方法、虚方法)——》特殊的:构造方法(对象创建的时候使用)

构造方法的使用:

  1. 作用:构造方法是在对象创建的时候被调用的,所以,在创建对象的时候可以完成一些初始化的任务。

初始化:包括给对象的属性赋值,或从其他对象、文本等获取基础数据。

一个类中,如果没有显示的写出任何构造方法,编译器会默认生成一个无参数的构造方法

可以随时显示的添加一个无参数的构造方法,构造方法无返回值

  1. 构造方法的类型
    1. 无参数构造方法:通常是用来直接初始化对象的属性或”某些不变的数据“。
Public void Dowork1(){//创建对象,得到类的实例,Course()就是无参数的构造方法Course course = new Course();//给对象的字段赋值course.Courseld = 1;course.CourseldName = ".Net全栈";//获取对象的数据Console.WriteLine(course.Type);//调用对象的方法string info = course.ShowCourseInfo();Console.WriteLine(info);}
    1. 有参数的构造方法:让对象创建者,自己传递要初始化的相关数据。

 

  //有参数的构造方法public void Dowork2(){//有参数的构造方法Course course2 = new Course(1,".Net","编程");Console.WriteLine("有三个参数构造方法" + course2.ShowCourseinfo());}public void Dowork3(){//俩个参数的构造方法Course course3 = new Course(2, ".Net");Console.WriteLine("俩个参数的构造方法 "+"Name="+course3.CourseName+";ID="+course3.CourseId);}

代码实例:
 

public class Course{public int CourseId { get; set; }public string CourseName { get; set; }public string Type { get; set; }public string ShowCourseinfo(){return $"课程名称:{CourseName},课程编号:{CourseId},课程系列:{Type}";}//无参数的构造方法public Course(){CourseId = 100;CourseName = ".Net";Type = "编程";//在这里还可以编写读取相关文件或者从其他数据读取的方法或逻辑...}//有参数的构造方法public Course(int courseId, string courseName){//this后面不可能接局部变量,只能接成员变量、属性、方法this.CourseId = courseId;this.CourseName = courseName;}//this代表在当前构造方法之间调用,base调用父类构造方法public Course(int courseId, string courseName, string type) : this(courseId, courseName){Type = type;}}class TestClass4{//无参数的构造方法public void Dowork1(){//无参数构造方法Course course = new Course();Console.WriteLine("无参数构造方法"+course.ShowCourseinfo());}//有参数的构造方法public void Dowork2(){//有参数的构造方法Course course2 = new Course(1,".Net","编程");Console.WriteLine("有三个参数构造方法" + course2.ShowCourseinfo());}public void Dowork3(){//俩个参数的构造方法Course course3 = new Course(2, ".Net");Console.WriteLine("俩个参数的构造方法"+"Name="+course3.CourseName+";ID="+course3.CourseId);}}

对象初始化器的使用

  1. 引入:C#3.0时代开始
  2. 作用:更加灵活的初始化对象的”属性“,可以在创建对象的同时为对象的属性赋值,而无需显式调用构造函数并逐个赋值属性。

代码实例:

 public void Dowork4(){Course course = new Course(){CourseName = ".Net",};Console.WriteLine(course.CourseName);}

构造方法和对象初始化器总结:

  1. 构造方法:
    1. 存在的必要性:一个类中,至少要有一个构造方法。(可以是无参数的,也可以是有参数的)
    2. 调用的特殊性:只能在对象创建的时候,通过new关键字调用。
    3. 使用的强制性:对象的创建,必须调用指定的构造方法,也就是参数必须统一
    4. 语法的特殊性:不能有返回值、构造方法名称必须和类名一样!
  2. 构造方法PK对象初始化器
    1. 相同点:都可以完成对象”属性“初始化
    2. 不同点:
      • 有无强制性:构造方法有强制性,对象初始化器没有强制性,随意使用。
      • 使用的范围:对象初始化器只能完成属性初始化,而构造方法可以完成任何我们需要的初始化任务。
      • 使用的位置:对象初始化器在创建对象的时候使用,而构造方法必须提前写在类中。
      • 出现的时间:构造方法在.Net1.0版本就有,而对象初始化器只能在.Net3.0以上版本才能使用。

成员变量和局部变量同名时:

  1. 成员变量和局部变量同名时,一般是就近原则取变量,如果我们需要舍近求远,则必须添加this。

对象的销毁:

  1. 对象的生存周期:
    1. 对象在内存中不断的”生生死死“,具有生命周期。
  2. 对象在内存中的状态:
    1. 正在引用:程序正在使用的对象
    2. 游离状态:没有引用的对象,已经使用完毕但依然占据空间
  3. 垃圾回收机制(GC)
    1. .Net虚拟机特有的机制,自动运行,并检查对象的状态。
    2. 发现对象不被引用时,会释放其所占空间(销毁)

析构函数:

1、C++中析构函数的使用,当使用delete关键字删除对象时,析构函数会自动调用

~类名(){}

2、托管运行环境下对象的销毁由虚拟机负责,析构函数没多大用途。

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

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

相关文章

第八节 如何结合AAA实现用户远程登录-路由基础

关于调试设备的登录方式&#xff0c;一共有三种&#xff1a; 第一个&#xff1a;console&#xff1a;需要工程师在现场&#xff0c;进行登录&#xff0c;设备开局的时候使用 第二个&#xff1a;telnet ssh&#xff1a;基于网络互通的前提下进行登录的&#xff0c;远程登录 第三…

【Conda】Windows下conda的安装并在终端运行

下载 在官网下载 https://www.anaconda.com/download/success 安装 双击 一直下一步安装 配置环境变量 为了在终端运行&#xff0c;需配置环境变量 进入到安装conda的目录并复制路径 设置高级环境变量 在终端运行 输入&#xff1a; conda list表明可以正常运行 参考…

LogViewer NLog, Log4Net, Log4j 文本日志可视化

LogViewer 下载 示例&#xff1a;NLog文本日志可视化软件&#xff0c;并且能够实时监听输出最新的日志 nlog.config 通过udp方式传输给LogViewer (udp://ip:port) <?xml version"1.0" encoding"utf-8" ?> <nlog xmlns"http://www.nlog-…

MuMu模拟器安卓12安装Xposed 框架

MuMu模拟器安卓12安装Xposed 框架 当开启代理后,客户端会对代理服务器证书与自身内置证书展开检测,只要检测出两者存在不一致的情况,客户端就会拒绝连接。正是这个原因,才致使我们既没有网络,又抓不到数据包。 解决方式: 通过xposed框架和trustmealready禁掉app里面校验…

Python Web 应用开发基础知识

Python Web 应用开发基础知识 引言 随着互联网的快速发展&#xff0c;Web 应用程序的需求日益增加。Python 作为一种简单易学且功能强大的编程语言&#xff0c;已经成为 Web 开发中广受欢迎的选择之一。本文将深入探讨 Python Web 开发的基础知识&#xff0c;包括常用框架、基…

CSS Module:告别类名冲突,拥抱模块化样式(5)

CSS Module 是一种解决 CSS 类名冲突的全新思路。它通过构建工具&#xff08;如 webpack&#xff09;将 CSS 样式切分为更加精细的模块&#xff0c;并在编译时将类名转换为唯一的标识符&#xff0c;从而避免类名冲突。本文将详细介绍 CSS Module 的实现原理和使用方法。 1. 思…

动力商城-03 Idea集成apifox Mybatis-Plus字段策略

1.Idea下载apifox插件 2.新建令牌放入Idea 3.右键上传到对应接口 4.设置前置url 插件能够自动识别swagger注解 Mybatis-Plus字段策略 1、FieldStrategy作用 Mybatis-Plus字段策略FieldStrategy的作用主要是在进行新增、更新时&#xff0c;根据配置的策略判断是否对实体对…

使用 npm 安装 Yarn

PS E:\WeChat Files\wxid_fipwhzebc1yh22\FileStorage\File\2024-11\spid-admin\spid-admin> yarn install yarn : 无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后…

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件 Excel导出系列目录&#xff1a;★★★★尤其注意&#xff1a;引入依赖创建导出模板类逻辑处理controllerservice 导出效果总结 Excel导出系列目录&#xff1a; 【Springboot 使用EasyExcel导出Excel文件】 【Springb…

深入理解 source 和 sh、bash 的区别

1 引言 在日常使用 Linux 的过程中&#xff0c;脚本的执行是不可避免的需求之一&#xff0c;而 source、sh、bash 等命令则是执行脚本的常用方式。尽管这些命令都能运行脚本&#xff0c;但它们之间的执行方式和效果却有着显著的区别。这些区别可能会影响到脚本的环境变量、工作…

CC6学习记录

&#x1f338; cc6 cc6和cc1的国外链其实后半条链子是一样的&#xff0c;但是cc6的不局限于jdk的版本和commons-collections的版本。 回忆一下cc1的后半条链子&#xff1a; LazyMap.get()->InvokerTransformer.transform() 这里我们就结合了URLDNS链的思路&#xff0c;在…

飞凌嵌入式RK3576核心板已适配Android 14系统

在今年3月举办的RKDC2024大会上&#xff0c;飞凌嵌入式FET3576-C核心板作为瑞芯微RK3576处理器的行业首秀方案重磅亮相&#xff0c;并于今年6月率先量产发货&#xff0c;为客户持续稳定地供应&#xff0c;得到了众多合作伙伴的认可。 FET3576-C核心板此前已提供了Linux 6.1.57…

路漫漫其修远兮,吾将上下而求索---第一次使用github的过程记录和个人感受

文章目录 1.仓库位置2.新建仓库3.配置仓库4.克隆和上传5.推荐文章和我的感受 1.仓库位置 这个仓库的位置就是在我们的这个个人主页的右上角&#xff1b;如果是第一次注册账号的话&#xff0c;这个主页里面肯定是不存在仓库的&#xff0c;需要我们自己手动的进行创建&#xff1…

docker与大模型(口语化原理和实操讲解)

文章目录 一、镜像images1&#xff09;下载安装2&#xff09;docker images相关命令(保存、删除、上传、别名、搜索镜像) 二、容器container1&#xff09;展现所有在跑的容器服务ps2&#xff09;start /restart / kill / stop /rm 三、dockerfile四、volume五、network六、dock…

《基于Oracle的SQL优化》读书笔记

查看执行计划set autotrace traceonly explain在当前session中将优化器模式改为RULE。alter session set optimizer_modeRULE;统计信息存储在oracle的数据字典里&#xff0c;且从多个维度描述了oracle数据库里相关对象的实际数据量&#xff0c;实际数据分布等详细信息。 -- 对…

css:浮动

网页的本质上就是摆放盒子&#xff0c;把盒子摆到相应的位置上 css提供了三种传统的布局方式&#xff1a; 普通流&#xff08;标准流&#xff09;&#xff1a;标签按默认方式排列&#xff0c;最基本的布局方式 浮动 定位 实际开发中&#xff0c;一个网页基本包含了三种这种布局…

c++入门--引用与指针,const与引用,NULL与nullptr

1.引用与指针&#xff1a; 1.1引用的介绍&#xff1a; 引用相当于一个变量的别名&#xff0c;向函数传参后或者在main函数中可以直接对这个变量进行操作。 1.2引用的返回&#xff1a; 函数返回的时候是生成了一个临时变量&#xff0c;这个变量具有常性&#xff0c;是不能对这…

单片机智能家居火灾环境安全检测

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 在现代社会&#xff0c;火灾安全始终是人们关注的重点问题。随着科技的不…

SpringBoot3全面复习

Springboot3 Spring Boot 3是Spring Boot框架的一个主要版本&#xff0c;它基于Spring Framework 6构建&#xff0c;引入了对最新Java版本&#xff08;如Java 17及以上&#xff09;的支持&#xff0c;并提供了许多新特性和改进。Spring Boot 3旨在简化Spring应用的初始搭建以及…

海思3403对RTSP进行目标检测

1.概述 主要功能是调过live555 testRTSPClient 简单封装的rtsp客户端库&#xff0c;拉取RTSP流&#xff0c;然后调过3403的VDEC模块进行解码&#xff0c;送个NPU进行目标检测&#xff0c;输出到hdmi&#xff0c;这样保证了开发没有sensor的时候可以识别其它摄像头的视频流&…