C#中变量的类型

2023-11-08

值类型

C#中值类型的变量主要包括整数类型、浮点类型、decimal和bool类型等。值类型的变量都在堆栈中进行分配,因此效率很高。所以使用值类型的主要目的是为了提高性能。

  1. 整数类型
    整数类型代表的就是一个整数。当用户声明一个int类型时,系统就会分配内存来存储值。
  2. 浮点类型
    浮点类型的变量主要是对带有小数点的数据进行处理。
  3. decimal类型
    decimal关键字指示128位数据类型。与其他浮点型相比,decimal类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。
  4. bool类型
    众所周知,计算机实际上就是用二进制来表示各种数据的,即不管何种数据,在计算机内部都是采用二进制方式处理和存储的。布尔类型表示的逻辑变量只有两种取值:“真”和“假”。在C#中,分别采用true和false两个值来表示。
  5. 字符类型
    字符包括数字字符、英文字母、表达符号等,C#提供的字符类型按照国际上公认的标准,采用Unicode字符集。一个Unicode的标准字符长度为16位。

引用类型

C#的另一大数据类型是引用类型。“引用”这个词在这里的含义是,该类型的变量不直接存储包含的值,而是指向它所要存储的值。也就是说,引用类型存储实际数据的引用值的地址。

using System;
namespace Project9
{
    class Program
    {
        class A                         //创建一个类A
        {
            public int num = 0;       //声明一个公有int类型的变量num
        }
        static void Main()
        {
            int a = 0;              //定义int类型的变量a,并初始化为0
            int b = a;               //定义int类型的变量b,将a赋给b
            b = 100;                 //为变量b重新赋值为100
            Console.WriteLine("a={0}  b={1}", a, b);
            A n1 = new A();  //使用new关键字创建引用对象
            A n2 = n1;       //是n1等于n2
            n2.num = 200;    //为变量n2的num重新赋值
            Console.WriteLine("n1={0}  n2={1}", n1.num, n2.num);
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了引用类型变量的输出。由于引用类型的变量存储是对其数据(对象)的引用,而值类型的变量直接包含其数据,对于引用类型,两种变量可引用同一对象,因此,对一个变量执行的操作会影响另一个变量所引用的对象;对于值类型,每个变量都具有其自己的数据副本,对一个变量执行的操作不会影响另一个变量。所以,变量a的值没有受到变量b的影响,最后输出a与b的值不相同。

a=0  b=100
n1=200  n2=200

值类型与引用类型的区别

C#里面把数据类型分为两大类,分别为值类型和引用类型,值类型包括基本数据类型(int、char、double等),结构和枚举。引用类型包括接口、数组、类等。下面列出了这两大类的区别呢。

  1. 值类型
    值类型就是一个包含实际数据的量。即当定义一个值类型的变量时,C#会根据它所声明的类型,以栈方式分配一块大小相适应的存储区域给这个变量,随后对这个变量的读或写操作就直接在这块内存区域进行。
  2. 引用类型
    一个引用类型的变量不存储它们所代表的实际数据,而是存储实际数据的引用。引用类型分两步创建,首先在栈上创建一个引用变量,然后在堆上创建对象本身,再把这个内存的句柄(也是内存的首地址)赋给引用变量。

枚举类型

枚举类型也称为枚举,用于定义一组在逻辑上密不可分的整数值提供便于记忆的符号。枚举类型是使用enum关键字声明。

using System;
namespace Project10
{
    class Program
    {
        enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };   //使用enum创建枚举
        static void Main(string[] args)
        {
            int start = Convert.ToInt32(Days.Mon);   //将枚举值Mon赋给变量start
            int end = (int)Days.Fri;   //将枚举值Fri赋给变量end
            Console.WriteLine("Monday: {0}", start);
            Console.WriteLine("Friday: {0}", end);
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了枚举类型变量的输出。在代码中首先创建一个Days枚举,该枚举有7个值,分别表示周一到周日;然后通过逗号运算符访问Days枚举的Mon和Fri,并将这两个枚举值分别赋给变量start和end;最后输出变量start和end。

Monday: 1
Friday: 5

变量的作用域

变量的作用域指的是能够使用该变量的区域。作用域既作用于方法,也作用于变量。一个标识符的作用域是从声明该标识符的那个位置开始的,不管是变量还是方法都应如此。在C#中通常用“{”和“}”来界定变量的作用范围。
变量的作用域有着严格的要求,在声明变量时需要注意两点,首先变量名不要重复,其次声明变量的位置很重要。例如:

static void Main(string[] args)
{
    for (int i = 0; i < 5; i++)
    {
         int s = 100;
         Console.WriteLine(s);
    }
}

这是一个for循环语句,该语句的作用是循环输出5次变量s的值,而变量s在for循环外则并不能访问到。因为变量s在for循环内部声明,所以只能在for循环内部访问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#中变量的类型 的相关文章

  • 使用sqlbulkcopy之前如何创建表

    我有一个 DBF 文件 我正在尝试导入该文件 然后将其写入 SQL 表 我遇到的问题是 如果我使用 SqlBulkCopy 它需要我提前创建表 但在我的场景中这是不可能的 因为 dbf 文件不断变化 到目前为止 这是我的代码 public
  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • C# 中直接从 URL 获取图像尺寸

    我正在尝试使用以下代码直接从网络上获取图片的尺寸 string image http www hephaestusproject com csharp3 png byte imageData new WebClient DownloadDa
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • 在异步请求中使用超时回调

    我之前问过这个问题 但我将用提出的解决方案来完成这个问题 并提出另一个问题 我正在使用这个类来进行异步网络请求 http msdn microsoft com en us library system net webrequest aspx
  • 何时使用 C++ 私有继承而不是组合?

    你能给我一个具体的例子吗 什么时候使用私有继承优于组合 就我个人而言 我将使用组合而不是私有继承 但在某些情况下 使用私有继承可能是特定问题的最佳解决方案 正在阅读C faq http www parashift com c faq lit
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • 尽管浮点数相同,但它们并不相等? [复制]

    这个问题在这里已经有答案了 下面的程序输出This No is not same 当两个数字相同时为什么会这样做 void main float f 2 7 if f 2 7 printf This No is same else prin
  • 使用默认行为将模型绑定到接口

    我正在尝试将控制器操作绑定到接口 但仍保持默认的绑定行为 public class CoolClass ISomeInterface public DoSomething get set ISomeInterface public clas
  • 打开位置设置页面或提示用户启用位置

    我一直在绞尽脑汁 徒劳地谷歌搜索 我正在尝试找到一种方法来提示用户通过直接进入设置页面或仅点击屏幕上的 是 来切换位置 我见过的所有代码似乎都不起作用 有人有有效的方法吗 一个详细的例子将不胜感激 谢谢 我对 Xamarin 开发非常陌生
  • 应用新设置时如何防止 GraphicsDevice 被丢弃?

    我的游戏窗口允许手动调整大小 这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小 游戏还利用了RenderTarget2D rt2d 在主 Draw 方法中设置主渲染目标 GraphicsDevice SetRenderTarge
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • 如何解决文件被另一个进程使用的问题?

    我一直在 VS NET 2010 中调试 没有任何问题 但现在无法建造 我收到错误 Unable to copy file filename to bin Debug filename The process cannot access t
  • 在 C# 窗口应用程序中运行 C/C++ 控制台应用程序?

    现在 我想开发一个简单的应用程序 因此我决定最快的编码方式是 C NET 但现在 我很难实现我需要的功能之一 我想做的是在 C 应用程序的窗口内运行 C C 控制台应用程序 就像在虚幻前端中一样 添加一点通信方式 以便我可以为控制台应用程序
  • 使用方法的状态模式

    我正在尝试使用方法作为状态而不是类来基于状态模式的修改版本来实现一个简单的状态机 如下所示 private Action
  • 在两个点之间创建一条曲线,每个点都具有标准化向量

    因此 我需要一种写入方法来在两点之间创建一条曲线 每个点都有一个指向任意方向的归一化向量 我一直在尝试设计这样一种方法 但一直无法理解数学 在这里 由于一张图片胜过一千个文字 这就是我所需要的 在图中 矢量垂直于红线 我相信向量需要进行相同
  • boost::spirit::qi::语法和可变参数模板

    我在使用可变参数模板定义语法时面临一个问题 我首先定义一些包含在某些结构中的简单语法 例如纬度 经度 如下所示 include
  • 如何创建实体集或模型而不在数据库中创建相应的表 - 实体框架

    我的 sqlserver 数据库中有一个存储过程 它返回多个结果集 我正在使用 msdn 中的以下链接从实体框架中的 SP 读取多个结果集 https msdn microsoft com en us library jj691402 v

随机推荐

  • 手把手教你调用百度人脸识别API

    在百度AI开放平台使用百度的人脸识别能力 只需要三个核心步骤即可操作完成 获取接口权限 准备接口调用工具 进行接口调用 全部流程走通只需要十分钟时间 获取接口权限 获取接口权限是调用接口的前提 主要分为以下几步 1 进入百度云的人脸识别控制
  • Android开发——APP ANR治理

    一 背景介绍 ANR Application Not Response 指应用程序无响应 通常出现在主线程被阻塞时 并伴随ANR弹窗出现 ANR发生时要么关闭当前app 要么等待 然而等待的结果大概率还是继续ANR 最终需要杀掉应用进程 A
  • Java HashMap

    无知的我终于深入接触到了HashMap 如果有遇到有任何无法进展问题或者疑惑的地方 应该在讨论区留言 或者 其他途径以寻求及时的帮助 以加快学习效率 或者 培养独立解决问题的能力 扫清盲点 补充细节 目录 HashMap HashMap 机
  • go语言菜单树结构

    GO语言菜单树结构实现 Menu是数据库表映射 MenuTree是树结构菜单 目前只考虑2级菜单 后面附源码 亲测可用 package models import github com astaxie beego orm time type
  • Ecshop如何解决Deprecated: preg_replace()报错 (第二章)

    这些错误主要集中在 upload includes cls template php 文件中 1 line 300 原语句 return preg replace n e this gt select 1 KaTeX parse error
  • STM32引用“CmBacktrace”: ARM Cortex-M 系列 MCU 错误追踪库

    目录 概述 一 使用方法 0 CmBacktrace 是什么 1 为什么选择 CmBacktrace 2 CmBacktrace 如何使用 2 1 演示 2 2 Demo 2 3 移植说明 2 4 API 说明 2 5 常见问题 2 6 许
  • 【树莓派】error: command ‘/usr/bin/arm-linux-gnueabihf-gcc‘ failed with exit code 1(已解决)

    输入以下命令 export CFLAGS fcommon pip3 install RPi GPIO 参考网址 https askubuntu com questions 1290037 error while installing rpi
  • cpu与外设接口,cpu时序控制、电源时序控制(电源IC控制)

    目录 1 cpu与外设和存储器数据交换分别通过两种接口连接 I O接口和存储器接口 2 89C51单片机时钟电路和时序控制 3 CPU 指令周期 时序产生器和控制方式 重要 3 1 时序控制方式 4 使用通用电源IC实现电源时序控制的电路
  • PIP环境复制之requirements.txt

    1 requirements txt介绍 requirements txt顾名思义 程序的依赖 即一个项目所需要的依赖包列表 在项目平移的时候 或者程序所需要的环境过多 而不至于频繁的PIP requirements txt给此工作提供了方
  • 使用function_requires的Boost概念测试程序

    使用function requires的Boost概念测试程序 Boost是一个非常受欢迎的C 库集合 它为开发人员提供了许多实用的工具和库 以增强C 的功能和性能 其中之一是function requires概念 它可以用于在编译时检查函
  • 手把手带你撸zookeeper源码-客户端如何发送数据到zk集群服务端的

    接上篇文章继续分析 手把手带你撸zookeeper源码 zookeeper客户端如何和zk集群创建连接 上篇文章我们分析到了org apache zookeeper ClientCnxn SendThread primeConnection
  • 机器学习--PCA(主成分分析)原理及应用

    众所周知PCA是有效的降维方法 当你的特征非常多维度非常大的时候 为了使机器学习的算法在计算或是训练的时候有更高的效率 通常会进行降维处理 将一个具有m个数据n维的数据降为k维的数据 方法如下 算出一个sigma矩阵 x i 为n 1的矩阵
  • dmg文件 linux,安装和使用Dmg2Img在Linux上创建macOS安装盘

    本文介绍安装和使用Dmg2Img的方法 以在Linux操作系统上创建macOS安装盘 在Linux中安装Dmg2Img 在能够创建新的安装映像之前 必须在计算机上安装Dmg2Img应用程序 Dmg2Img能在众多主流Linux发行版中安装
  • Keil5调试代码时关于警告及错误信息的处理

    图一 Warning 图二 NoWarning Keil中出现warning 160 D unrecognized pragma这样的错误怎么解决 答 每一种开发环境支持的 pragma是不一样的 不支持的就不能用了 例如图一中的messa
  • 安装ubuntu分区设置

    一般来说 在linux系统中都有最少两个挂载点 分别是 根目录 及 swap 交换分区 其中 是必须的 一般来说我们最少需要两个分区 需要一个SWAP分区 和一个 分区 但把一些常用 重要的挂载点分到其它分区 这样便于管理 一般一个 分区
  • 对faster rcnn的一些修改

    在network py中修改anchor scales 第262行 def create architecture self sess mode num classes tag None anchor scales 8 16 32 anch
  • Linux中FTP传输协议

    目录 一 ftp的简介 实验一 匿名传输 1 配置文件 etc vsftpd vsftpd conf 2 在 var ftp pub中新建文件并写数据 3 在cmd中连接虚拟机 4 向真机发送文件 5 向虚拟机发送文件 实验二 禁止任意用户
  • c语言简易密码本爆破

    代码如下 实现原理比较简单 通过读取txt文件密码本与内置好的密码口令进行对比 密码本可以在网页上找 也可以用这个密码字典下载 弱口令字典下载 密码字典 迷你下载站为大家分享这个弱口令字典文件 它列出了多款规则的密码 有需要的大神们可以参考
  • 485、CAN、单总线、SPI、I2C的概念,特点,协议,使用方法及通信方式,还有它们之间的区别

    一 概念 1 485 485 一般称作 RS485 EIA 485 是隶属于 OSI 模型物理层的电气特性规定为 2 线 半双工 多点通信的标准 它的电气特性和 RS 232 大不一样 用缆线两端的电压差值来表示传递信号 2 CAN CAN
  • C#中变量的类型

    文章目录 值类型 引用类型 值类型与引用类型的区别 枚举类型 变量的作用域 值类型 C 中值类型的变量主要包括整数类型 浮点类型 decimal和bool类型等 值类型的变量都在堆栈中进行分配 因此效率很高 所以使用值类型的主要目的是为了提