当前位置: 首页 > news >正文

C#学习,结构,面向对象,类

结构和类

结构是从过程化程序设计中保留下来的一种数据类型,类则是面向对象程序设计中最基本的、也是最重要的概念。

结构

结构是一种值类型,通常用来封装一组相关的变量,结构中可以包含构造函数、变量、字段、方法、属性、运算符、事件和嵌套类型等。结构实际上就是将多个相关的变量包装为一个整体来使用。

结构的特点:

  • 结构是值的类型。

  • 向方法传递结构时,结构是通过传值的方式传递的,不是引用传递。

  • 结构的实例化不可以用new

  • 结构可以声明构造函数,但是必须带参数

  • 结构可以实现接口

C#中使用struct来声明结构,语法:

结构修饰符 struct 结构名
{
​
}

例如:

public struct Rect
{public double width;//宽public double heigth;//高public double Area(){return width * heigth;}
}

结构的使用

首先声明一个矩形结构,定义矩形的宽和高,然后在这个结构中定义一个构造函数,用来初始换宽和高,自定义一个方法,Area。然后在Main方法中实例化矩形结构的一个对象,调用结构的自定义计算面积的方法来计算矩形面积。最后使用矩形结构的构造函数再次实例化矩形结构的一个对象,并再次调用结构中自定义方法计算矩形面积。

class Test1
{public struct Rect{public double width;public double heigth;public Rect(double x, double y){width = x;heigth = y;}public double Area(){return width * heigth;}}static void Main(string[] args){Rect rect1;rect1.width = 5;rect1.heigth = 3;Console.WriteLine("面积为:" + rect1.Area());Rect rect2 = new Rect(6, 4);Console.WriteLine("面积为:" + rect2.Area());}
}

结果:

面积为:15
面积为:24

面向对象概述

因为结构化语言不适合大规模的软件开发,所以这时候就需要一种开发思想,就是面向对象的开发思想,它将所有预处理的问题抽象为对象,同时了解这些对象具体有哪些相应的属性以及展示这些对象的行。

对象

在面向对象中,算法和数据结构被看作一个整体,称为对象,现实世界中如何类的对象都具有一定的属性和操作。

对象=(算法+数据结构),程序=(对象+对象+...)

面向对象程序的设计思想就是要以对象来思考问题,首先要将现实世界的实体抽象为对象,如何考虑这个对象具备的属性和行为。

类就是一类事物的统称,如果现实世界中的一个事物抽象成对象,类就是这类对象的统称。类是构造对象时所依赖的规范,比如,鸟具有一对翅膀,它可以通过这对翅膀飞行,基本上所有的鸟都具有翅膀这个特性和飞行的技能,这样具有相同特征和行为的一类事物就称为类。

类是世间事物的抽象称呼,对象是这个事物相对应的实体。

在C#中,类中对象的行为是以方法的形式定义的,对象的属性是以成员变量的形式定义的。

面向对象程序有三大特点:

  • 封装

  • 继承

  • 多态

封装

封装就是面向对象编程的核心思想,将对象的属性和行为封装起来,而将它们封装起来的载体就是类,类通常对客户隐藏实现细节,这就是封装的思想。

采用封装的思想保证了类内部数据结构的完整性,应用该类的用户不能轻易直接操作此数据结构,只能执行允许公开的数据。避免了外部对内部数据的影响,提高了程序的可维护性。

继承

继承就是主要利用特定对象之间的共有属性。比如图形可以分为三角形,四边形,圆形等,其中,图形就是父类,那些具体的形状就是子类,是继承了图形这个父类。其中,要注意的是,可以说三角形是图形,但是不能说图形是三角形,等同于,可以说子类的实例都是父类的实例,但是不能说弗雷德实例都是子类的实例。

一个类在继承中,它既可以是其他类的父类,为其他类提供属性和行为,也可以是子类,继承父类的属性和方法。例如三角形是图形类的子类,但是也是等边三角形的父类。

多态

多态是什么?按照我的理解,就是将父类对象应用于子类的特征。还是可以用图形类的例子来举例,比如,一个图形可以进行绘制,那么它的子类也需要绘制的能力,我们就可以在父类写一个绘制方法,将它的子类的对象统一看作是父类的实例对象,他的子类,比如三角形,需要绘制的时候,就可以调用父类的绘制方法。

多态的实现?多态的实现并不是依赖于具体的类,而且依赖于抽象类和接口。比如图形类绘制的方法,我们需要的只是图像类有一个绘制能力,如何被子类去调用,但是具体要绘制什么东西,需要根据调用的子类去决定,所以我们就需要一个模糊的定义,只是要绘制,而不是具体,这就是抽象类。

对于多态来说,接口的使用比抽象类更加方便, 由查询方法组成的集合就是接口。

