AI教我学编程之C#类型

前言

在上一课 中我们通过C#入门程序了解到关于C#的基础知识,这节课我们来感受作为C家族最大的黑马,在TIOBE榜单 上受欢迎程度未来两个月可能超越java的存在:C#的魅力

重点先知

1、C#程序或DLL的源代码是一组类型声明
2、对于可执行程序,类型声明中必须有一个包含 Main 方法的类
3、命名空间是一种将相关的类型声明分组并命名的方法。因为程序是一组相关的类型声明所以通常在你创建的命名空间内部声明程序类型。

程序员

写一个C#程序,程序有一个命名空间,命名空间由三个类型声明组成

在这里插入图片描述

当你创建一个C#程序时,通常会包含一个主命名空间,该命名空间包含一些类型声明。下面是一个简单的例子,其中包含一个命名空间,该命名空间包含三个不同的类型声明:

using System;

// 声明一个命名空间
namespace MyNamespace
{
    // 声明第一个类型
    public class MyClass1
    {
        public void Method1()
        {
            Console.WriteLine("Method1 from MyClass1");
        }
    }

    // 声明第二个类型
    public class MyClass2
    {
        public void Method2()
        {
            Console.WriteLine("Method2 from MyClass2");
        }
    }

    // 声明第三个类型
    public static class MyStaticClass
    {
        public static void StaticMethod()
        {
            Console.WriteLine("StaticMethod from MyStaticClass");
        }
    }

    // 主程序
    class Program
    {
        static void Main()
        {
            // 创建类型的实例并调用方法
            MyClass1 obj1 = new MyClass1();
            obj1.Method1();

            MyClass2 obj2 = new MyClass2();
            obj2.Method2();

            // 调用静态类的静态方法
            MyStaticClass.StaticMethod();
        }
    }
}

在这个例子中,我们创建了一个名为 MyNamespace 的命名空间,其中包含了三个不同的类型:MyClass1MyClass2MyStaticClass。主程序位于 Program 类中,它在 Main 方法中创建了这些类型的实例并调用了它们的方法。请注意,静态类的方法可以直接通过类名调用。

C#程序既然是一组类型声明,那么学习 C#就是学习如何创建使用类型。所以,我们首先要了解什么是类型

类型是一种模板

想象一下类型就像是创建各种东西的一种模型或蓝图。这个模型并不是实际的东西,但它告诉我们如何构建具体的对象,就好像是一份详细说明书。

类型由下面的元素定义

  • 名称
  • 用于保存数据成员的数据结构
  • 一些行为及约束条件。

程序员

举两个简单的例子

在这里插入图片描述

这两个例子介绍了浮点数类型(float)和字符串类型(string)。浮点数用于表示带有小数部分的数值,而字符串用于存储文本信息。这些数据类型在编程中非常常见,初学者可以通过它们了解不同种类的数据及其用途。

名称数据结构行为及约束条件
浮点数 (float)用于表示带有小数部分的数值
存储范围: 约 ±1.5 x 10^(-45) 到 ±3.4 x 10^(38)
可以进行基本算术运算
适合表示需要小数精度的数值
字符串 (string)用于存储文本数据,由一系列字符组成可以进行字符串的拼接、比较、截取等操作
字符串是不可变的,一旦创建就不能被修改
适合表示文本信息,如名称、句子等

程序员

我不太能理解既然字符串是“一旦创建就不能被修改”,为什么字符串又能进行拼接和截取?

在这里插入图片描述

抱歉,我可能没有表达得很清楚。让我更详细地解释一下。

在C#中,字符串是不可变的,这意味着一旦创建了字符串,它的内容就不能被修改。例如,如果你有一个字符串 “hello”,你不能直接修改它的某个字符,比如将 “h” 改成 “H”。如果你尝试这样做,实际上会创建一个新的字符串,而不是修改原始的字符串。

但是,对于字符串的操作,如拼接和截取,会创建新的字符串,而不是直接修改原始字符串。这是因为字符串的不可变性。例如:

