当前位置: 首页 > 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;切换数据…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制&#xff0c;重点解析"道作为序位生成器"的核心原理与实现框架&#xff1a; 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...

在Spring Boot中集成RabbitMQ的完整指南

前言 在现代微服务架构中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件&#xff0c;支持多种消息协议&#xff0c;具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...