C# 数据类型||C# 类型转换

原文:C# 类型转换_w3cschool

(注:本文为教程文章,请勿标记为付费文章!特此声明)

C# 数据类型

在 C# 中,变量分为以下几种类型:

  • 值类型(Value types)
  • 引用类型(Reference types)
  • 指针类型(Pointer types)

值类型(Value types)

值类型变量可以直接分配给一个值。它们是从类 System.ValueType 中派生的。

值类型直接包含数据。比如 int、char、float ,它们分别存储数字、字母、浮点数。当您声明一个 int 类型时,系统分配内存来存储值。

下表列出了 C# 2010 中可用的值类型:

类型 描述 范围 默认值
bool 布尔值 True 或 False False
byte 8 位无符号整数 0 到 255 0
char 16 位 Unicode 字符 U +0000 到 U +ffff ''
decimal 128 位精确的十进制值,28-29 有效位数 (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 0.0M
double 64 位双精度浮点型 (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 0.0D
float 32 位单精度浮点型 -3.4 x 1038 到 + 3.4 x 1038 0.0F
int 32 位有符号整数类型 -2,147,483,648 到 2,147,483,647 0
long 64 位有符号整数类型 -923,372,036,854,775,808 到 9,223,372,036,854,775,807 0L
sbyte 8 位有符号整数类型 -128 到 127 0
short 16 位有符号整数类型 -32,768 到 32,767 0
uint 32 位无符号整数类型 0 到 4,294,967,295 0
ulong 64 位无符号整数类型 0 到 18,446,744,073,709,551,615 0
ushort 16 位无符号整数类型 0 到 65,535 0

如需得到一个类型或一个变量在特定平台上的准确尺寸,可以使用 sizeof 方法。表达式 sizeof(type) 产生以字节为单位存储对象或类型的存储尺寸。下面举例获取任何机器上 int 类型的存储尺寸:

复制代码
using System;
namespace DataTypeApplication{
   class Program{
      static void Main(string[] args){
         Console.WriteLine("Size of int: {0}", sizeof(int));
         Console.ReadLine();
      }
   }
}

尝试一下

当上面的代码被编译和执行时,它会产生下列结果:

复制代码
Size of int: 4

引用类型(Reference types)

引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。

换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的 引用类型有:objectdynamicstring


对象(Object)类型

对象(Object)类型 是 C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。Object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。

当一个值类型转换为对象类型时,则被称为 装箱 ;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱

复制代码
object obj;
obj = 100; // 这是装箱

知识点补充:关于装箱和拆箱

装箱:值类型转换为对象类型,示例:

复制代码
int val = 8;
object obj = val;//整型数据转换为了对象类型(装箱)

拆箱:之前由值类型转换而来的对象类型再转回值类型,例子:

复制代码
int val = 8;
object obj = val;//先装箱
int nval = (int)obj;//再拆箱

注意:只有装过箱的数据才能拆箱。


动态(Dynamic)类型

您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。

声明动态类型的语法:

复制代码
dynamic <variable_name> = value;

例如:

复制代码
dynamic d = 20;

动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。


字符串(String)类型

字符串(String)类型 允许您给变量分配任何字符串值。字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。

例如:

复制代码
String str = "w3cschool.cn";

一个 @引号字符串:

复制代码
@"w3cschool.cn";

C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待,比如:

复制代码
string str = @"C:\Windows";

等价于:

复制代码
string str = "C:\\Windows";

@ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。

复制代码
string str = @"<script type=""text/javascript"">
    <!--     -->
    </script>";

用户自定义引用类型有:classinterfacedelegate。我们将在以后的章节中讨论这些类型。


指针类型(Pointer types)

指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。

声明指针类型的语法:

复制代码
type* identifier;

例如:

复制代码
char* cptr;
int* iptr;

我们将在章节"不安全的代码"中讨论指针类型。

C# 类型转换

类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在 C# 中,类型转换有两种形式:

  • 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换。例如,从小的整数类型(int )转换为大的整数类型(long),从派生类转换为基类。
  • 显式类型转换 - 这些转换是通过用户使用预定义的函数显式完成的。显式转换需要强制转换运算符。

下面的实例显示了一个显式的类型转换:

复制代码
using System;
namespace TypeConversionApplication{
    class ExplicitConversion{
        static void Main(string[] args){
            double d = 5673.74;
            int i;

            // 强制转换 double 为 int
            i = (int)d;
            Console.WriteLine(i);
            Console.ReadKey();
        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

复制代码
5673

C# 类型转换方法

C# 提供了下列内置的类型转换方法:

序号 方法 & 描述
1 ToBoolean 把类型转换为布尔型(如果可以转换的话)
2 ToByte 把类型转换为字节类型。
3 ToChar 把类型转换为单个 Unicode 字符类型(如果可以转换的话)
4 ToDateTime 把类型(整数或字符串类型)转换为 日期-时间 结构。
5 ToDecimal 把浮点型或整数类型转换为十进制类型。
6 ToDouble 把类型转换为双精度浮点型。
7 ToInt16 把类型转换为 16 位整数类型。
8 ToInt32 把类型转换为 32 位整数类型。
9 ToInt64 把类型转换为 64 位整数类型。
10 ToSbyte 把类型转换为有符号字节类型。
11 ToSingle 把类型转换为小浮点数类型。
12 ToString 把类型转换为字符串类型。
13 ToType 把类型转换为指定类型。
14 ToUInt16 把类型转换为 16 位无符号整数类型。
15 ToUInt32 把类型转换为 32 位无符号整数类型。
16 ToUInt64 把类型转换为 64 位无符号整数类型。

下面的实例把不同值的类型转换为字符串类型:

复制代码
using System;
namespace TypeConversionApplication{
    class StringConversion{
        static void Main(string[] args){
            int i = 75;
            float f = 53.005f;
            double d = 2345.7652;
            bool b = true;

            Console.WriteLine(i.ToString());
            Console.WriteLine(f.ToString());
            Console.WriteLine(d.ToString());
            Console.WriteLine(b.ToString());
            Console.ReadKey();
        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

复制代码
75
53.005
2345.7652
True

类型之间的转换方法 - Convert 和 Parse

复制代码
string locstr = 123.ToString();

//如果要将"locstr"转成整型数

//方法一: 用 Convert 
int i = Convert.ToInt16(locstr);

//方法二: 用 Parse
int ii = int.Parse(locstr);
相关推荐
TPBoreas2 小时前
Jenkins 改完端口号启动不起来了
java·开发语言
金斗潼关3 小时前
SpringCloud GateWay网关
java·spring cloud·gateway
JK0x073 小时前
代码随想录算法训练营 Day40 动态规划Ⅷ 股票问题
算法·动态规划
Feliz..3 小时前
关于离散化算法的看法与感悟
算法
水蓝烟雨3 小时前
1128. 等价多米诺骨牌对的数量
算法·hot 100
codists3 小时前
《算法导论(第4版)》阅读笔记:p11-p13
算法
秋名RG4 小时前
深入解析建造者模式(Builder Pattern)——以Java实现复杂对象构建的艺术
java·开发语言·建造者模式
eternal__day4 小时前
Spring Boot 实现验证码生成与校验:从零开始构建安全登录系统
java·spring boot·后端·安全·java-ee·学习方法
陈大爷(有低保)5 小时前
swagger3融入springboot
java
Kidddddult5 小时前
力扣刷题Day 43:矩阵置零(73)
算法·leetcode·力扣