【从零开始入门unity游戏开发之——C#篇17】C#面向对象的封装——类(Class)和对象、成员变量和访问修饰符、成员方法

news2024/12/19 5:36:37

文章目录

  • 一、类和对象
    • 1、什么是类和对象?
    • 2、例子说明
      • 2.1 例子1:
        • (1) **类的定义:**
        • (2) **创建对象:**
        • (3) **类和对象的关系:**
      • 2.2 例子2:
        • **类的比喻:**
        • **对象的比喻:**
        • 代码实例:
    • 3、总结:
  • 二、成员变量(字段)和访问修饰符
    • 1、成员变量(字段)
      • 什么是成员变量?
      • 成员变量语法结构
      • 示例:
      • 成员变量默认值
      • 成员变量的访问
    • 2、访问修饰符
      • 2.1 几种访问修饰符
        • (1) `public`
        • (2) `private`
        • (3) `protected`
        • (4) `internal`
        • (5) `protected internal`
        • (6) `private protected`
      • 2.2 默认访问修饰符
      • 2.3 访问修饰符的总结:
      • 2.4 访问修饰符总结
    • 3、普通变量
  • 三、成员变量和普通变量
    • 1、**成员变量**(Field)
      • 示例:成员变量
    • 2、**普通变量**(Local Variable)
      • 示例:普通变量
    • 3、**成员变量与普通变量的关系与区别**
    • 4、总结:
  • 四、成员方法
    • 定义简单的成员方法
  • 专栏推荐
  • 完结

一、类和对象

类和之前学的结构体类似

1、什么是类和对象?

在 C# 中,类(Class)是一个模板或者蓝图,用来描述一种事物的属性和行为。而对象(Object)是根据类创建出来的具体实例。你可以把想象成一个设计图,而对象则是根据这个设计图建造出来的具体物品

2、例子说明

2.1 例子1:

假设你有一个“”的类。这个类可以包含“车”的一些属性(比如颜色、品牌)和行为(比如启动、刹车)。但这只是设计图,你没有实际的车。然后,你可以根据这个设计图制造具体的汽车(对象),例如一辆红色的奔驰车,一辆黑色的宝马车,等等。

(1) 类的定义:

你可以这样定义一个“车”的类:

class Car
{
    // 类定义的内容
}

这个类是一个模板,但它没有包含任何具体的属性或者行为,只是一个空的框架。

(2) 创建对象:

假设你想根据这个“车”类创建一辆具体的车,比如红色的奔驰。你就可以通过类来实例化一个对象:

Car myCar = new Car();

这里,myCar 就是一个对象,它是根据 Car 类创建的实例。通过 new 关键字,C# 会在内存中创建一个 Car 类的实例。

(3) 类和对象的关系:
  • Car 是类,是一种“抽象的东西”。
  • myCar 是对象,是一个“具体的东西”,它实际存在。

2.2 例子2:

类的比喻:

假设你设计了一个“人”的类(Person)。这个类会告诉你一个人应该有什么样的属性(例如姓名、年龄),应该做什么样的事(例如走路、吃饭)。但是“人”这个类本身,并不代表任何具体的人。

对象的比喻:

你根据这个“人”类,创建了一个叫做“张三”的对象。这个张三有自己的名字、年龄等具体信息。

代码实例:

假设我们有一个简单的类 Person,它描述了一个人的基本属性:

class Person
{
    public string Name;
    public int Age;
}

这个 Person 类是一个模板,描述了所有人的共有属性:姓名(Name)和年龄(Age)。但它并没有表示任何具体的“人”。

然后,你可以使用这个模板创建具体的人对象:

Person person1 = new Person();
person1.Name = "张三";
person1.Age = 25;

Person person2 = new Person();
person2.Name = "李四";
person2.Age = 30;

在上面的代码中:

  • person1person2 是两个对象,它们是根据 Person 类创建的实例。
  • person1 代表一个具体的人(张三),有姓名和年龄。
  • person2 代表另一个具体的人(李四),也有姓名和年龄。

3、总结:

  • 是一个模板或者蓝图,用来描述事物的属性和行为。
  • 对象 是根据类创建出来的具体实例,实际存在。

