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; //拆箱
}

 

posted @   owmt  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示