string greeting = "Hello";
string newGreeting = greeting + ", World!";  // 拼接字符串,创建新字符串

在这个例子中,greeting + ", World!" 创建了一个新的字符串,而原始的 greeting 字符串保持不变。拼接操作并没有直接修改 greeting,而是生成了一个新的字符串。

同样,截取字符串的操作也是返回一个新的字符串,而不是在原始字符串上进行修改:

string subString = greeting.Substring(0, 3);  // 截取字符串,创建新字符串 "Hel"

所以,尽管字符串是不可变的,你仍然可以通过创建新的字符串来执行各种操作,如拼接和截取。这有助于确保原始数据的不可变性。

我们刚刚说到类型就像是创建各种东西的一种模型或蓝图,那么这种东西是什么呢?

实例化类型

定义:从某个类型模板创建实际的对象,称为实例化该类型

换言之

  • 通过实例化类型而创建的对象被称为类型的对象或类型的实例。
  • 在C#程序中每个数据项都是某种类型的实例。这些类型可以是语言自带的,也可以是程序员定义的

程序员

实例化这两个类型

在这里插入图片描述

当你在C#中实例化不同类型时,你通常使用关键字 new 来创建对象。下面是使用 new 关键字实例化浮点数类型(float)和字符串类型(string)的代码示例:

在这里插入图片描述
在这个例子中,我们使用 float 关键字实例化了一个浮点数,并使用 string 关键字实例化了一个字符串。然后,我们通过Console.WriteLine将这些实例化的值输出到控制台。请注意,为了区分浮点数类型的字面量,我们在 3.14 的末尾添加了 ‘f’。

像 string、float 这样的类型称为简单类型。这种类型只能存储一个数据项。其他的类型可以存储多个数据项。比如数组(array)类型就可以存储多个同类型的数据项。这些数据项称为数组元素。可以通过数字引用这些元素,这些数字称为索引
那么在除了这些类型之外,类型声明中还有什么呢?

类型声明中成员的类别

另外一些类型可以包含许多不同类型的数据项。这些类型中的数据项个体称为成员,并且与数组中使用数字来引用成员不同,

数据成员和函数成员

  • 数据成员:保存了与这个类的对象或整个类相关的数据。
  • 函数成员:执行代码。函数成员定义类型的行为

程序员

C#程序,一个命名空间中,一个类型声明,包含两个数据成员和两个函数成员

在这里插入图片描述

下面是一个简单的C#程序,其中包含一个命名空间、一个类型声明,以及两个数据成员和两个函数成员:

using System;

namespace MyNamespace
{
    // 类型声明
    public class MyClass
    {
        // 数据成员
        private int myInt;
        private string myString;

        // 构造函数
        public MyClass(int intValue, string stringValue)
        {
            myInt = intValue;
            myString = stringValue;
        }

        // 函数成员1
        public void DisplayValues()
        {
            Console.WriteLine($"Int Value: {myInt}");
            Console.WriteLine($"String Value: {myString}");
        }

        // 函数成员2
        public void UpdateValues(int newIntValue, string newStringValue)
        {
            myInt = newIntValue;
            myString = newStringValue;
        }
    }

    // 主程序
    class Program
    {
        static void Main()
        {
            // 创建类型的实例
            MyClass myObject = new MyClass(42, "Hello");

            // 调用函数成员1
            myObject.DisplayValues();

            // 调用函数成员2
            myObject.UpdateValues(99, "World");

            // 再次调用函数成员1,显示更新后的值
            myObject.DisplayValues();
        }
    }
}

在这个例子中,命名空间是 MyNamespace,包含一个类型声明 MyClassMyClass 类型有两个私有的数据成员 myIntmyString,以及两个函数成员 DisplayValuesUpdateValues。主程序(Program 类)创建了 MyClass 的一个实例,并通过调用函数成员来展示和更新数据成员的值。

