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,同样是静态成员。静态成员函数只能访问静态变量,如果试图在其中使用其它成员变量,程序同样会报错。静态函数在对象被创建之前就已经存在。

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

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

相关文章

基于低代码的管理系统模板库的设计与实现

近年来,随着企业管理需求的不断增长,传统的软件开发方式显得过于繁琐,低代码开发平台应运而生。本文基于低代码开发理念,探讨了管理系统模板库的设计与实现,旨在提高开发效率、降低系统维护成本,并使管理系…

EXCEL VBA调用百度API翻译

EXCEL VBA调用百度API翻译 Public Function translateZh_En(ByVal str As String) As String调用百度翻译API,将指定内容由中文翻译为英文Dim par As StringDim data() As Stringpar generateReqStr(str, "zh", "en")data() translateJson(g…

正则表达式与文本三剑客

目录 一、正则表达式 1. 定义 2. 字符匹配 3. 重复限定符 4. 位置锚点 5. 分组和引用 6. 扩展正则表达式 二、文本三剑客 1. grep 1.1 定义 1.2 语法 1.3 选项 1.4 示例 2. sed 2.1 定义 2.2 通式 2.3 选项 2.4 脚本格式(脚本语法) 2.…

【Unity3D小功能】Unity3D中Text使用超链接并绑定点击事件

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中遇到了要给Text加超链接的需求,研究了实现…

什么样的评论更容易得到别人的关注

要发表吸引人的评论,可以注意这些个方面: 合适的软件:用DT浏览器的笔记本写文本,保存为图片,用图片的方式评论更容易得到别人的关注。 特别的观点:发表与众不同的观点,或者从不同的角度看待问…

USACO 1月比赛 铜组题解

比赛链接:http://usaco.org/ 第一题:MAJORITY OPINION 标签:思维、模拟题意:给定一个长度为 n n n的序列 a a a,操作:若区间 [ i , j ] [i,j] [i,j]内某个数字 k k k出现的次数 大于区间长度的一半&#…

已解决解决java.util.concurrent.BrokenBarrierException异常的正确解决方法,亲测有效!!!

已解决解决java.util.concurrent.BrokenBarrierException异常的正确解决方法,亲测有效!!! 目录 问题分析 报错原因 解决思路 解决方法 总结 在并发编程中,CyclicBarrier是Java提供的一个同步辅助工具类&#xff…

WiFi基础知识介绍(超详细)

1.WiFi专业名词概念 AP(Access Point):无线接入点:这个概念特别广,在这里,用大白话说,你可以把CC3200当做一个无线路由器,这个路由器的特点不能插入网线,没有接入Internet,只能等待其他设备的链…

C语言中的数组操作技巧:提升程序的效率和可读性

1. 概念 数组是C语言中常见且重要的数据结构,在许多应用中都被广泛使用。合理地处理数组操作可以提高程序的效率和可读性。本文将介绍C语言中常用的数组操作方法和技巧,帮助读者优化数组操作并提升程序效果。 2.常用的数组操作方法 2.1 数组的初始化 C…

canvas自定义扩展方法:文字自动换行

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

hyperf 二十四 模型缓存

教程:Hyperf 一 安装及配置 1.1 安装 目前仅支持redis。 composer require hyperf/model-cache 1.2 配置 配置位置:config/autoload/databases.php 配置类型默认值备注handlerstringHyperf\ModelCache\Handler\RedisHandler::class无cache_keystri…

python时间格式数据处理。

由于编码和格式问题,有时候从read_csv或者read_excel读取到的时间类型是不确定的。 1.字符串转datetime.datetime时间格式 如果是字符串string类型,则可以使用: df[PDATE] pd.to_datetime(df[PDATE]).dt.date 转换为date格式&#xff0c…

开发安全之:Header Manipulation

Overview 方法 echo_json() 包含未验证的数据, 这会招致各种形式的攻击,包括:cache-poisoning、cross-site scripting、cross-user defacement、page hijacking、cookie manipulation 或 open redirect。 Details 以下情况中会出现 Header …

Websocket基本用法

1.Websocket介绍 WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 应用场景: 视频弹幕网页聊天体育实况更新股票基金…

基于OpenCV的高压电力检测项目案例

一、项目背景与目标 随着高压电力设施的日益增多,传统的巡检方式已无法满足现代电力系统的需求。为此,我们决定利用计算机视觉技术,特别是OpenCV库,开发一个高压电力检测系统。目标是实现自动化、高精度的电力设备检测&#xff0c…

P1228 地毯填补问题(葬送的芙蓉王【bushi】)

地毯填补问题 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地…

【零基础学习CAPL】——CAN报文的发送(配合Panel面板单次发送)

🙋‍♂️【零基础学习CAPL】系列💁‍♂️点击跳转 文章目录 1.概述2.面板创建2.1.新建一个Panel2.2. 在Panel中调出控件窗口2.3.控件添加与配置3.系统变量创建4.系统变量与Panel绑定5.CAPL脚本实现6.效果1.概述 使用场景,按下面板按钮同时发送报文。 本章主要介绍 CAPL脚…

Redis -- String 字符串, 计数命令,字符串操作

"学如逆水行舟,不进则退。" 目录 Redis的String字符串 常见命令 set get mget mset setnx setex psetex 计数命令 incr incrby decr decrby incrbyfloat 字符串操作 append getrange setrange strlen 小结 string内部编码 Redis…

文生图提示词:自然景观

场景描述 --自然景观 Natural Landscapes 涵盖了多种自然景观,可以用于精确地表达 AI 生成图像中所需的自然环境。 Mountain 山脉 River 河流 Forest 森林 Beach 海滩 Ocean 海洋 Lake 湖泊 Waterfall 瀑布 Desert 沙漠 Valley 山谷 Meadow 草地 Glacier 冰川 Cliff…

分布式系统唯一ID方案

分布式系统唯一ID方案 一、引言 在当今数字化时代,分布式系统的发展势不可挡,从云服务到微服务架构,都凸显了分布式系统在构建大规模、高效的应用中的重要性。而在这个庞大而复杂的系统中,唯一ID的生成和管理变得至关重要。唯一…