类是用来描述事物的一般特征和行为,而对象是类的具体体现。


二、成员变量(字段)和访问修饰符

成员变量(字段)和之前学的变量类似

1、成员变量(字段)

什么是成员变量?

成员变量是类(class)结构体(struct)中的变量,它用于存储对象的状态信息。成员变量是类或结构体的一部分,它定义了对象的属性。每个类或结构体的实例(对象)都有自己的成员变量,可以通过实例来访问或修改这些成员变量。

在 C# 中,成员变量通常是在类或结构体内部声明的,但位于方法外部。成员变量可以具有不同的访问修饰符,如 private、public、protected 等,用来控制其访问权限。

成员变量语法结构

[访问修饰符] 变量类型 变量名;

示例:

public class Person
{
    // 成员变量
    public string Name; // 姓名
    public int Age;     // 年龄
}

在这个例子中,Name 和 Age 是 Person 类的成员变量。

成员变量默认值

当你在定义成员变量时,可以直接为它赋一个默认值。如果成员变量没有显式赋值,则会使用类型的默认值:

  • 值类型(如 int、float) 的默认值是零(0)。
  • 引用类型(如 string、object) 的默认值是 null。
public class Person
{
    // 成员变量并赋予默认值
    public string Name = "小明";  // 默认值为 "小明"
    public int Age = 18;         // 默认值为 18
}

成员变量的访问

成员变量的访问通常是通过类的实例来进行的

比如

public class Person
{
    // 成员变量并赋予默认值
    public string Name = "小明";  // 默认值为 "小明"
    public int Age = 18;         // 默认值为 18
}

class Program
{
    static void Main()
    {
        // 创建 Person 类的实例
        Person person = new Person();
        
        // 输出对象的默认成员变量值
        Console.WriteLine(person.Name);  // 输出: 小明
        Console.WriteLine(person.Age);   // 输出: 18
    }
}

2、访问修饰符

访问修饰符用于定义类成员的可访问范围。在 C# 中,主要有以下几种访问修饰符:

2.1 几种访问修饰符

(1) public
  • 含义:公开的,可以被任何类或方法访问。
  • 用途:适用于希望任何地方都能访问的成员。
  • 示例
public class Car
{
    public string Make; // 公开字段
}
(2) private
  • 含义:私有的,只有类内部的成员(方法或构造函数)可以访问。
  • 用途:通常用来保护数据,避免外部直接修改。
  • 示例
public class Car
{
    private int year; // 私有字段,不能在类外访问
}
(3) protected
  • 含义:受保护的,可以在当前类及其派生类(子类)中访问。
  • 用途:当希望子类能够访问父类的成员时使用。
  • 示例
public class Car
{
    protected string model; // 受保护字段,可以在子类中访问
}
(4) internal
  • 含义:内部的,只能在当前程序集中访问。类外的代码无法访问,但在同一个程序集中可以访问。
  • 用途:适用于希望在当前程序集中共享成员,但不希望该成员被外部应用程序访问的情况。
  • 示例
public class Car
{
    internal string LicensePlate; // 仅在同一程序集中可访问
}
(5) protected internal
  • 含义:受保护的内部成员,可以在当前程序集中或派生类中访问。
  • 用途:适用于希望派生类和当前程序集中的任何类都能访问成员,但外部程序集无法访问该成员的情况。
  • 示例
public class Car
{
    protected internal string EngineNumber; // 派生类和同一程序集中的类可以访问
}
(6) private protected
  • 含义:私有且受保护的成员,只能在当前类及其派生类(同一程序集中)中访问,其他地方无法访问。
  • 用途:适用于希望成员只在当前类和派生类中访问,同时又不希望其他类访问的场景。
  • 示例
public class Car
{
    private protected string Vin; // 仅在当前类和派生类中可访问
}

2.2 默认访问修饰符

  • 类成员(字段、方法等):如果没有明确指定访问修饰符,字段和方法默认是 private(对于类成员变量)和 private(对于方法),这意味着只能在类内部访问。

  • 类本身:如果没有明确指定,类默认是 internal 的,意味着类只能在同一程序集内访问。