刚刚我们看到的,string和float都属于预定义类型,其实在C#中,共有 16种预定义类型,其中包括13 种简单类型和 3 种非简单类型。

所有预定义类型的名称都由全小写的字母组成。

预定义的简单类型包括以下3 类
  • 11种数值类型
    • 1、不同长度的有符号和无符号整数类型
    • 2、浮点数类型 float 和 double
    • 3、一种称为decimal高精度小数类型。与float 和 double 不同,decimal类型可以准确地表示分数。decimal类型常用于货币的计算
  • 一种 Unicode字符类型 char
  • 一种布尔类型 bool。bool类型表示布尔值并且必须为 true 或 false
3种非简单类型
  • string,它是一个Unicode字符数组
  • object,它是所有其他类型的基类
  • dynamic,使用动态语言编写的程序集时使用

之前我们已经在这里 聊过了关于类型的概念,在此不再赘述,我们接着往下看

提到预定义类型,同学们是不是很快就想到还有自定义类型?

用户自定义类型

除了C#提供的 16种预定义类型,还可以创建自己的用户定义类型。有 6种类型可以由用户自己创建,它们是:

  • 类类型(class);
  • 结构类型(struct);
  • 数组类型(array);
  • 枚举类型 (enum);
  • 委托类型 ( delegate );
  • 接口类型(interface)

类型通过类型声明创建,类型声明包含以下信息:

  • 1、要创建的类型的种类;
  • 2、新类型的名称;
  • 3、对类型中每个成员的声明(名称和规格 ),array 和 delegate 类型除外,它们不含有命名成员。
注意

一旦声明了类型,就可以创建和使用这种类型的对象,就像它们是预定义类型一样。使用预定义类型是一个单步过程,简单地实例化对象即可。使用用户自定义类型是一个两步过程:必须先声明类型,然后实例化该类型的对象

栈和堆

程序运行时,它的数据必须存储在内存中。一个数据项需要多大的内存、存储在什么地方以及如何存储都依赖于该数据项的类型。
运行中的程序使用两个内存区域来存储数据:栈和堆。

栈是一个内存数组,是一个 LIFO(Last-In First-Out,后进先出)的数据结构。栈存储几种类型的数据:

  • 某些类型变量的值;
  • 程序当前的执行环境;
  • 传递给方法的参数。

系统管理所有的栈操作。作为程序员,你不需要显式地对它做任何事情。但了解栈的基本功能可以更好地了解程序在运行时在做什么,并能更好地了解 C#文档和著作

栈的特征

栈有如下几个普遍特征

  • 数据只能从栈的顶端插入和删除。
  • 把数据放到栈顶称为入栈(push )
  • 从栈顶删除数据称为出栈(pop)。

堆是一块内存区域,在堆里可以分配大块的内存用于存储某种类型的数据对象。与栈不同,堆里的内存能够以任意顺序存人和移除。

虽然程序可以在堆里保存数据,但并不能显式地删除它们。CLR 的自动垃圾收集器在判断出程序的代码将不会再访问某数据项时,会自动清除无主的堆对象。我们因此可以不再操心这项使用其他编程语言时非常容易出错的工作了。

值类型和引用类型

类型被分为两种:值类型和引用类型,这两种类型的对象在内存中的存储方式不同。

  • 值类型只需要一段单独的内存,用于存储实际的数据
  • 引用类型需要两段内存
    • 第一段存储实际的数据,它总是位于堆中
    • 第二段是一个引用,指向数据在堆中的存放位置

存储引用类型对象的成员

  • 引用类型对象的数据部分始终存放在堆里,
  • 值类型对象,或引用类型数据的引用部分可以存放在堆里,也可以存放在栈里,这依赖
    于实际环境。

注意:

对于一个引用类型,其实例的数据部分始终存放在堆里。既然两个成员都是对象数据的一部分那么它们都会被存放在堆里无论它们是值类型还是引用类型

C#类型总结

程序员

