AI教我学编程之C#类的实例化与访问修饰符

news2024/11/25 14:54:12

前言

在这篇文章中,我将带大家深入了解C#编程语言的核心概念,包括类的实例化、访问修饰符的应用,以及C#中不同数据类型的默认值。我会通过逐步分析和具体实例,详细解释如何在C#中正确创建和操作对象,并探讨如何通过访问修饰符控制类成员的访问权限。此外,我还打算深入探讨C#的内存管理机制,特别是堆和栈在对象生命周期中的作用,以帮助读者全面理解这些基本但关键的概念。

目录

  • 类的实例化
    • 图解实例化
    • 实例分析
    • 对话AI
  • 访问修饰符
    • 对话AI
    • 实例分析
    • 疑问
    • 没了?
    • 试试看
    • 还有吗
    • 皮一下
  • 总结

类的实例化

图解实例化

一图展示什么是类的实例化

在这里插入图片描述
接下来我将从上至下向各位说明这张图
在这张图中,首先看到的,就是实例化”Computer"类的语句

Computer com = new Computer();

在这个语句当中,Computer为类名,com为实例化Computer类的对象名,new为实例化Computer类的关键字,()是编译器用以调用Computer类的构造函数的符号

让我们分析实例来理解以上四句话

实例分析

在这张图片中我们定义了一个类,类名为Computer

在这里插入图片描述

紧接着我们声明了一个变量com,但没有初始化。

在这里插入图片描述

而后,我们使用new Computer();语句创建了一个 Computer 类的新实例,但是没有将这个实例赋值给任何变量。这意味我创建了一个 Computer 对象,但是没有引用

在这里插入图片描述

最后,将两者合并起来看

在这里插入图片描述
现在我们知道了,等号左边声明了一个变量com,等号右边创建了一个 Computer 类的新实例,这个语句就是将Computer 类的新实例赋值给变量com。也就意味着变量com引用了实例Computer,那么,等号左侧就是变量com对实例的引用,等号右侧就是Computer 类的新实例

接下来我们有请AI小助手为解释为什么上图中

  • 栈空间存储引用?
  • 堆空间存储数据?

对话AI

程序员

Computer com = new Computer();
使用堆栈的相关知识解释这个语句

在这里插入图片描述

在C#中,Computer com = new Computer(); 这个语句涉及到计算机内存的两个关键部分:堆(Heap)和栈(Stack)。这两部分在内存管理中扮演着不同的角色,尤其是在对象的创建和引用方面。

堆(Heap)

  • 对象的存储位置:在C#中,所有的对象实例都在堆上分配。堆是一个用于存储对象的内存区域。
  • 动态分配:在堆上分配内存是动态的,意味着当您创建一个对象时,运行时(如.NET运行时)会在堆上为该对象分配内存。
  • 管理方式:堆上的对象由垃圾收集器管理,这意味着您不需要手动释放对象所占用的内存。当对象不再被引用时,垃圾收集器会最终清理这些对象。

栈(Stack)

  • 引用/变量的存储位置:当您声明一个变量(如Computer com)时,这个变量(如果它是一个引用类型)存储的是对堆上对象的引用。这个引用存储在栈上。
  • 自动管理:栈是自动管理的内存区域,当一个方法调用结束时,所有在该方法中创建的栈内变量都会被自动移除。
  • 快速访问:栈上的操作通常比堆上的操作快,因为栈是一种线性且顺序的数据结构。

Computer com = new Computer(); 的内存操作

  • 当这个语句执行时,首先,new Computer() 会在堆上为 Computer 类的一个新实例分配内存。
  • 接着,这个新创建的 Computer 实例的地址(或引用)被存储在变量 com 中。
  • 变量 com 本身存储在栈上,因为它是一个局部变量。
  • 这意味着 com 包含了指向堆上 Computer 对象的引用。

通过这种方式,栈和堆协同工作,使得您能够在程序中创建和使用对象。栈提供了快速的变量访问,而堆允许动态地分配更大的内存空间来存储对象实例。

如此,我们知道了

  • 栈空间用于存储引用类型变量对堆上对象引用
  • 堆空间用于存储所有的对象实例

访问修饰符

首先我们来回顾一下访问修饰符的概念

对话AI

程序员

说说在C#编程中常用的访问修饰符及他们的作用

在这里插入图片描述