2.3 访问修饰符的总结:

修饰符含义访问范围
public公开,所有地方都可以访问类外和类内都可以访问
private私有,类外不能访问只能在定义它的类中访问
protected受保护,子类可以访问当前类和派生类中访问
internal内部,仅在同一程序集内可以访问同一程序集中可访问,其他程序集无法访问
protected internal受保护且内部,子类和同一程序集中的类可以访问当前类、派生类和同一程序集中的类可以访问
private protected私有且受保护,只能在当前类及派生类(同一程序集)访问当前类和同一程序集中的派生类可以访问,其他类无法访问

2.4 访问修饰符总结

  • public 是最宽松的访问修饰符,任何类都可以访问被标记为 public 的成员。
  • private 是最严格的访问修饰符,限制该成员只能在当前类内部访问。
  • protectedprivate protected 都允许子类访问,但 private protected 限制访问范围仅限于同一程序集中的子类。
  • internal 适用于将成员限定在同一程序集中访问,适合库开发中保护某些成员不被外部访问。

3、普通变量

普通变量是定义在方法内部的变量,用于存储方法中的临时数据。它们只在方法执行时存在,方法执行结束时就会被销毁。普通变量的作用域仅限于方法内部。

  • 位置:普通变量通常定义在方法体内部。
  • 生命周期:普通变量的生命周期仅限于方法调用时。在方法调用结束后,普通变量会被销毁。
  • 作用范围:普通变量只能在其定义的代码块中访问,方法外部无法访问。

三、成员变量和普通变量

1、成员变量(Field)

成员变量是定义在类或结构体中的变量,用于表示类或结构体的状态。它属于类或结构体的实例(对象),或者在某些情况下属于类本身。成员变量可以用来存储类或结构体的数据。

  • 位置:成员变量通常位于类的定义内部,但不在方法内。它们是类或结构体的一部分。
  • 作用范围:成员变量的生命周期与类或对象的生命周期相同。它们在类的实例化时创建,在类的实例销毁时销毁。
  • 修饰符:成员变量可以使用访问修饰符(如 privatepublicprotectedinternal 等)来定义其访问权限。

示例:成员变量

public class Car
{
    // 这是一个成员变量
    public string make;  // 汽车品牌
    public string model; // 汽车型号
    private int year;    // 汽车生产年份,私有成员变量
}

在上面的示例中,makemodelCar 类的公共成员变量,而 year 是私有成员变量。

2、普通变量(Local Variable)

普通变量是定义在方法内部的变量,用于存储方法中的临时数据。它们只在方法执行时存在,方法执行结束时就会被销毁。普通变量的作用域仅限于方法内部。

  • 位置:普通变量通常定义在方法体内部。
  • 生命周期:普通变量的生命周期仅限于方法调用时。在方法调用结束后,普通变量会被销毁。
  • 作用范围:普通变量只能在其定义的代码块中访问,方法外部无法访问。

示例:普通变量

public class Car
{
    public void Drive()
    {
        // 这是一个普通变量
        int speed = 60;  // 当前速度,只有在 Drive 方法中有效
        Console.WriteLine("The car is driving at " + speed + " km/h.");
    }
}

在上面的示例中,speedDrive 方法中的普通变量,方法结束后 speed 变量将不再存在。

3、成员变量与普通变量的关系与区别

特性成员变量普通变量
定义位置类或结构体中(方法外部)方法内部
生命周期与类或结构体的实例相关,通常在对象生命周期内有效仅在方法调用时有效,方法结束即销毁
作用范围类的实例范围内(或类范围内)方法内部
访问权限可以使用访问修饰符来控制(如 private, public, 等)通常不受访问修饰符控制
初始化通常会在类实例化时初始化,除非有默认值必须在方法中初始化后使用
存储位置存储在堆中(对象实例),或者静态字段存储在类的静态区域存储在栈中

4、总结:

  • 成员变量是属于类或结构体的变量,定义在类体内,用来描述类的状态或特征。
  • 普通变量是定义在方法中的变量,仅在方法调用期间有效,用来存储临时数据。
  • 两者的生命周期、作用范围、访问权限等有显著差异。