将C#中的类型以横向为预定义类型和用户自定义类型,纵向为值类型和引用类型分类列个表

在这里插入图片描述

下面是一个将C#中的类型按照值类型和引用类型、以及预定义类型和用户自定义类型进行分类的表格:
在这里插入图片描述

总结

今天我们学习了C#类型的相关知识,其中由于时间原因,对于一些重要的概念我尚没有补充图示,明天有时间补一下,感谢大家的喜爱,喜欢本文的话,给博主点个赞吧!记得收藏加关注哦!道友们的支持就是我更新的源动力!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高压消防泵:科技与安全性的完美结合

在现代社会,随着科技的不断发展,各种高科技设备层出不穷,为我们的生活带来了极大的便利。在森林火灾扑救领域,恒峰智慧科技研发的高压消防泵作为一种高效、节能、绿色、环保的优质设备,将科技与安全性完美地结合在一起…

【面试突击】注册中心面试实战

🌈🌈🌈🌈🌈🌈🌈🌈 欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…

uniapp 如何使用echarts 以及解决tooltip自定义不生效问题

使用的是echarts-for-wx插件&#xff1b; 正常写法案例&#xff1a;给tooltip数值加个% <template><view><uni-ec-canvas class"uni-ec-canvas"id"uni-ec-canvas"ref"canvas"canvas-id"uni-ec-canvas":ec"ec&quo…

蚁群算法(ACO)解决旅行商(TSP)问题的python实现

TSP问题 旅行商问题&#xff08;Travelling Salesman Problem, 简记TSP&#xff0c;亦称货郎担问题)&#xff1a;设有n个城市和距离矩阵D [dij]&#xff0c;其中dij表示城市i到城市j的距离&#xff0c;i, j 1, 2 … n&#xff0c;则问题是要找出遍访每个城市恰好一次的一条回…

Salesforce财务状况分析

纵观Salesforce发展史和十几年财报中的信息&#xff0c;Salesforce从中小企业CRM服务的蓝海市场切入&#xff0c;但受限于中小企业的生命周期价值和每用户平均收入小且获客成本和流失率不对等&#xff0c;蓝海同时也是死海。 Salesforce通过收购逐渐补足品牌和产品两块短板&am…

Unity中URP下实现深度贴花

文章目录 前言一、场景设置二、实现思路1、通过深度图求出像素所在视图空间的Z值2、通过模型面片的求出像素在观察空间下的坐标值3、结合两者求出 深度图中像素的 XYZ值4、再将此坐标转换到模型的本地空间&#xff0c;把XY作为UV来进行纹理采样 三、URP下实现1、通过深度图求出…

使用Sqoop将数据从Hadoop导出到关系型数据库

当将数据从Hadoop导出到关系型数据库时&#xff0c;Apache Sqoop是一个非常有用的工具。Sqoop可以轻松地将大数据存储中的数据导出到常见的关系型数据库&#xff0c;如MySQL、Oracle、SQL Server等。本文将深入介绍如何使用Sqoop进行数据导出&#xff0c;并提供详细的示例代码&…

Leetcode10035. 对角线最长的矩形的面积

Every day a Leetcode 题目来源&#xff1a;10035. 对角线最长的矩形的面积 解法1&#xff1a;模拟 给你一个下标从 0 开始的二维整数数组 dimensions。 对于所有下标 i&#xff08;0 < i < dimensions.length&#xff09;&#xff0c;dimensions[i][0] 表示矩形 i …

【复现】Spider-Flow RCE漏洞(CVE-2024-0195)_16

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Spider Flow 是一个高度灵活可配置的爬虫平台&#xff0c;用户无需编写代码&#xff0c;以流程图的方式&#xff0c;即可实现爬虫…

android studio设置gradle和gradle JDK版本

文章目录 1.gradle JDK版本2.gradle版本 1.gradle JDK版本 file -> project structure -> SDK Location -> Gradle Settings -> Gradle JDK -> Download JDK 2.gradle版本 file -> project structure -> Project

