首页 > 编程语言 >C#学习笔记-类型、变量、对象

C#学习笔记-类型、变量、对象

时间:2024-02-04 11:12:40浏览次数:22  
标签:obj 变量 C# 数据类型 笔记 内存 类型

数据类型

  数据类型是性质相同的值的集合,并且伴随着针对不同数据类型的操作。例如 int 和 double 类型,这两种类型在内存中的存储方式不一样,进行各种运算及操作的方式也不一样。容纳数据的内存过小会导致数据丢失精度,容纳的内存过大则会浪费内存空间。

  C#是强类型语言,数据受数据类型约束,不允许将一个类型的值赋给另一个类型,如果不强制转换则永远为该类型。而JavaScript为弱类型语言,允许将不同类型的数据赋给一个变量,数据不受数据类型约束。

int x = 100;
//将 int 类型的值赋给 bool 类型在C#中是不允许的
//但是在C语言中可以
if(x = 100)
{
    ...
}
//为了避免比较变成赋值,C语言中一般采用下述写法
if(100 == x)
{
    ...
}

  C#在4.0后引入了 dynamic 数据类型,以此来对弱类型进行模仿,但C#仍为强类型语言。

static void Main(string[] args)
{
    dynamic myVar = 500;
    Console.WriteLine(myVar);

    myVar = "Hello Dynamic!";
    Console.WriteLine(myVar);
}

类型的作用

  类型指出存储此类型变量所需的内存空间大小,可以存放的最大最小值。类型占内存空间的大小影响类型可表示的范围。一个类型知道它的基类型是谁,也知道自己包含哪些成员。

Type myType = typeof(Form);
Console.WriteLine(myType.BaseType.BaseType); //打印类型名称

PropertyInfo[] propInfo = myType.GetProperties();
            

foreach (var p in propInfo)
{
    Console.WriteLine(p.Name);//打印类型的成员名
}

MethodInfo[] methodInof = myType.GetMethods();
foreach(var m in methodInof)
{
    Console.WriteLine(m.Name);//打印类型的方法名
}

 C#中的数据类型

  类:Window、Form、Console、String

  结构体:Int32、Int64、Single、Double

  枚举:HorizontalAlignment、Visibility

  接口(Interface)

  委托(delegates)

  C#类型系统包括引用类型值类型两种。引用类型包括类、接口、委托,值类型包括结构体、枚举,所有类型都以 object 类型为基类型。

变量、对象与内存

   每个变量对应一个类型,决定哪些值可以存入变量。变量不仅存储数据,还标识了以变量名所对应的内存地址为起点、数据类型所要求的存储空间为长度的一块内存区域。值类型没有实例,值类型变量的值存储在内存的栈中。引用类型变量的实例数据存储在堆内存中,引用类型变量本身只存储实例数据在堆内存中的地址。局部变量在栈中分配内存,常量变量声明时必须初始化,初始化后不可再对其进行修改。

class Student
{
    private uint ID;
    private ushort Score;
}

class Program
{ 
    static void Main(string[] args)
    {   
        //stu为引用类型变量,也是局部变量,在栈分配内存。
        //但stu所指向的实例(对象)数据成员在堆中分配内存。
        Student stu = new Student();
    }   
}

装箱和拆箱

  假设声明了局部变量 x,x 在栈上分配内存并存入值100。此时如果把变量 x 赋给 object 类型的变量 obj,由于 obj 变量是引用类型变量,计算机发现obj变量所要引用的值不是堆内存中的实例,而是栈上的值类型,那么就会把 x 的值复制一份到堆中,并将其堆内存地址赋给 obj 变量。这个过程叫装箱。从堆内存中,将 obj 变量引用的值复制到变量 y 分配的栈内存中,这个过程称为拆箱。装箱和拆箱会损失程序的性能。

static void Main(string[] args)
{
    int x = 100;
    object obj = x;   //装箱
    int y = (int)obj; //拆箱
}

 

标签:obj,变量,C#,数据类型,笔记,内存,类型
From: https://www.cnblogs.com/owmt/p/17985353

