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

C#学习笔记_类(Class)

类的定义

类的定义是以关键字 class 开始,后跟类的名称。类的主体,包含在一对花括号内。

语法格式如下:

访问标识符 class 类名
{//变量定义访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;......//方法定义访问标识符 返回数据类型 函数名(参数数据类型 参数名){//函数代码}访问标识符 返回数据类型 函数名(参数数据类型 参数名){//函数代码}访问标识符 返回数据类型 函数名(参数数据类型 参数名){//函数代码}......
}

请注意:

  • 访问标识符指定了对类及其成员的访问规则。如果没有指定,则使用默认的访问标识符。类的默认访问标识符是 internal,成员的默认访问标识符是 private。
  • 参数数据类型指定了函数参数数据类型,返回数据类型指定了返回的方法返回的数据类型。
  • 如果要访问类的成员,你要使用点(.)运算符。
  • 点运算符链接了对象的名称和成员的名称。

例如下面的实例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace code
{class Apple{int size;public Apple(){this.size = -1;}public Apple(int size){this.size = size;}public void sizeSet(int size){this.size = size;}public void sizeGet(){if (this.size != -1)Console.WriteLine("苹果大小为" + this.size);elseConsole.WriteLine("这个苹果未获取大小");}}public class code{public static void Main(string[] args){Apple a = new Apple(50);Apple b = new Apple();a.sizeGet();b.sizeGet();b.sizeSet(60);b.sizeGet();Console.ReadKey();}}
}

代码中使用Apple类定义苹果,苹果有变量size表示大小。Apple类中的方法,sizeGet用于输出苹果大小,sizeSet用于修改苹果大小。在下面Main函数中,a初始化为大小为50的苹果,b初始化为未确定打小的苹果,之后输出两者大小,b苹果改变大小后,输出更新后的b苹果大小。以下是输出结果:

苹果大小为50
这个苹果未获取大小
苹果大小为60

类的成员

类的成员函数是一个在类定义中有它的定义或原型的函数,就像其他变量一样。作为类的一个成员,它能在类的任何对象上操作,且能访问该对象的类的所有成员。例如上面,函数sizeGet、sizeSet等,均是Apple类的成员函数。

成员变量是对象的属性(从设计角度),一般它们保持私有来实现封装。这些变量只能使用公共成员函数来访问。上面size即为Apple类的成员变量。

构造函数

构造函数是一类特殊的成员函数,当创建类的新对象时执行。构造函数的名称与类的名称完全相同,它没有任何返回类型。

默认的构造函数没有任何参数。但是如果你需要一个带有参数的构造函数可以有参数,这种构造函数叫做参数化构造函数。这种技术可以帮助你在创建对象的同时给对象赋初始值。上面Apple类中,就包括默认构造函数与参数化构造函数。一般为了代码泛用性,类里面都会编写默认构造函数。

在上面,创建Apple对象a、b时,有如下语句:

Apple a = new Apple(50);
Apple b = new Apple();

这里即为对象实例化。两个语句均使用了new关键字,new关键字即实例化的意思,new Apple()就是使用构造函数创建出一个具体的Apple对象。 

析构函数

类的析构函数是类的一个特殊的成员函数,当类的对象超出范围时执行。

