搭建网站难吗,网站要多少钱 优帮云,学校做安全台账是哪个网站,外网如何访问群晖wordpress前言
在这篇文章中#xff0c;我将带大家深入了解C#编程语言的核心概念#xff0c;包括类的实例化、访问修饰符的应用#xff0c;以及C#中不同数据类型的默认值。我会通过逐步分析和具体实例#xff0c;详细解释如何在C#中正确创建和操作对象#xff0c;并探讨如何通过访…前言
在这篇文章中我将带大家深入了解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#中常用的访问修饰符及其作用 public 表示成员是公开的可以在任何其他类或程序集中访问。示例用途通常用于定义API的公共接口部分。 private 表示成员是私有的只能在定义它们的类中访问。示例用途隐藏类的实现细节和保护类的内部状态。 protected 表示成员在定义它们的类中以及该类的派生类中是可访问的。示例用途允许基类共享其一些成员给派生类但不对外界公开。 internal 表示成员在同一个程序集assembly中是可访问的但在其他程序集中不可访问。示例用途在一个程序集中定义内部工作机制的部分而不暴露给其他程序集。 protected internal 表示成员在同一个程序集中或派生自该类的其他程序集中是可访问的。示例用途对于既要在同一程序集中广泛使用又要在派生类中可见的成员。 private protected 表示成员仅在其所在的类以及同一程序集中的派生类中可访问。示例用途限制访问范围更严格的保护级别在设计非常特定的类层次结构时使用。
每个修饰符都提供了不同级别的封装允许开发者在保护数据和功能的同时提供必要的接口。正确使用这些修饰符是面向对象编程中的一个重要方面有助于创建结构良好、易于维护和扩展的代码。 默认情况下如果没有指定访问修饰符类的成员字段、属性、方法等在C#中是私有的private。这意味着它们只能在其所属的类内部被访问。 接着我们通过实例来了解访问修饰符这一概念 实例分析 通过下图我们看到对象com是找不到它的属性age、name、alive的尽管我们在Computer实例中已经声明了这些变量 这是因为对象引用对于非静态的字段方法或属性“Program.com”是必须的 疑问 对象引用对于非静态的字段方法或属性“Program.com”是必须的 这句话是什么意思 这句话“对象引用对于非静态的字段方法或属性‘Program.com’是必须的”指的是在C#编程中访问非静态成员如字段、方法或属性时必须通过一个类的实例即对象来进行。 让我们分解这句话以更好地理解 非静态字段、方法或属性这些是属于类的实例的成员。换句话说它们不属于类本身而是属于类的具体对象。因此每个对象有其自己的一套这些成员。 对象引用是必须的要访问这些非静态成员您需要一个指向类实例的引用。这意味着您必须先创建类的一个对象然后通过这个对象来访问这些成员。 “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#中所有的数据类型都有默认值。这些默认值取决于数据类型是否是值类型如基本数据类型和结构体还是引用类型如类和接口。以下是一些常见数据类型及其默认值 值类型
整型如 int, short, long, byte 等默认值为 0。浮点型如 float, double默认值为 0.0。decimal默认值为 0.0M。布尔型bool默认值为 false。字符型char默认值为 \0空字符。枚举Enum默认值为基础类型的默认值通常是 0。结构体Struct每个结构体成员被初始化为其相应类型的默认值。
引用类型
类Class默认值为 null。字符串string默认值也是 null。接口Interface默认值为 null。动态类型dynamic默认值为 null。数组Array默认值为 null。
特殊情况
可空值类型如 int?, bool? 等默认值为 null。这些是值类型的特殊版本允许值类型表示 null。
示例
int defaultInt; // 默认为 0
bool defaultBool; // 默认为 false
string defaultString; // 默认为 null
MyClass defaultClass; // 默认为 null在C#中当声明一个变量但未显式初始化时它会自动被初始化为其类型的默认值。这是C#的一项语言特性旨在防止使用未初始化的变量。
皮一下 常言道出门在外身份是自己给的现在我宣布我也是个靓仔了谁赞成谁反对 总结
今天的学习就到此结束了感谢大家的喜爱喜欢本文的话给博主点个赞吧记得收藏加关注哦道友们的支持就是我更新的源动力 回到顶部