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

前言

在这篇文章中,我将带大家深入了解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类的实例来访问comProgram 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; // 字段已声明为publicbool 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.mzph.cn/news/638565.shtml

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

相关文章

维基百科推广的12种方法帮你建立强大的品牌-华媒舍

维基百科是全球最大、最权威的多语言网络百科全书。它是许多人搜索信息、获取知识的首选平台,也是许多品牌建立强大影响力的重要途径。本文将介绍维基百科推广的12种方法,帮助你在维基百科上建立强大的品牌形象。 1. 准备工作 在开始维基百科推广之前&a…

IDEA怎么用Devtools热部署

IDEA怎么用Devtools热部署 大家知道在项目开发过程中,有时候会改动代码逻辑或者修改数据结构,为了能使改动的代码生效,往往需要重启应用查看改变效果,这样会相当耗费时间。 重启应用其实就是重新编译生成新的Class文件&#xff0…

机器学习:何为监督学习和无监督学习

目录 一、监督学习 (一)回归 (二)分类 二、无监督学习 聚类 一、监督学习 介绍:监督学习是指学习输入到输出(x->y)映射的机器学习算法,监督即理解为:已知正确答案…

C语言总结十一:自定义类型:结构体、枚举、联合(共用体)

本篇博客详细介绍C语言最后的三种自定义类型,它们分别有着各自的特点和应用场景,重点在于理解这三种自定义类型的声明方式和使用,以及各自的特点,最后重点掌握该章节常考的考点,如:结构体内存对齐问题&…

C++PythonC# 三语言OpenCV从零开发(5):ROI截取

文章目录 前言ROI测试图片部分区域截取CCsharpPython 颜色区域分割CCsharpPython 颜色通道合并CCsharpPython 总结 前言 C&Python&Csharp in OpenCV 专栏 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料课件笔记&#xff09…

Mybatis Plus baomidou EasyCode插件自动生成驼峰字段实体类,而不是全小写字段实体类

开发环境: springboot 2.4.3baomidou 3.4.0mybatis plus 3.4.0jdk8 问题描述: 1、mybatis 使用baomidou 插件,EasyCode自动生成实体类,但字段都是全部小写的,不太符合编码规范。 2、mysql表字段全是驼峰&#xff0c…

大数据技术原理及应用课实验3 :熟悉常用的HBase操作

目录 实验3 熟悉常用的HBase操作 一、实验目的 二、实验平台 三、实验步骤(每个步骤下均需有运行截图) (一)编程实现以下指定功能,并用Hadoop提供的HBase Shell命令完成相同任务: 1.列出HBase所有的表…

科大讯飞将于1月30日发布星火大模型 V3.5,基于全国产化算力底座训练

科大讯飞即将发布全新AI大模型——星火认知大模型 V3.5,该模型将于14:00正式发布。据透露,相比于去年10月24日发布的V3.0版本,V3.5在逻辑推理、文本生成、数学答题及小样本学习能力上均实现了显著提升。 科大讯飞官网链接:讯飞星…

Leetcode的AC指南 —— 栈与队列:20. 有效的括号

摘要: **Leetcode的AC指南 —— 栈与队列:20. 有效的括号 **。题目介绍:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字…

CMeet系列技术生态沙龙---城市开发者组织年度聚会·杭州 《把握未来趋势,持续学习创新》

CSDN始终致力于促进城市区域内尖端新兴技术开发者交流,提供开放自由的切磋平台。在这个充满挑战和机遇的一年即将结束之际,通过本次聚会,汇聚杭州本地各行各业的开发者朋友,回顾过去一年城市社区的成就和收获,感谢携手同行的各位,…

makefile的机制,执行命令的流程分析

makefile的机制,流程分析 calc:add.o sub.o multi.ogcc add.o sub.o multi.o calc.cpp -o calcadd.o:add.cppgcc -c add.cpp -o add.osub.o:sub.cppgcc -c sub.cpp -o sub.omulti.o:multi.cppgcc -c multi.cpp -o multi.oclean:rm -rf *.o calc按照这个例子分析&am…

常见网站结构

网站架构与部署架构 1、初始阶段的网站架构 一般来讲,大型网站都是从小型网站发展而来,一开始的架构都比较简单,随着业务复杂和用户量的激增,才开始做很多架构上的改进。当它还是小型网站的时候,没有太多访客&#…

数据结构之栈和队列

数据结构之栈和队列 1、栈1.1、栈的定义及基本运算1.2、栈的存储结构 2、队列2.1、队列的定义及基本运算2.2、队列的存储结构2.3、队列的应用 数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从…

FDM3D打印系列——宝可梦妙蛙种子

fdm打印妙蛙种子 大家好,我是阿赵。   每次打印3D模型,都有新的感觉,这次打印了个宝可梦里面的妙蛙种子,也就是俗称的蒜头王八。   先来看看成果,然后在后面再聊一下关于3D打印的一些体会。使用创想三维的Sermoon …

华为机考入门python3--(0)测试题1-句子平均重量

分类:字符串 知识点: 获取输入 input().strip().split(" ") 拼接列表 " ".join(list) 输出指定位数的浮点数 print("%.2f" % value) 题目来自【华为招聘模拟考试】 # If you need to import additional packages or c…

Dell戴尔XPS 8930笔记本电脑原装Win10系统 恢复出厂预装OEM系统

链接:https://pan.baidu.com/s/1eaTQeX-LnPJwWt3fBJD8lg?pwdajy2 提取码:ajy2 原厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、MyDell等预装程序 文件格式:esd/wim/swm 安装方式&am…

一文梳理金融风控建模全流程(Python)

▍目录 一、简介 风控信用评分卡简介 Scorecardpy库简介 二、目标定义与数据准备 目标定义 数据准备 三、安装scorecardpy包 四、数据检查 五、数据筛选 六、数据划分 七、变量分箱 卡方分箱 手动调整分箱 八、建立模型 相关性分析 多重共线性检验VIF KS和AUC …

李宏毅 Generative Adversarial Network(GAN)生成对抗网络

(延申)GAN Lecture 1 (2018)- Introduction_哔哩哔哩_bilibili Basic Idea of GAN 附课程提到的各式各样的GAN:https://github.com/hindupuravinash/the-gan-zoo 想要让机器做到的是生成东西。->训练出来一个generator。 假设要做图像生成,要做的是…

【Qt之模型视图】5. Qt库提供的视图便捷类

1. 前言 Qt提供了一些便捷的视图类,如QListWidget提供项目列表,QTreeWidget显示多级树结构,QTableWidget提供单元格项的表格。每个类都继承了QAbstractItemView类的行为,QAbstractItemView类实现了项目选择和标题管理的通用行为。…

16.5 参考文献——深度学习定位

16.5 一种高效鲁棒的多楼层室内环境指纹定位方法 同济大学 Zhao Y, Gong W, Li L, et al. An Efficient and Robust Fingerprint Based Localization Method for Multi Floor Indoor Environment[J]. IEEEa Internet of Things Journal, 2023. 2.相关工作 B.基于深度学习的…