类是一种数据结构,可以包含数据成员,函数成员,嵌套类型。其中,类支持继承。

类的概念

类是对象概念在面向对象编程语言的反映,是相同对象的集合。它可以把一个对象的各种属性包含在其中,比如,汽车类,可以有颜色,编号,厂家等信息。

类的声明

类修饰符 class 类名
{
}

例子:

public class Car
{public int number;//编号public string color;//颜色public string brand;//厂家
}

构造函数

定义:主要用来对对象进行初始化和回收对象资源。一般对象的生命周期都是由构造函数开始的。构造函数具有与类相同的名称,通常初始化新对象的数据成员。

使用:

class Program
{public int x = 3;public int y = 5;public int z = 0;
​public Program(){z = x + y;}static void Main(string[] args){Program program = new Program();Console.WriteLine(program.z);}
}

结果:

8

其中,构造函数是没有带参数的,叫做”默认构造函数“。

对象的创建及使用

1.对象的创建

对象可以认为是在一类事物中抽象出某一个特例,通过这个特例来处理这类事物出现的问题。可以通过new来创建对象。

语法:

Test test = new Test();
Test test = new Test("a");

其中,参数说明:

Test:类名;test:对象;new:创建对象操作符;”a”:构造函数的参数。

test被创建出来的时候,test对象就是一个对象的引用,在内存中为对象分配了存储空间,可以在构造函数中初始化成员变量,在创建对象时,自动调用构造函数,所以说,初始化和创建是被捆绑在一起的。

2.访问对象属性和行为

通过new操作符创建一个对象后,可以使用“对象.类成员”来获取对象的属性和行为。由于对象的属性和行为在类中是通过类成员变量和方法的形式表示的,所以我们要用对象获取成员的时候,就相应的获取了对象的属性和行为。

例子:

using System.IO.IsolatedStorage;
​
class Progrom
{int i = 47;public void call(){Console.WriteLine("调用call方法");for (i = 0; i < 3; i++){Console.Write(i + " ");if (i==2){Console.WriteLine("\n");}}}public Progrom(){
​}static void Main(string[] arge){Progrom t1 = new Progrom();Progrom t2 = new Progrom();t2.i = 60;Console.WriteLine("第一个实例对象调用变量i的结果" + t1.i++);t1.call();Console.WriteLine("第二个实例对象调用变量i的结果" + t2.i++);t2.call();Console.ReadLine();}
}

结果:

第一个实例对象调用变量i的结果47
调用call方法
0 1 2
​
第二个实例对象调用变量i的结果60
调用call方法
0 1 2

3.对象的引用

引用只是存放一个对象的内存地址,并非是存放一个对象。

4.对象的销毁

每个对象都有生命周期,当生命周期结束时,给该对象分配的内存地址将会被回收,C#可以自动回收,它有一套完整的垃圾回收机制。

其中,会被回收的对象有以下两种情况:

  • 对象引用超过其作用范围

  • 将对象赋值为null

类和对象关系

对象就是一个类的实例。

类是具有相同或相似结构、操作和约束规则的对象组成的集合,对象是某一类的具体化实例,每一个类都是具有某些共同特征的对象的抽象。

类的面向对象特性

类的封装

类可以使数据和方法封装成单一的元素,以便于通过方法来存取数据。

这样有很多好处:

  • 方便维护升级

  • 可以在操作数据的时候多一层判断

  • 可以解决数据存取的权限问题,可以使用封装将数据隐藏起来,根据类的成员使用的不同修饰符来定义它们的访问级别

  • 可以增强安全性和简化编程

