Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


程序:csharp:数据类型

C#数据类型

一个变量只不过是一个供程序操作的存储区的名字


C#中的变量分为:

  • 值类型
  • 引用类型
  • 指针类型
Console.WriteLine(typeof(int)); // 使用typeof(x)得到类型
Console.WriteLine(sizeof(int)); // 使用sizeof(x)得到大小

值类型

值类型直接存储数据,值类型也属于类,是从System.ValueType派生来的(这是判断依据),但是值类型的继承机制是不允许用户自己改变的。常用的一些值类型如下,有些默认的数据长度和C不一样。

类型 描述
bool 布尔值(True或False)
byte 8位无符号整数
sbyte 8位有符号整数
short 16位有符号整数
ushort 16位无符号整数
int 32位有符号整数
uint 32位无符号整数
long 64位有符号整数
ulong 64位无符号整数
float 32位浮点数
double 64位浮点数
decimal 128位浮点数
char 16位Unicode字符

引用类型

引用类型存储的是对数据的引用,主要有以下3类:

object

这是一个通用类型,可以被分配任何类型的值,但是在分配值之前需要进行类型转换(装箱/拆箱),转换是在编译过程中完成的。object是C#的一个保留关键字,是一个数据类型;而Object是一个类,一般是系统提供的System.Object类。
问题:type不是类型,System.Type是类型,对吗?

dynamic

和object类似,这也是一个通用类型,但是dynamic的类型检查是在运行时发生的。

string

字符串类型。string是C#的一个保留关键字,是一个数据类型;而String是一个类,一般是系统提供的System.String类。

string Path1 = "C:\\Windows"; // 普通字符串
string Path2 = @"C:\Windows"; // 逐字字符串,将反斜杠当作普通字符对待
Console.WriteLine(Path1);
Console.WriteLine(Path2);
// 关于引用类型的一些问题
static void Main(string[] args)
{
 
    string Str1 = "Hello!"; // 真正的数据是这个字符串常量
    string Str2 = Str1; // 这里应该不会复制数据吧,复制也太蠢了
    string Str3 = Str1;
    Console.WriteLine(Str1 + Str2 + Str3);
 
    Str1 = "Again!"; // 这不是修改数据,而是引用新的内存
    Console.WriteLine(Str1 + Str2 + Str3); // 只有Str1变化了
 
    // 现在Str2和Str3是引用同一个位置的
    // 如果通过Str2修改其引用的数据呢?
    // 答案是禁止修改,无法通过安全的方式修改其引用的数据
}

注意:数组也是引用类型

指针类型

一般都需要显式打开allow unsafe code才能使用指针

指针类型和C中的指针类似。

类和结构体

结构体是值类型(类是引用类型),不能继承,可以有成员函数。

关于结构体:

  • 结构体不能定义析构函数
  • 结构体不能声明没有参数的构造函数,无参的构造函数是默认生成的,且不能被改变
  • 结构体不能继承
  • 结构体可以使用new创建,创建的时候会调用对应的构造函数
  • 结构体也可以不使用new创建,这时必须手动为所有字段附初值后结构体才能使用
// 结构体是按值传递的
using System;
 
public class MainApp
{
    struct Data
    {
        public int m_Number;
 
        public void Log()
        {
            Console.WriteLine ($"Number = {m_Number}");
        }
    }
 
    static void ProcessRef(ref Data data)
    {
        data.m_Number = 20;   
    }
 
    static void Process(Data data)
    {
        data.m_Number = 10;
    }
 
    public static void Main(string[] args)
    {
        Data data = new Data();
        data.Log(); // Number = 0
 
        Process(data);
        data.Log(); // Number = 0
 
        ProcessRef(ref data);
        data.Log(); // Number = 20
    }
}

类型转换

显式类型转换

double D = 3.14;
int I = (int)D; // 使用括号
Console.WriteLine(I); // 可能会丢失数据

隐式类型转换

int Small = 1;
long Big = Small; // 安全的转换会自动进行

var声明变量

var关键字用来隐式地声明一个数据类型,变量类型是在编译期确定的,而不是在运行时确定的。和C++的auto一样,变量类型确定之后就不能再更改。var让写法更简短,并且var变量是一个强类型。

default默认值

default是C#的一个关键字,用于返回对应数据类型的默认值,使用方法:

int x = default(int);

其中:

  • 值类型返回0值
  • 引用类型返回null
  • 结构体所有成员以0值构造
/var/www/DokuWikiStick/dokuwiki/data/pages/程序/csharp/数据类型.txt · Last modified: 2023/04/26 11:39 by zh