百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

C#编程零基础到入门学习-C# 值类型和引用类型(4-8)

bigegpt 2024-08-18 14:04 2 浏览

在C#中,根据这些数据类型在内存中存储值的方式对它们进行分类。

C#包括以下类别的数据类型:

  1. 值类型
  2. 引用类型
  3. 指针类型

值类型

在C#中,值类型是一种用于存储简单数据的数据类型,它们直接存储数据的实际值,而不是指向数据的引用(类似快捷方式)。值类型在内存中被分配在堆栈上。

所有值类型都从System.ValueType派生,而System.ValueType又从System.Object派生。

派生:派生是指创建一个新的类,该类继承自一个或多个现有的类。派生类可以获得基类的属性和方法,并可以添加自己的属性和方法,以及重写基类的方法。暂时还没有学到派生的概念,这里紧紧提一下,知道有这个概念就行,后面会陆续介绍包括与其相关的一些概念和用法还有堆栈的一些相关知识。

例如,整数变量 int i= 100;

系统将100存储在为变量 i 分配内存空间中。实际上读取的就是内存地址所对应的值(比较拗口,仔细读好好品哈)

下图说明了如何将100存储在“i”的内存(0x239110)中的(假设)位置:

值类型汇总:

  • bool byte char decimal double enum float int long sbyte short
  • struct uint ulong ushort

C#中的值类型包括以下几种常见的类型介绍:

后面会慢慢的把前面学过的一些知识嵌入到后面的内容里面,您有可能会看到与前些文章内容相识或相近的知识点,省的往前面翻了。

  1. 数值类型:包括整数类型(如int、long、short等)和浮点数类型(如float、double、decimal等)。
  2. 布尔类型:bool,表示逻辑值,只有两个可能的值:true或false。
  3. 字符类型:char,表示单个字符。
  4. 枚举类型:enum,表示一组具名常量的集合。
  5. 结构体类型:struct,表示用户自定义的值类型,可以包含多个字段。

值类型具有以下特点:

1、值类型的变量直接存储数据的值,而不是引用。这意味着当一个值类型的变量被赋值给另一个变量时,实际的值会被复制。

2、值类型在内存中被分配在堆栈上,而不是在托管堆中。这使得值类型的访问速度更快,但也限制了它们的大小和生存周期。

3、值类型是不可变的,即它们的值不能被修改。当对一个值类型的变量进行修改时,实际上是创建了一个新的值,并将其赋值给变量。

4、值类型的默认值是其零值,例如0、false或null(对于可空类型)。

使用值类型可以提高程序的性能,因为它们占用的空间较小,并且在传递参数或赋值时具有复制的特性。然而,需要注意的是,对于较大的数据结构或需要频繁修改值的情况,可能会导致性能下降。在这种情况下,可以考虑使用引用类型来代替。

enum和struct还没有学到,可以不用在意细节了,后面会陆续介绍,知道是值类型就行。

传递值类型变量

当将值类型的变量从一种方法传递到另一种方法时,系统会在另一种方法中创建变量的单独副本。如果在一个方法中更改了值,则不会影响另一方法中的变量。

示例代码:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ValueTypeAndReferenceType//命名空间
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int i = 100;//首先定义了一个整数变量i并初始化为100
            Console.WriteLine(i);
            ChangeValue(i);
            Console.WriteLine(i);//在调用ChangeValue方法之前将number的值打印到控制台,这时输出的结果为100
        }
        static void ChangeValue(int x)//首先定义了一个整数变量x并初始化为200
        {
            x = 200;
            Console.WriteLine(x);
        }
    }
}


即使在将 Main ()方法中的变量 i 传递给 ChangeValue ()方法并更改其值之后,它仍然保持不变.

引用类型

与值类型不同,引用类型不会直接存储其值。相反,它存储正在存储值的地址。换句话说,引用类型包含指向另一个保存数据的存储位置的指针(比喻为酒店的房间编号)。先不要纠结于指针。

 string S= "Hello World";  

上图系统为变量s选择内存中的随机位置(0x803200)。变量s的值为0x600000,这是实际数据值的内存地址。因此,引用类型存储实际值所在位置的地址,而不是值本身。

涉及到:

S的内存位置的值为(0x803200

S的值位置(0x600000

S的值(helloworld!)

S的值位置(0x600000)所对应(引用)的值是S的值(helloworld!)

有时候不太好理解。

以下是引用类型数据类型:

  • 字符串 数组(即使它们的元素是值类型) 类 委托

类、委托还没有学到这里可以稍作了解即可,后面有详细介绍。

传递引用类型变量

当将引用类型变量从一个方法传递到另一个方法时,它不会创建新的副本; 相反,它会传递变量的地址。因此,如果我们改变方法中变量的值,它也会反映在调用方法中。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ReferenceType
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Student std1 = new Student();
            std1.StudentName = "LiSi";
            Console.WriteLine("第1个值:{0}",std1.StudentName);//未传递前为LiSi
            ChangeReferenceType(std1);//传递值zhangsan
            Console.WriteLine("第2个值:{0}", std1.StudentName);//传递后为ZhangSan
        }
        static void ChangeReferenceType(Student std2)
        {
            std2.StudentName = "ZhangSan";
            Console.WriteLine(std2.StudentName);//std2的为zhangsan
        }
        public class Student
        {
            public string StudentName;
        }
    }
}


在上面的示例中,我们将 Student 对象 std1 传递给ChangeReferenceType()方法。在这里,它实际上传递std1的内存地址。因此,当ChangeReferenceType()方法更改StudentName时,它实际上是在更改std1对象的StudentName,因为std1和std2都指向内存中的同一地址。

Null 值

引用类型变量的默认值null是未初始化时。 Null表示不引用任何对象。

值类型变量不能为null,因为它保存值而不是内存地址。C#2.0引入了可为空的类型,使用它可以为值类型变量分配null或声明值类型变量而无需为其分配值。



相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...