四、成员方法

在 C# 中,成员方法(或称为类方法)是定义在类内部的方法,用于执行类的某些操作或提供类的功能。成员方法可以访问类的成员变量,并且可以被类的实例调用。方法有时会有输入参数、返回类型以及访问修饰符,用来控制访问权限。

定义简单的成员方法

成员方法通常是在类或结构体内部定义的。方法定义包括方法的名称、返回类型、参数列表和方法体。

public class MyClass
{
    // 成员方法
    public void Greet()
    {
        Console.WriteLine("Hello, welcome to C#!");
    }
}

在上面的例子中,GreetMyClass 类的一个成员方法。它没有返回值(void)且不接受任何参数。

成员方法其实和之前学的函数(方法)其实是一样的,这里就不再重新介绍了,不懂得小伙伴可以回头再去巩固。

传送门
【从零开始入门unity游戏开发之——C#篇13】命名规范——驼峰命名法和帕斯卡命名法,函数(方法)的使用介绍


专栏推荐

地址
【从零开始入门unity游戏开发之——C#篇】
【从零开始入门unity游戏开发之——unity篇】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架开发】

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

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

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

相关文章

在Ubuntu 22.04 LTS中使用PyTorch深度学习框架并调用多GPU时遇到indexSelectLargeIndex相关的断言失败【笔记】

在Ubuntu 22.04 LTS系统中,已安装配置好CUDA 12.4、cuDNN 9.1.1以及PyTorch环境 export CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 在PyTorch深度学习框架训练调用多GPU时,提示 indexSelectLargeIndex: block: [x, 0, 0], thread: [x, 0, 0] Assertion src…

FutureCompletableFuture实战

1. Callable&Future&FutureTask介绍 直接继承Thread或者实现Runnable接口都可以创建线程,但是这两种方法都有一个问题就是:没有返回值,也就是不能获取执行完的结果。因此java1.5就提供了Callable接口来实现这一场景,而Fu…

[论文阅读笔记]-PalmTree: 学习一个用于指令嵌入的汇编语言模型

深度学习已在众多二进制分析任务中展示了其优势,包括函数边界检测、二进制代码搜索、函数原型推理、值集分析等。现有方案忽略了复杂的指令内结构,主要依赖于控制流,其中上下文信息是嘈杂的,并且可能受到编译器优化的影响。为了解…

CH582F BLE5.3 蓝牙核心板开发板 60MHz RAM:32KB ROM:448KB

CH582F BLE5.3 蓝牙核心板开发板 60MHz RAM:32KB ROM:448KB 是一款基于南京沁恒(WCH)推出的高性能、低功耗无线通信芯片CH582F的开发板。以下是该开发板的功能和参数详细介绍: 主要特性 双模蓝牙支持: 支持蓝牙5.0标准&#xff0…

数字IC后端设计实现篇之TSMC 12nm TCD cell(Dummy TCD Cell)应该怎么加?

TSMC 12nm A72项目我们需要按照foundary的要求提前在floorplan阶段加好TCD Cell。这个cell是用来做工艺校准的。这个dummy TCD Cell也可以等后续Calibre 插dummy自动插。但咱们项目要求提前在floorplan阶段就先预先规划好位置。 TSCM12nm 1P9M的metal stack结构图如下图所示。…

《网络对抗技术》Exp9 Web安全基础

实验目标 理解常用网络攻击技术的基本原理。 实验内容 Webgoat实践下相关实验。 实验环境 macOS下Parallels Desktop虚拟机中(网络源均设置为共享网络模式): Kali Linux - 64bit(攻击机,IP为10.211.55.10)…

Chrome 132 版本开发者工具(DevTools)更新内容

Chrome 132 版本开发者工具(DevTools)更新内容 一、使用 Gemini 调试 Network、Source 和 Performance Chrome 131 可以使用 Gemini 调试 CSS,现在可以调试更多模块了 与元素面板中的右键菜单类似,要打开 AI 辅助面板并开始与 …

消息系统之 Kafka