在线海报图片设计器、图片编辑器,仿照稿定设计

源码介绍 在线海报设计系统素材设计源码是一个漂亮且功能强大的在线海报图片设计器&#xff0c;仿照稿定设计而成。该系统适用于多种场景&#xff0c;包括海报图片生成、电商分享图、文章长图、视频/公众号封面等。用户无需下载软件&#xff0c;即可轻松实现创意&#xff0c;迅…

redis夯实之路-哨兵(Sentinel)机制详解

Sentinel&#xff08;哨兵&#xff09;保证了redis的高可用性&#xff0c;一个Sentinel或多个Sentinel组成的系统监视多个主从服务器&#xff0c;当主服务器下线时&#xff0c;自动将一个从服务器升级为主服务器。 sentinel的主要功能 集群监控&#xff1a;负责监控redis mas…

UG装配-多运动组合动画与自动创建装配路径

当圆盘在装配过程中既有旋转运动&#xff0c;又有直线运动的时候&#xff0c;我们需要用到序列中的抽取路径 抽取路径命令在如下位置&#xff0c;需要注意的是&#xff0c;使用抽取路径前&#xff0c;如果有其他零件与所取对象配合&#xff0c;需要先物体脱离或使用拆卸对其脱离…

基于Hadoop的网上购物行为大数据分析及预测系统【flask+echarts+机器学习】前后端交互

有需要本项目或者部署的系统可以私信博主&#xff0c;提供远程部署和讲解 本研究基于淘宝用户行为的开源数据展开大数据分析研究&#xff0c;通过Hadoop大数据分析平台对阿里天池公开的开源数据集进行多维度的用户行为分析&#xff0c;为电商销售提供可行性决策。 首先我们将大…

Java LeetCode刷题 单调栈

单调栈 单调栈概念 每日温度 单调栈 概念 单调栈&#xff08;Monotonic Stack&#xff09;是一个特殊的数据结构&#xff0c;它是一种栈&#xff0c;但具有单调性的特性。单调栈有两种类型&#xff1a;单调递增栈和单调递减栈。 在单调递增栈中&#xff0c;栈内的元素保持递…

【JAVA】谈谈 ReadWriteLock 和 StampedLock

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 ReadWriteLock&#xff08;读写锁&#xff09; 基本原理&#xff1a; 接口和实现&#xff1a; 用法示例&#xff1a; StampedL…

UE5 简易MC教程学习心得

https://www.bilibili.com/video/BV12G411J7hV?p13&spm_id_frompageDriver&vd_sourceab35b4ab4f3968642ce6c3f773f85138 ———— 目录 0.摧毁逻辑学习 1.发光材质灯方块 2.封装。想让子类 不更改父类的变量。 3.材质命名习惯。 0.摧毁逻辑学习 达到摧毁的条件…

日志审计系统Agent项目创建——读取日志文件(Linux版本)

紧接着上一篇的分享&#xff0c;继续做日志文件的读取&#xff0c;点击连接即可日志文件初始化https://blog.csdn.net/wjl990316fddwjl/article/details/135553238 1、将指针移动到文件末尾 //文件移动到结尾fseek(fp, 0, SEEK_END); 2、定义当前指针的位置 lastPosition ft…

通义灵码 - 免费的阿里云 VS code Jetbrains AI 编码辅助工具

系列文章目录 前言 通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&#xff0c;并针对阿里云 SDK/OpenAPI 的使用…

专业130+总分400+杭州电子科技大学843信号与系统考研经验杭电信息通信

今年专业课130&#xff0c;数一130&#xff0c;初试总分400&#xff0c;顺利上岸杭电通信工程学院&#xff0c;回望这一年有得有失&#xff0c;总结了一些经验分享给大家&#xff0c;希望对大家复习有帮助。 我的初试备考从3月开始&#xff0c;持续到初试前&#xff0c;这中间…