析构函数的名称是在类的名称前加上一个波浪形(~)作为前缀,它不返回值,也不带任何参数。析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源。析构函数不能继承或重载。在上面的例子中不包含析构函数,现在为该实例添加析构函数:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace code
{class Apple{int size;public Apple(){this.size = -1;}public Apple(int size){this.size = size;}~Apple()    //添加的析构函数{Console.WriteLine("大小为{0}的苹果被吃掉了", size);}public void sizeSet(int size){this.size = size;}public void sizeGet(){if (this.size != -1)Console.WriteLine("苹果大小为" + this.size);elseConsole.WriteLine("这个苹果未获取大小");}}public class code{public static void Main(string[] args){Apple a = new Apple(50);Apple b = new Apple();a.sizeGet();b.sizeGet();b.sizeSet(60);b.sizeGet();Console.ReadKey();}}
}

程序执行结束后,输出:

苹果大小为50
这个苹果未获取大小
苹果大小为60

大小为60的苹果被吃掉了

大小为50的苹果被吃掉了 

在程序执行结束时,会调用析构函数释放对象占用的资源,可见程序最后输出内容,析构函数已调用。

访问修饰符

访问修饰符标记所修饰内容保护级别。常见的访问修饰符有public、private、protected、internal。访问修饰符可以修饰类,也可以修饰成员。

public

public表示所修饰的内容是公共的,访问不受限制,所有项目中代码均可以访问。

例如上面实例中,Apple类成员函数均为public,此时主函数使用Apple类中public修饰的成员函数均不会报错。

    public class code{public static void Main(string[] args){Apple a = new Apple(50);Apple b = new Apple();a.sizeGet();    //成员函数为public类型,可以直接访问b.sizeGet();b.sizeSet(60);b.sizeGet();Console.ReadKey();}}

internal

internal所修饰的类,将限制为内部类,即只有当前项目中的代码才能访问它。internal用法如下所示:

namespace J3
{//使用internal修饰为内部类internal class Person{string name;int age;public Person(){name = "Jackie";age = 20;}public void saying() {Console.WriteLine("my name is "+name+", my age is "+age);}}public class myCaller {public static void Main(string[] args) {Person p = new Person();p.saying();}}
}

由于两个类在同一命名空间,myCaller可以调用并实例化Person类。需要注意,class类默认为internal,如果需要使用特定的访问权限,需要对其修饰。

private

关键字private将修饰的内容访问限制为私有的。class类中成员默认为private,例如上面的实例,Apple类中成员size即默认private。private修饰的内容只能通过成员函数访问,例如其中的构造函数Apple。如果再Main函数中试图直接访问size,则会:

如图可见,程序报错无法编译。因为size受private修饰,此时无法被直接访问。

protected

protected修饰内容与private基本相似。但当两个类存在继承关系的时候,例如类A继承于类B,那么对于类B则可访问protected修饰的类成员,而不可访问private修饰的类成员。继承将在之后实训学习,此处仅给出一个实例。

namespace J3
{class Person{//使用protected修饰protected string skinColor;public void saying() {Console.WriteLine("my skin color is " + skinColor);}}//WhitePerson类继承Person类class WhitePerson : Person {static void Main(string[] args){WhitePerson wp = new WhitePerson();wp.skinColor = "White";wp.saying();}}
}

输出结果为:

my skin color is White

static静态成员

当我们声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个该静态成员的副本。例如上面的Apple对象,添加苹果数量num成员:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace code
{class Apple{int size;static int num=0;    //添加的静态成员numpublic Apple(){this.size = -1;num += 1;    //构造对象的时候,苹果数量+1}public Apple(int size){this.size = size;num += 1;    //构造对象的时候,苹果数量+1}~Apple(){Console.WriteLine("大小为{0}的苹果被吃掉了", size);num -= 1;    //析构对象的时候,苹果数量-1}public void sizeSet(int size){this.size = size;}public void sizeGet(){if (this.size != -1)Console.WriteLine("有{0}个苹果,这个苹果大小为{1}" ,num, this.size);elseConsole.WriteLine("这个苹果未获取大小");}public static void numGet()    //静态成员函数,只能访问Apple类中静态成员变量{Console.WriteLine("当前苹果数量为{0}", num);}}public class code{public static void Main(string[] args){Apple a = new Apple(50);a.sizeGet();Apple b = new Apple();b.sizeGet();b.sizeSet(60);b.sizeGet();Apple.numGet();    //调用静态成员函数Console.ReadKey();}}
}

输出结果:

有1个苹果,这个苹果大小为50
这个苹果未获取大小
有2个苹果,这个苹果大小为60
当前苹果数量为2

大小为60的苹果被吃掉了

大小为50的苹果被吃掉了

代码中可见,静态成员变量需要设定初始值,本实例中静态成员num表示苹果数量,因此初始苹果数量为0。每次创建Apple类对象,苹果数+1,而释放空间时苹果数-1。在程序中,所有对象共用一个num成员变量,因此实际上苹果数改动在不同对向上的操作都会被继承。

此外,其中的成员函数numGet,同样是静态成员。静态成员函数只能访问静态变量,如果试图在其中使用其它成员变量,程序同样会报错。静态函数在对象被创建之前就已经存在。

相关文章:

C#学习笔记_类(Class)

类的定义 类的定义是以关键字 class 开始,后跟类的名称。类的主体,包含在一对花括号内。 语法格式如下: 访问标识符 class 类名 {//变量定义访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;......//方…...

壹[1],Xamarin开发环境配置

1,环境 VS2022 注: 1,本来计划使用AndroidStudio,但是也是一堆莫名的配置让人搞得很神伤,还是回归C#。 2,MAUI操作类似,但是很多错误解来解去,且调试起来很卡。 3,最…...

SAM:基于 prompt 的通用图像分割模型

Paper: Kirillov A, Mintun E, Ravi N, et al. Segment anything[J]. arXiv preprint arXiv:2304.02643, 2023. Introduction: https://segment-anything.com/ Code: https://github.com/facebookresearch/segment-anything SAM 是 Meta AI 开发的一款基于 prompt 的通用视觉大…...

2024美赛数学建模C题思路+模型+代码+论文

2024美赛A-F题思路代码模型论文:2.2开赛第一时间更新,获取见文末名片 美赛流程以及经验分享 今天主要和大家分享一下我之前参加美赛的经验,主要分两部分来讲。一部分是美赛流程,另一部分是美赛经验。 一 美赛流程 比赛前&#x…...

npm run serve和npm run dev的区别

1. 功能:通常,"npm run serve"用于启动开发服务器,提供实时的开发环境,支持自动重新加载和热模块替换。这样可以在开发过程中实时查看代码更改的效果。而"npm run dev"可以是一个自定义的指令,用于…...

已解决:winform开发中删除某方法导致窗体设计报错

一、报错截图 二、解决方案 第一步,点击上图的转到代码 第二步,注释掉报错的部分(代码前面加//) 第三步,重新编译 最后,恢复正常...

开源软件的影响力

开源软件如何推动技术创新 开源软件通过开放源代码,为全球开发者提供了共同的平台,促进了协作、交流,并推动了软件技术的创新和发展。以下是一些关键方面的分析: 透明度与信任: 开源软件的源代码是公开可见的,这种透明度带来了更高水平的信任。开发者和用户能够审查代码,…...

postgresql lc_ctype不同值之间的转换

LC_CTYPE 用于决定字元是否为数字,字母,空格,标点符号,及大小写等[1]。将 LC_CTYPE 设为「C」表示 isupper(c) 或 tolower(c) 等 C 语言函数[2]仅针对 US-ASCII 范围内的字元给出预期结果。因为像 upper()、lower() 或 initcap 这类型的Postgres SQL 语句是在libc 函数上实…...

纸盒生产ERP软件怎么样?常用纸盒生产ERP系统有哪几种

市场上的纸盒种类繁多,这些差异化的商品对应多元化的销售渠道和营销策略,日常的经营管理工作较为繁琐。而纸盒生产涉及原材料、发料、车间、工时评估、排产、质检、委外、工单等诸多流程,想要随时掌握各环节进度,及时处理存在的问…...

2024年重庆市考报名照上传失败的原因

2024年重庆市考报名照需要根据以下要求生成: 1、近期6个月,免冠证件照。 2、照片背景白底或者蓝底或者红底背景。 3、照片文件jpg格式,大小在20KB以下 4、照片像素大小,295*413像素 5、照片必须使用审核工具审核后才能上传...

2023年出版的新书中提到的《人月神话》(202402更新)(1)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《人月神话》于1975年出版,1995年出二十周年版。自出版以来,该书被大量的书籍和文章引用,直到现在热潮不退。 2023年,清华大学出版社推…...

gtkmm xml ui 例子(from string)

文章目录 前言来看一个从字符串中生成UI的例子 前言 glade生成的xml格式不被gtkmm4支持, 需要作修改 来看一个从字符串中生成UI的例子 #include <gtkmm/application.h> #include <gtkmm.h> #include <iostream> using namespace std;class ExampleWindow :…...

第2章 Linux 中执行命令

第2章 Linux 中执行命令 命令格式 命令 [选项] [参数....] 在linux 中命令分为内部命令和外部命令。 ctrll 可以清屏 查看帮助的命令 在使用命令之前&#xff0c;我们可以通过帮助来查看这个命令的格式和使用方式。在 Linux 中有两个帮助命令&#xff0c; help 和 man help…...

python3.8 安装缺少ssl、_ctypes模块解决办法

问题 安装pyhton3.8安装默认不依赖ssl 运行Flask项目时报错&#xff1a; Traceback (most recent call last):File "/usr/local/python3/bin/flask", line 8, in <module>sys.exit(main())File "/usr/local/python3/lib/python3.8/site-packages/flask…...

鸿蒙开发-UI-页面路由

鸿蒙开发-UI-组件 鸿蒙开发-UI-组件2 鸿蒙开发-UI-组件3 鸿蒙开发-UI-气泡/菜单 文章目录 一、基本概念 二、页面跳转 1.router基本概念 2.使用场景 3.页面跳转参数传递 三、页面返回 1.普通页面返回 2.页面返回前增加一个询问框 1.系统默认询问框 2.自定义询问框 总…...

【Git】多个托管平台Git账户配置

目录 多个托管平台GIt账户如何配置SSH 路由配置验证 用户名邮箱配置验证 多个托管平台GIt账户如何配置 通常情况&#xff0c;公司会搭建自己的gitlab代码托管服务或者将代码托管到第三方平台上&#xff0c;而我们自己的开源项目通常托管到Github上&#xff0c;每个托管平台都有…...

vue2 图片懒加载vue-lazyload 插件

1、npm install vue-lazyload --save 2、在项目的主文件&#xff08;例如 main.js&#xff09;中引入和使用插件&#xff1a; import Vue from vue import VueLazyload from vue-lazyloadVue.use(VueLazyload) 3、现在&#xff0c;你可以在需要懒加载图片的组件中使用 v-laz…...

element-ui button 组件源码分享

element-ui button 源码分享&#xff0c;基于对源码的理解&#xff0c;编写一个简单的 demo&#xff0c;主要分三个模块来分享&#xff1a; 一、button 组件的方法。 1.1 在方法这块&#xff0c;button 组件内部通过暴露 click 方法实现&#xff0c;具体如下&#xff1a; 二、…...

Spring实现事务(一)

Spring事务 .什么是事务事务的操作Spring中事务的实现准备工作创建表创建项目,引入Spring Web, Mybatis, mysql等依赖配置文件实体类 编程式事务(手动写代码操作事务)声明式事务(利用注解自动开启和提交事务) . 什么是事务 事务是⼀组操作的集合, 是⼀个不可分割的操作 在我们…...

获取依赖aar包的两种方式-在android studio里引入 如:glide

背景&#xff1a;我需要获取aar依赖到内网开发&#xff0c;内网几乎代表没网。 一、 如何需要获取依赖aar包 方式一&#xff1a;在官方的github中下载,耗时不建议 要从开发者网站、GitHub 存储库或其他来源获取 ‘com.github.bumptech.glide:glide:4.12.0’ AAR 包&#xff…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...