相关文章

  • apache如何实现只转发到正常运行的服务
    要实现Apache只转发请求到正常运行的服务,可以通过使用mod_proxy和mod_proxy_balancer模块的健康检查(HealthCheck)功能来完成。这将允许Apache周期性地检查后端服务的健康状况,并仅将请求转发到那些响应正常的服务。下面是如何配置Apache以实现此功能的步骤:1.启用必要的模块:首先,确......
  • vSphere上启用嵌套虚拟化运行Proxmox VE和DoraCloud,虚拟机无法访问物理网络问题
    在vSphere上部署ProxmoxVE,然后在ProxmoxVE内部署DoraCloud桌面云系统。首先遇到的一个问题是安装ProxmoxVE时,提示不支持嵌套虚拟化。解决方法:在vSphere中为ProxmoxVE这个虚拟机启用嵌套,即让vSphereESXi向虚拟机暴露硬件虚拟化的支持。这样ProxmoxVE可以正常检测到硬......
  • pytorch数据集加载Dataset
    一、Dataset基类介绍在torch中提供了数据集的基类torch.utils.data.Dataset,继承这个基类,可以快速实现对数据的加载torch.utils.data.Dataset的源码如下:classDataset(Generic[T_co]):r"""Anabstractclassrepresentinga:class:`Dataset`.Alldatasetsthatrep......
  • Object.assign详解(对象的浅拷贝以及合并)
    Object.assign详解 一、Object.assign是什么?首先了解下Object.assign()是什么。我们先看看ES6官方文档是怎么介绍的?Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。简单来说,就是Object.assign()是对象的静态方法,可以用......
  • ACM基础数论笔记
    基础数论部分整除定义设\(a,b\inZ,a\neq0,若\existq\inZ使得b=aq\),则b可被a整除,记作\(a\midb\),称b是a的倍数,a是b的约数不能整除\(a\nmidb\)定理\(a\mid{b}\iff-a\mid{b}\iffa\mid{-b}\iff|a|\mid|b|\)\(a\midb且b\midc\Rightarrowa\midc\)\(a\midb且a......
  • 如何使用Truffle在VSCode中调试solidity合约
    简介Truffle是以太坊最流行的开发框架,能够在本地编译、部署智能合约,使命是让开发更容易。本文以fibonacci作为实例进行调试参考文档https://trufflesuite.com/docs/truffle/how-to/debug-test/use-the-truffle-debugger/https://trufflesuite.com/guides/debugger-variable-i......
  • 数位dp笔记
    数位dp学习笔记数位dp的问题题型一般是给定一个闭区间[L,R],求这个区间中满足“某种条件”的数的个数的总数对于这类问题,我们首先统计[L,R]范围的满足条件的数字转化成统计[1,N]内满足条件的数字的数量那么ans[L,R]=ans[1,R]-ans[1,L-1];先将n转换成字符串str,使用记忆化搜索......
  • 读论文-协同过滤技术综述(A Survey of Collaborative Filtering Techniques)
    前言今天读的一篇论文题目为《协同过滤技术综述》(ASurveyofCollaborativeFilteringTechniques),文章发表于《人工智能研究进展》(AdvancesinArtificialIntelligence)。要引用这篇论文,请使用下述格式:XiaoyuanSu,TaghiM.Khoshgoftaar,"ASurveyofCollaborativeF......
  • 【K8S】namespace 一直处在terminating状态
    1、想要去删除k8s中的一个指定命名空间,刚开始使用命令kubectldeletens命名空间的名字#或者使用kubectldeletens命名空间的名字--force--grace-period=0使用以上两种命令均无法成功删除命名空间,只会使命名空间的状态为Terminating状态2、使用以下方法成功删除1)使......
  • usb相关的内核线程占用cpu较高
    1.在ls1028的平台上,升级内核版本,从5.4-->5.10,出现usb相关的内核线程占用cpu较高问题。/sys/bus/usb/devices/usbx/power/''其中,x为设备id文件:-power/wakeup--enable/disabled,代表是否支持remotewakeup功能,即系统唤醒功能。常见如鼠标,键盘等HID设......