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

文章目录

一、类和对象

类和之前学的结构体类似

1、什么是类和对象?

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

2、例子说明

2.1 例子1:

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

(1) 类的定义:

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

csharp 复制代码
class Car
{
    // 类定义的内容
}

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

(2) 创建对象:

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

csharp 复制代码
Car myCar = new Car();

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

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

2.2 例子2:

类的比喻:

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

对象的比喻:

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

代码实例:

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

csharp 复制代码
class Person
{
    public string Name;
    public int Age;
}

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

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

csharp 复制代码
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 等,用来控制其访问权限。

成员变量语法结构

csharp 复制代码
[访问修饰符] 变量类型 变量名;

示例:

csharp 复制代码
public class Person
{
    // 成员变量
    public string Name; // 姓名
    public int Age;     // 年龄
}

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

成员变量默认值

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

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

成员变量的访问

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

比如

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

示例:成员变量

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

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

2、普通变量(Local Variable)

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

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

示例:普通变量

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

定义简单的成员方法

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

csharp 复制代码
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

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

相关推荐
小黄银技术栈1 分钟前
校园点餐订餐外卖跑腿Java源码
java·开发语言
向宇it2 分钟前
【从零开始入门unity游戏开发之——C#篇11】一个标准 C# 程序介绍、新的值类型——枚举
开发语言·vscode·unity·c#·游戏引擎
安年CJ8 分钟前
Python 中的指针:深入理解与应用
运维·开发语言·python
浅陌sss13 分钟前
游戏AI实现-寻路算法(A*)
unity·游戏引擎
我是Superman丶22 分钟前
【自动化】Python SeleniumUtil 油猴 工具 自动安装用户脚本
开发语言·python
Iam傅红雪22 分钟前
修改springboot的配置文件
java·spring boot·spring
星月昭铭26 分钟前
Set集合进行!contains判断IDEA提示Unnecessary ‘contains()‘ check
java·intellij-idea
抓哇FullStack-Junior29 分钟前
设计模式——原型模式
java·开发语言·设计模式·原型模式
w_312345430 分钟前
idea | maven项目标红解决方案 | 强制刷新所有依赖
java·maven·intellij-idea
shi578331 分钟前
设计模式之 原型模式 C# 范例
设计模式·c#·原型模式