class Myclass
{private int x = 0;private int y = 0;//加数public int X{get{return x;}set{x = value;}}public int Y{get{return y;}set{y = value;}}public int Add(){return X + Y;}
​
}
class Program
{static void Main(string[] arge){Myclass myclass = new Myclass();//实例化Myclass的对象myclass.X = 3;myclass.Y = 5;Console.WriteLine(myclass.Add());Console.ReadLine();}
}

结果:

8

类的继承

任何类都可以从另外一个类继承,这个类拥有它继承的类的所有成员,被继承类叫做父类或者基类。但是只支持单继承,不支持多重继承,依次只允许继承一个类,不能继承多个类。继承的基本思想是基于父类的扩展,制定出一个新的子类,子类可以继承父类原有的属性和方法,也可以增加原来父类所不具备的属性和方法,或者直接重写父类的某些方法。例子:

//继承
class MyClass
{private int x = 0;private int y = 0;public int X{get{return x;}set{x = value;}}public int Y{get{return y;}set{y = value;}}public int Add1(){return X + Y;}
}
class MyClass1 : MyClass
{private int z = 0;public int Z{get{return z;}set{z = value;}}public int Add2(){return X + Y + Z;}
}
class Progeam
{static void Main(string[] args){MyClass myclass = new MyClass();MyClass1 myclass1 = new MyClass1();myclass.X = 3;myclass.Y = 5;myclass1.X = 3;myclass1.Y = 5;myclass1.Z = 7;Console.WriteLine(myclass.Add1());Console.WriteLine(myclass1.Add1());Console.WriteLine(myclass1.Add2());
​}
}

结果:

8
8
15

类的多态

多态使子类的实例可以直接赋予父类的变量,然后直接就可以通过这个变量调用子类的方法。比如,需要一个绘制正方形的方法,我们不可以在他的父类(四边形)里面定义一个绘制四边形的方法,再定义一个绘制正方形方法,那就冗余了,可以在四边形定义一个draw()方法,使每个继承四边形类的对象作为draw的参数,然后在draw中做一些限定就可以根据不同图形类对象绘制相应的图形。

例子:

//多态
class Program
{private Program[] qtest = new Program[6];private int nextIndex = 0;public void draw(Program q){if (nextIndex<qtest.Length){qtest[nextIndex] = q;Console.WriteLine(nextIndex);nextIndex++;}}static void Main(string[] args){Program q = new Program();q.draw(new Square());q.draw(new Parallelogramgle());Console.ReadLine();}
}
​
class Parallelogramgle : Program
{public Parallelogramgle(){Console.WriteLine("平行四边形");}
}
​
class Square : Program
{public Square(){Console.WriteLine("正方形");}
}

结果:

正方形
0
平行四边形
1

相关文章:

C#学习,结构,面向对象,类

结构和类 结构是从过程化程序设计中保留下来的一种数据类型&#xff0c;类则是面向对象程序设计中最基本的、也是最重要的概念。 结构 结构是一种值类型&#xff0c;通常用来封装一组相关的变量&#xff0c;结构中可以包含构造函数、变量、字段、方法、属性、运算符、事件和…...

【PHP】文件操作

文章目录 文件编程的必要性目录操作其它目录操作递归遍历目录PHP5常见文件操作函数PHP4常见文件操作函数其他文件操作函数 文件编程的必要性 文件编程指利用PHP代码针对文件&#xff08;文件夹&#xff09;进行增删改查操作。 在实际开发项目中&#xff0c;会有很多内容&…...

科创板50ETF期权交易:详细规则、费用、保证金和开户攻略

科创板50ETF期权是指以科创板50ETF为标的资产的期权合约。科创板50ETF是由交易所推出的一种交易型开放式指数基金&#xff08;ETF&#xff09;&#xff0c;旨在跟踪科创板50指数的表现&#xff0c;下文介绍科创板50ETF期权交易&#xff1a;详细规则、费用、保证金和开户攻略&am…...

怎么把图片放大并且清晰?有详细的方法步骤

怎么把图片放大并且清晰&#xff1f;数字图像处理中的图片放大是许多行业和领域中广泛应用的一项技术。常规的放大方法通过插值或复制像素的方式增加像素数&#xff0c;但这会导致失真和模糊。无损放大是一种特殊的放大方法&#xff0c;它可以通过数学算法来增加图片的尺寸&…...

C++ 构造函数、析构函数调用虚函数

C虚函数是通过虚表实现的&#xff0c;虚函数的地址记录在需表中&#xff0c;只对象完成构造完成后&#xff0c;虚函数的地址才最终确定。 构造函数中调用虚函数 基类先于派生类构造&#xff0c;所以构造时没法调用到派生类的虚函数&#xff0c;也就是说只能调用到自己&#x…...

工业状态监测如何选择合适的无线技术?

工业领域的状态监测在提高生产效率和产品质量方面起着关键作用。过去依赖于预防性维护和例行检查的方式已经不再能满足日益复杂的生产需求&#xff0c;随着工业物联网&#xff08;IIoT&#xff09;的兴起&#xff0c;设备状态监测逐渐成为一种关键策略&#xff0c;催生了预测性…...

Mysql45讲学习笔记

前言&#xff1a;这篇文章主要总结事务&#xff0c;锁、索引的一些知识点&#xff0c;然后分享一下自己学习小心得&#xff0c;我会从点到线在到面展开说说&#xff0c;对于学习任何知识&#xff0c;我们都应该藐其全貌&#xff0c;不要一开始就选入细节 基础 一、基础架构&a…...

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

报错描述 情景一 1Panel在"主机-->进程守护"通过命令"nohup /opt/tomcat/bin/startup.sh > /opt/supersivor/tomcat/nohup.log &"创建守护进程&#xff0c;运行日志如下&#xff1a; #--------------------------------------------------------…...

opencv 水果识别+UI界面识别系统,可训练自定义的水果数据集

目录 一、实现和完整UI视频效果展示 主界面&#xff1a; 测试图片结果界面&#xff1a; 自定义图片结果界面&#xff1a; 二、原理介绍&#xff1a; 图像预处理 HOG特征提取算法 数据准备 SVM支持向量机算法 预测和评估 完整演示视频&#xff1a; 完整代码链接 一、…...

TypeScript数组和对象的操作

TypeScript数组和对象的操作 一、数组的声明二、数组初始化三、数组元素赋值、添加、更改四、删除五、合并、断开数组六、查找数组元素七、连接数组元素八、排序、反序数组九、遍历数组&#xff0c;对象 一、数组的声明 let arr1: Array<number>; let arr2: number[];二…...

docker之Compose与DockerSwarm

目录 Compose 简介 概念 为什么需要&#xff1f; 配置字段 常用命令 安装 1.下载 2.授权 使用 1.创建文件 2.启动 docker Swarm 关键概念 调度策略 spread binpack random 特性 集群部署 1.准备 2.创建swarm并添加节点 在主服务器上创建swarm集群 节点…...

VS Code 使用 clang++ 编译,使用 cppvsdbg 或 lldb 调试的配置方法

需要安装的 VS Code LLVM VS Code 需要安装的插件&#xff1a; C/C&#xff08;用来配置 c_cpp_properties.json&#xff09; CodeLLDB&#xff08;如果你要用 lldb 调试&#xff0c;那么这个插件就需要安装&#xff0c;用来连接到 lldb 调试器&#xff09; 流程 我们都…...

android11,12 Launcher3编译什么

1首先看看手机里的是什么 adb shell pm path com.android.launcher3 package:/system_ext/priv-app/Launcher3QuickStep/Launcher3QuickStep.apk 然后就编译Launcher3QuickStep 2push apk 没什么说的&#xff0c;push到对应的文件夹 /system_ext/priv-app/Launcher3Quick…...

Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结

Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结。 01 前言 在使用 Go 语言进行 Web 开发时&#xff0c;我们往往会选择一些优秀的库来简化 HTTP 请求的处理。其中&#xff0c;go-resty 是一个被广泛使用的 HTTP 客户端。…...

【C语言】#define 宏定义初步使用

使用宏定义可以防止出错&#xff0c;提高可移植性&#xff0c;可读性&#xff0c;方便性等。 下面列举了一些成熟软件中常用的宏定义。 重新定义一些基本类型 重新定义一些类型&#xff0c;防止由于各种平台和编译器的不同&#xff0c;而产生的类型字节数差异&#xff0c;方便…...

项目里面怎么解决跨域的?

一.前端配置跨域 proxy解决跨域 在vue.config.js中通过proxy devServer中配置反向代理。 devServer: {port: port,open: true,overlay: {warnings: false,errors: true},// 配置反向代理proxy: {// 当地址中有/api的时候会触发代理机制/api: {target: http://ihrm-java.ithe…...

Oracle 批量导出表注释和主键

–查询分表&#xff08;目前分了16张表&#xff09; –先查询注释为空的表&#xff0c;也就是11表做示例&#xff0c;统计出来以后11批量修改成1 select owner,column_name,comments,table_name from all_col_comments a where a.table_name like ‘TB%1’ and a.comments is n…...

Linux C++ 海康摄像头获取过车信息

代码 void CALLBACK MessageCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void *pUser) {printf("enter MessageCallback---------------------->\n");int i;NET_DVR_ALARMINFO_V30 struAlarmInfo;memcpy(&struAl…...

iOS逆向:越狱及相关概念的介绍

在上一篇内容中我们介绍了App脱壳的技术&#xff0c;今天我们来介绍一个和iOS逆向密切相关的知识&#xff1a;越狱。 iOS操作系统的封闭性一直是开发者们关注的焦点之一。为了突破Apple的限制&#xff0c;越狱技术应运而生。本文将深入探讨iOS越狱&#xff0c;包括可越狱的版本…...

SQL语法与DDL语句的使用

文章目录 前言一、SQL通用语法二、DDL语句1、DDL功能介绍2、DDL语句对数据库操作&#xff08;1&#xff09;查询所有数据库&#xff08;2&#xff09;查询当前数据库&#xff08;3&#xff09;创建数据库&#xff08;4&#xff09;删除数据库&#xff08;5&#xff09;切换数据…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...

iOS 项目怎么构建稳定性保障机制?一次系统性防错经验分享(含 KeyMob 工具应用)

崩溃、内存飙升、后台任务未释放、页面卡顿、日志丢失——稳定性问题&#xff0c;不一定会立刻崩&#xff0c;但一旦积累&#xff0c;就是“上线后救不回来的代价”。 稳定性保障不是某个工具的功能&#xff0c;而是一套贯穿开发、测试、上线全流程的“观测分析防范”机制。 …...

LINUX编译vlc

下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总&#xff08;最简化&#xff09;_底部的附件列表中】: ffmpeg - lzip…...