在C#中,访问修饰符(或访问限定符)用于定义类、方法、属性和其他成员的可访问性。这是确保数据封装和对象的安全性的关键部分。以下是C#中常用的访问修饰符及其作用:

  1. public

    • 表示成员是公开的,可以在任何其他类或程序集中访问。
    • 示例用途:通常用于定义API的公共接口部分。
  2. private

    • 表示成员是私有的,只能在定义它们的类中访问。
    • 示例用途:隐藏类的实现细节和保护类的内部状态。
  3. protected

    • 表示成员在定义它们的类中以及该类的派生类中是可访问的。
    • 示例用途:允许基类共享其一些成员给派生类,但不对外界公开。
  4. internal

    • 表示成员在同一个程序集(assembly)中是可访问的,但在其他程序集中不可访问。
    • 示例用途:在一个程序集中定义内部工作机制的部分,而不暴露给其他程序集。
  5. protected internal

    • 表示成员在同一个程序集中或派生自该类的其他程序集中是可访问的。
    • 示例用途:对于既要在同一程序集中广泛使用,又要在派生类中可见的成员。
  6. private protected

    • 表示成员仅在其所在的类以及同一程序集中的派生类中可访问。
    • 示例用途:限制访问范围更严格的保护级别,在设计非常特定的类层次结构时使用。

每个修饰符都提供了不同级别的封装,允许开发者在保护数据和功能的同时提供必要的接口。正确使用这些修饰符是面向对象编程中的一个重要方面,有助于创建结构良好、易于维护和扩展的代码。
默认情况下,如果没有指定访问修饰符,类的成员(字段、属性、方法等)在C#中是私有的(private)。这意味着它们只能在其所属的类内部被访问。

接着我们通过实例来了解访问修饰符这一概念

实例分析

通过下图我们看到对象com是找不到它的属性age、name、alive的,尽管我们在Computer实例中已经声明了这些变量

在这里插入图片描述

这是因为对象引用对于非静态的字段,方法或属性“Program.com”是必须的

在这里插入图片描述

疑问

程序员

对象引用对于非静态的字段,方法或属性“Program.com”是必须的
这句话是什么意思?

在这里插入图片描述

这句话“对象引用对于非静态的字段,方法或属性‘Program.com’是必须的”,指的是在C#编程中访问非静态成员(如字段、方法或属性)时,必须通过一个类的实例(即对象)来进行。

让我们分解这句话以更好地理解:

  1. 非静态字段、方法或属性:这些是属于类的实例的成员。换句话说,它们不属于类本身,而是属于类的具体对象。因此,每个对象有其自己的一套这些成员。

  2. 对象引用是必须的:要访问这些非静态成员,您需要一个指向类实例的引用。这意味着您必须先创建类的一个对象,然后通过这个对象来访问这些成员。

  3. “Program.com”:这似乎是指在类 Program 中有一个名为 com 的成员引用。如果 com 是非静态的,那么您需要 Program 类的一个实例来访问 com

例如,假设您有以下类定义:

class Program
{
    Computer com; // 非静态成员

    static void Main(string[] args)
    {
        // 创建Program类的实例来访问com
        Program programInstance = new Program();
        programInstance.com = new Computer();

        // 一些操作...
    }
}

class Computer
{
    // 一些字段和方法...
}

在这个例子中,要访问 Program 类中的 com 成员,您需要先创建 Program 类的一个实例(在这个例子中是 programInstance),然后通过这个实例来访问 com。 直接通过类名(如 Program.com)来访问 com 是不可能的,因为它不是一个静态成员。