什么是消息系统 消息系统是专用的中间件,负责将数据从一个应用传递到另外一个应用。使应用只需关注于数据,无需关注数据在两个或多个应用间是如何传递的。 消息系统一般基于可靠的消息队列来实现,使用点对点模式或发布订阅模式。数据实时在…

Intel-ECI之Codesys PLC + Ethercat 远端IO + Codesys IDE编程

目录 一、 准备工作 二、安装Codesys 软件 PLC 三、 使用Codesys IDE 编程测试 CODESYS* 是领先的独立于制造商的 IEC 61131-3 自动化软件,适用于工程控制系统。它用于 Intel Edge Controls for Industrial(Intel ECI 或 ECI),…

[2015~2024]SmartMediaKit音视频直播技术演进之路

技术背景 2015年,因应急指挥项目需求,我们实现了RTMP推送音视频采集推送(采集摄像头和麦克风数据)模块,在我们做好了RTMP推送模块后,苦于没有一个满足我们毫秒级延迟诉求的RTMP播放器,于是第一…

Ubuntu24.04 安装 visual studio code

# 导入软件包密钥 wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg# 添加官方库 echo "deb [arch…

docker 搭建自动唤醒UpSnap工具

1、拉取阿里UpSnap镜像 docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/upsnap/upsnap:4 2、创建docker-compose.yml文件,进行配置: version: "3" services:upsnap:container_name: upsnapimage: crpi-k5k93ldwf…

已解决:elasticsearch创建索引失败

报错信息 具体报错: org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [typeillegal_argument_exception, reasonunknown setting [index.mappings.properties.category.analyzer] please check that any required plugins are installed…

PHPstudy中的数据库启动不了

法一 netstat -ano |findstr "3306" 查看占用该端口的进程号 taskkill /f /pid 6720 杀死进程 法二 sc delete mysql

计算机视觉中的特征提取算法

摘要: 本文聚焦于计算机视觉中的特征提取算法,深入探讨尺度不变特征变换(SIFT)算法。详细阐述 SIFT 算法的原理,包括尺度空间构建、关键点检测、方向分配与特征描述子生成等核心步骤。通过 C#、Python 和 C 三种编程语…

Linux USB开发整理和随笔

目录 1 概述 2 硬件原理基础 2.1 USB发展 2.2 USB的拓扑 2.3 硬件接口 2.4 USB总线协议 2.4.1 通信过程 2.4.2 概念关系 2.4.3 管道PIPE 2.4.4 传输 2.4.5 事务 2.4.6 包结构与类型 2.4.6.1 令牌包 2.4.6.2 数据包 2.4.6.3 握手包 2.5 描述符 2.5.1 设备描述符…

从0开始深入理解并发、线程与登台通知机制

1、从0开始深入理解并发、线程与等待通知机制 为什么开发中需要并发编程? 从阿里、美团的岗位JD其实就能看出来,并发编程和性能优化是密切相关的,使用并发编程可以做到: (1)加快响应用户的时间 比如我们经常用的迅雷下载,都喜欢…

简易记事本项目(基于Vue 3 + Element Plus + SSM 个人事件管理系统)

项目简介 点滴365是一个基于 Vue 3 Element Plus SSM 开发的个人事件管理系统,旨在帮助用户高效管理 个人日程 和 待办事项。系统支持日记撰写、待办事项管理、数据统计分析、图片上传、定时提醒、实时天气等功能,让用户可以更好地记录生活点滴、规划工作任务。 核心技术栈…

IIS服务器部署C# WebApi程序,客户端PUT,DELETE请求无法执行

这两天在自己Windows10电脑上搭建IIS服务器,把自己写的WebApi代码部署上做个本地服务器,结果客户端的PUT和DELETE请求无法执行,GET、POST这些都正常,研究后发现要删除IIS中的“模块”中的"webdavmodule"才能解决。

socket编程UDP-实现滑动窗口机制与累积确认GBN

在下面博客中,我介绍了利用UDP模拟TCP连接、按数据包发送文件的过程,并附上完整源码。 socket编程UDP-文件传输&模拟TCP建立连接脱离连接(进阶篇)_udp socket发送-CSDN博客 下面博客实现了停等机制。 socket编程UDP-实现停…