当前位置: 首页 > news >正文

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#的一项语言特性,旨在防止使用未初始化的变量。

皮一下

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

在这里插入图片描述

总结

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

相关文章:

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

前言 在这篇文章中,我将带大家深入了解C#编程语言的核心概念,包括类的实例化、访问修饰符的应用,以及C#中不同数据类型的默认值。我会通过逐步分析和具体实例,详细解释如何在C#中正确创建和操作对象,并探讨如何通过访…...

【笔记】Blender4.0建模入门-3物体的基本操作

Blender入门 ——邵发 3.1 物体的移动 演示: 1、选中一个物体 2、选中移动工具 3、移动 - 沿坐标轴移动 - 在坐标平面内移动 - 自由移动(不好控制) 选中物体:右上的大纲窗口,点击物体名称,物体的轮…...

一文详解 Berachain 测试网:全面介绍与教程,bitget wallet教程

什么是Berachain? Berachain(web3.bitget.com/zh-CN/assets/berachain-wallet)是一种尖端区块链技术,使用 Cosmos SDK 构建的 Layer-1,兼容以太坊虚拟机(EVM)。它基于一种独特的概念&#xff0c…...

小程序使用echarts图表-雷达图

本文介绍下小程序中如何使用echarts 如果是通过npm安装,这样是全部安装的,体积有点大 我这边是使用echarts中的一个组件来实现的,下边是具体流程,实际效果是没有外边的红色边框的,加红色边框的效果是这篇说明 1.echa…...

MacM1Pro Parallels19.1.0 CentOS7.9 Install PostgrepSQL

相关阅读 MacM1Pro安装 Parallels Desktop 19.1.0 https://blog.csdn.net/qq_41594280/article/details/135420241 MacM1Pro Parallels安装Parallels Tools https://blog.csdn.net/qq_41594280/article/details/135398780 MacM1Pro Parallels安装CentOS7.9 https://blog.csdn.n…...

Golang 中如何实现 Set

在Go编程中,数据结构的选择对解决问题至关重要。本文将探讨如何在 GO 中实现 set 和 bitset 两种数据结构,以及它们在Go中的应用场景。 Go 的数据结构 Go 内置的数据结构并不多。工作中,我们最常用的两种数据结构分别是 slice 和 map&#…...

记录一下uniapp 集成腾讯im特别卡(已解决)

uniapp的项目运行在微信小程序 , 安卓 , ios手机三端 , 之前这个项目集成过im,不过版本太老了,0.x的版本, 现在需要添加客服功能,所以就升级了 由于是二开 , 也为了方便 , 沿用之前的webview嵌套腾讯IM的方案 , 选用uniapp集成ui ,升级之后所有安卓用户反馈点击进去特别卡,几…...

React16源码: React中的updateHostRoot的源码实现

HostRoot 的更新 1 )概述 HostRoot 是一个比较特殊的节点, 因为在一个react应用当中它只会有一个 HostRoot, 它对应的 Fiber 对象是我们的 RootFiber 对象重点在于它的更新过程 2 )源码 定位到 packages/react-reconciler/src/ReactFiberBeginWork.js…...

Template -- React

React 版本 Node 21.6.0Npm 10.2.4 项目 创建 npm init vite 项目名称reactjsnpm inpm run dev 依赖 npm i axios # 网络 npm i antd --save # UI npm i ant-design/icons npm i react-router-dom # 路由npm i sass -D # …...

HTML 入门手册(一)

目录 HTML 1-基础语法 单标签 双标签 整体结构 2-标题和水平线 标题 水平线 3-段落和换行 段落 换行 4-列表 无序列表 有序列表 嵌套列表 5-div和span div span 6-格式化标签 粗体 斜体 下划线中划线 上标和下标 7-超链接(a标签) 链接到URL 链接到本…...

GPT帮我快速解决工作上的问题案例

Python入门容易,但精通不易。自从跟着郭老师学Python后,工作中也想偷点懒,之前排班表的问题一直困扰着我,福音来了,现在随着郭老师的小蜜蜂AI出来,说干就干。马上来到郭老师为我们提供的AI网站:…...

Day32- 贪心算法part06

一、单调递增的数字 题目一&#xff1a;738. 单调递增的数字 738. 单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递…...

.NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接

Flurl.Http-3.2.4 升级到 4.0.0 版本后&#xff0c;https请求异常&#xff1a;Call failed. The SSL connection could not be established. 如下图&#xff1a; Flurl.Http-3.2.4版本绕过https的代码&#xff0c;对于 Flurl.Http-4.0.0 版本来说方法不再适用&#xff0c;3.2.…...

【每周AI简讯】GPT-5将有指数级提升,GPT Store正式上线

AI7 - Chat中文版最强人工智能 OpenAI的CEO奥特曼表示GPT-5将有指数级提升 GPT奥特曼参加Y-Combinator W24启动会上表示&#xff0c;我们已经非常接近AGI。GPT-5将具有更好的推理能力、更高的准确性和视频支持。 GPT Store正式上线 OpenAI正式推出GPT store&#xff0c;目前…...

QT上位机开发(MFC vs QT)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在qt之前,上位机开发的主要方法就是mfc。后来出现了c#语言之后,上位机的开发就有一部分人转成了c#。这些开发都是在windows平台完成的,而linux上面的界面,则都是通过各种小众库…...

线性代数:矩阵的定义

目录 一、定义 二、方阵 三、对角阵 四、单位阵 五、数量阵 六、行&#xff08;列&#xff09;矩阵 七、同型矩阵 八、矩阵相等 九、零矩阵 十、方阵的行列式 一、定义 二、方阵 三、对角阵 四、单位阵 五、数量阵 六、行&#xff08;列&#xff09;矩阵 七、同型矩…...

k8s 使用cert-manager证书管理自签

个人建议使用安装更快&#xff0c;比helm快&#xff0c;还要等待安装crd kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.3/cert-manager.yaml#官网 https://cert-manager.io/docs/installation/kubectl/#创建自签的ClusterIssuer c…...

SpringSecurity+JWT前后端分离架构登录认证

目录 1. 数据库设计 2. 代码设计 登录认证过滤器 认证成功处理器AuthenticationSuccessHandler 认证失败处理器AuthenticationFailureHandler AuthenticationEntryPoint配置 AccessDeniedHandler配置 UserDetailsService配置 Token校验过滤器 登录认证过滤器接口配置…...

笔试面试题——二叉树进阶(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、根据二叉树创建字符串1、题目讲解2、思路讲解3、代码实现 二、二叉树的分层遍历1、题目讲…...

Java反射示例

Java反射示例 创建数据类型ReflectPoint.java package com.reflection;import java.util.Date;public class ReflectPoint {private Date birthday new Date();private int x;public int y;public String str1 "ball";public String str2 "basketball"…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...