就是说在上图中缺少一个访问`com·的实例,可是我又不想创建一个新实例怎么办?

如下图,将Computer类的实例化语句放到Main方法中,这样com就不再是Program类的成员,但Main方法作为入口函数,是程序开始执行的地方,这样就能保证com对象的正常使用。可以看到,此时com已经变成可访问状态
在这里插入图片描述

但当我试图通过.运算符来找到它的属性name的时候,我们并没有看到name属性

在这里插入图片描述

这是因为name变量前面隐藏了一个访问修饰符private,结合上方的知识点,我们只要在前方加上public,变量name就变成类外部可以访问的变量了,如下图

在这里插入图片描述
此时,运行程序发现,结果是:我的名字是,后面没了,这是为什么呢?
在这里插入图片描述

没了?

程序员

此时运行程序得出的结果是”我的名字是“,后面没了,为什么?

在这里插入图片描述

在您提供的代码中,Computer 类的 name 字段是 public(公开的),因此可以在 Program 类中访问它。但是,在创建 Computer 类的新实例 com 之后,您并没有为 name 字段赋予任何值。由于 name 是一个 string 类型的字段,而在C#中,未初始化的字符串默认值是 null

所以,当执行 Console.WriteLine("我的名字是" + com.name); 这一行时,您实际上是在连接字符串 “我的名字是” 和 null。在C#中,将 null 与字符串连接时,null 会被视为空字符串,因此结果就是 “我的名字是” 后面没有任何内容。

为了看到名字输出,您需要在输出之前为 com.name 赋予一个非空的字符串值。例如:

class Program
{
    static void Main(string[] args)
    {
        Computer com = new Computer();
        com.name = "Tom"; // 给name字段赋值
        Console.WriteLine("我的名字是" + com.name);
    }
}

class Computer
{
    int age;
    public string name; // 字段已声明为public
    bool alive;
}

在这个修改后的版本中,com.name 被赋值为 “Tom”,所以输出将会是 “我的名字是Tom”。

由此,我们初步了解了默认值这一概念

试试看

在这里插入图片描述

看来windows也不认为我是个靓仔,桑心

还有吗

程序员

在C#中,还有哪些类型是有默认值的?默认值是什么?

在这里插入图片描述

在C#中,所有的数据类型都有默认值。这些默认值取决于数据类型是否是值类型(如基本数据类型和结构体)还是引用类型(如类和接口)。以下是一些常见数据类型及其默认值:

值类型

  1. 整型(如 int, short, long, byte 等):默认值为 0
  2. 浮点型(如 float, double:默认值为 0.0
  3. decimal:默认值为 0.0M
  4. 布尔型(bool:默认值为 false
  5. 字符型(char:默认值为 \0(空字符)。
  6. 枚举(Enum):默认值为基础类型的默认值,通常是 0
  7. 结构体(Struct):每个结构体成员被初始化为其相应类型的默认值。

引用类型

  1. 类(Class):默认值为 null
  2. 字符串(string:默认值也是 null
  3. 接口(Interface):默认值为 null
  4. 动态类型(dynamic:默认值为 null
  5. 数组(Array):默认值为 null

特殊情况

  • 可空值类型(如 int?, bool? 等):默认值为 null。这些是值类型的特殊版本,允许值类型表示 null

示例

int defaultInt; // 默认为 0
bool defaultBool; // 默认为 false
string defaultString; // 默认为 null
MyClass defaultClass; // 默认为 null

在C#中,当声明一个变量但未显式初始化时,它会自动被初始化为其类型的默认值。这是C#的一项语言特性,旨在防止使用未初始化的变量。

皮一下

常言道,出门在外,身份是自己给的,现在我宣布:我也是个靓仔了,谁赞成?谁反对?

在这里插入图片描述

总结

今天的学习就到此结束了,感谢大家的喜爱,喜欢本文的话,给博主点个赞吧!记得收藏加关注哦!道友们的支持就是我更新的源动力!
回到顶部

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

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

相关文章

【实操】基于 GitHub Pages + Hexo 搭建个人博客

《开发工具系列》 【实操】基于 GitHub Pages Hexo 搭建个人博客 一、引言二、接入 Node.js2.1 下载并安装 Node.js2.2 环境变量配置 三、接入 Git3.1 下载并安装 Git3.2 环境变量配置 四、接入 Hexo4.1 安装 Hexo4.2 建站4.3 本地启动服务器 五、接入 GitHub Pages5.1 初识 G…

C#调用C动态链接库

前言 已经没写过博客好久了,上一篇还是1年半前写的LTE Gold序列学习笔记,因为工作是做通信协议的,然后因为大学时没好好学习专业课,现在理论还不扎实,不敢瞎写; 因为工作原因,经常需要分析一些字…

在k8s上部署ClickHouse

概述 clickhouse的容器化部署,已经有非常成熟的生态了。在一些互联网大厂也已经得到了大规模的应用。 clickhouse作为一款数据库,其容器化的主要难点在于它是有状态的服务,因此,我们需要配置PVC。 目前业界比较流行的部署方式有…

实时云渲染服务:流式传输 VR 和 AR 内容

想象一下无需专用的物理计算机,甚至无需实物连接,就能获得高质量的 AR/VR 体验是种什么样的体验? 过去,与 VR 交互需要专用的高端工作站,并且根据头显、壁挂式传感器和专用的物理空间。VR 中的复杂任务会突破传感器范…

AI相关资料

文心一格收费,有免费额度 通义万相_AI创意作画_AI绘画_人工智能-阿里云 AI AIchatOS 即时 AI - 生成式图像创作及 UI 设计工具 Framer — The internet is your canvas

分布式锁的产生以及使用

日常开发中,针对一些需要锁定资源的操作,例如商城的订单超卖问题、订单重复提交问题等。 都是为了解决在资源有限的情况限制客户端的访问,对应的是限流。 单节点锁问题 目前针对这种锁资源的情况采取的往往是互斥锁,例如 java 里…

Java SE入门及基础(25)

目录 方法带参(续第24篇) 6.方法参数传递规则 方法传参来自官方的说明 基本数据类型传值案例 基本数据类型传值时传递的是值的拷贝 引用数据类型传值案例 引用数据类型传值时传递的是对象在堆内存上的空间地址 Java SE文章参考:Java SE入门及基础知…

[AutoSar]BSW_OS 08 Autosar OS_内存保护

一、 目录 一、关键词平台说明一、内存保护的概念 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c;芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (GCC) >>>>>回到总目录<<<<&l…

Python seaborn库的安装与图像的背景风格(Seaborn篇-01)

Python seaborn库的安装与图像的背景风格(Seaborn篇-01)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

深度学习记录--指数加权平均

指数加权移动平均(exponentially weighted moving averages) 如何对杂乱的数据进行拟合&#xff1f; 通过指数加权平均可以把数据图近似拟合成一条曲线 公式&#xff1a; 其中表示第t个平均数&#xff0c;表示第t-1个平均数&#xff0c;表示第t个数据&#xff0c;表示变化参数…

从0到1实战微服务架构之Nacos服务注册、发现与管理

目录 一、前言 二、服务注册 三、服务管理 一、前言 Nacos是一个开源的、易于构建云原生应用的动态服务发现、配置管理和服务管理平台。从0到1实战微服务架构之Nacos下载安装 介绍了Nacos的架构、下载安装&#xff0c;本文将介绍服务发现、配置和管理。 二、服务注册 第一…

山西电力市场日前价格预测【2024-01-22】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-22&#xff09;山西电力市场全天平均日前电价为370.74元/MWh。其中&#xff0c;最高日前电价为601.28元/MWh&#xff0c;预计出现在18:15。最低日前电价为242.97元/MWh&#xff0c;预计…

UE 可靠UDP实现原理

发送 我们的消息发送都是通过 UChannel 来处理的&#xff0c;通过调用 UChannel::SendBunch 统一处理。 发送的 Bunch 是以 FOutBunch 的形式存在的。当 bReliable 为 True 的时候&#xff0c;表示 Bunch 是可靠的。 发送逻辑直接从UChannel::SendBunch处开始分析 1、大小限…

消息中间件之RocketMQ(一)

1.简介 RocketMQ是阿里巴巴于2012年开源的分布式消息中间件&#xff0c;后来捐赠给Apache软件基金会&#xff0c;并于2017年9月25日称为Apache的顶级项目.作为经历多过多次阿里巴巴双11这种超级工程的洗礼并有稳定出色表现得国产中间件&#xff0c;以其高性能、低延迟和高可靠…

NTFS 磁盘管理器---NTFS Disk by Omi NTFS中文

NTFS Disk by Omi NTFS是一款专为Mac用户设计的NTFS磁盘管理工具。它可以帮助用户方便地访问和管理NTFS格式的硬盘、U盘、移动硬盘以及其他存储设备&#xff0c;并提供高效稳定的NTFS卷管理功能。该软件具有简单的用户界面&#xff0c;使用户能够快速访问和管理NTFS磁盘上的文件…

C++入门学习(七)整型

整型就是整数类型的数据&#xff08;-1&#xff0c;0&#xff0c;1等等&#xff09; 数据类型占用空间取值范围short(短整型)2字节 (-2^15 ~ 2^15-1) 32768~32767 int(整型)4字节(-2^31 ~ 2^31-1)long(长整形) Windows为4字节, Linux为4字节(32位), 8字节(64位) (-2^31 ~ 2^31…

pyspark笔记:over

1 方法介绍 在 PySpark 中&#xff0c;over 函数是一个非常重要的概念&#xff0c;尤其是在使用窗口函数&#xff08;例如 row_number, rank, dense_rank, lead, lag 等&#xff09;时。over 函数允许你对一个数据集进行分组&#xff0c;然后在每个分组内应用窗口函数。 1.1 …

【MongoDB】下载安装、指令操作

目录 1.下载安装 2.指令 2.1.基础操作指令 2.2.增加 2.3.查询 2.4.修改 2.5.删除 前言&#xff1a; 关于MongoDB的核心概念请移步&#xff1a; 【文档数据库】ES和MongoDB的对比-CSDN博客 1.下载安装 本文以安装Windows版本的mongodb为例&#xff0c;Linux版本的其实…

漫漫数学之旅009

文章目录 经典格言数学习题古今评注拓展学习&#xff08;一&#xff09;大数定理&#xff08;二&#xff09;伯努利级数 经典格言 真正的问题&#xff0c;不在于机器是否思考&#xff0c;而在于人们是否思考。——BF斯金纳&#xff08;B. F. Skinner&#xff09; BF斯金纳&…

通过完善价值观评价,建立企业多维度评价体系

一、背景A公司是一家互联网公司&#xff0c;主要负责技术开发、软件应用方面的工作&#xff0c;致力于长期的软件研发、服务器开发、游戏端开发等&#xff0c;依托于专业技术实力和长期的实践积累&#xff0c;公司不断整合各类资源、深入开发技术&#xff0c;规模不断扩大&…