[.NET大牛之路 011] C# 基础:数据类型

从这节课开始,我们一起来过一下 C# 基础知识点。因为每个人的基础不一样,这部分内容大家请根据需要选择性地阅读。

01 基本数据类型

像其它编程语言一样,C# 定义了基本数据类型,用来表示局部变量、类数据成员变量、方法返回值和参数。下表列出了每个系统数据类型、它的取值范围及相应的 C# 关键字:

[.NET大牛之路 011] C# 基础:数据类型

系统类型(如 Int32)都在 System 命名空间中,数据类型关键字其实就是系统类型的简写。比如使用 int 声明一个变量和使用 System.Int32 是一样的:

int myInt = 0;
// 等同于:
System.Int32 myInt = 0;

使用数据类型声明变量有如下形式:

// 先声明变量,再赋值
string myString;
myString = "This is a string";

// 声明变量的同时赋值
int myInt = 0;

// 同类型的变量可以放在一起声明和赋值
bool b1 = true, b2 = false, b3 = b1;

每个类型最终都派生自 System.Object,它定义了所有类型共有的一组方法(如 ToString()Equals()GetHashCode())。

还要注意的是,数字数据类型都继承自一个名为 System.ValueType 的类,代表该类型为值类型。值类型会自动在栈中分配,因此有可预测的生命周期,并且相当高效。另一方面,那些不继承 System.ValueType 的类型(如 System.TypeSystem.StringSystem.Array 等)不在栈中分配,而是在堆中分配,由垃圾回收器管理其生命周期。

02 数据类型的默认值

所有的基本数据类型都支持默认的无参构造函数。这允许你使用 new 关键字创建一个变量,该关键字会自动将该变量的值设置为默认值。

每个基本数据类型都有其默认值:

  • bool 类型默认值是 false
  • 数字类型(如intfloat等)默认值都是 0
  • 字符串和 Object 类型默认值为  null
  • 日期类型默认为 0001/1/1 0:00:00

声明变量后,必须在使用前对其进行赋值,否则会在编译时报错。如果在声明时不确定变量的初值,可以通过 new 来给变量赋默认值:

bool b = new bool(); // false
int i = new int(); // 0
double d = new double(); // 0

// C# 9 语法
bool b = new(); // false
int i = new(); // 0
double d = new(); // 0

也可以直接使用 default 关键字:

bool b = default; // false

03 隐式类型

C# 语言提供了使用 var 关键字对局部变量进行隐式声明。使用 var 关键字代替指定一个特定的数据类型(如 intbool 等)时,编译器将根据初始值自动推断出底层数据类型。例如:

var myUInt = 0U;
var myInt = 0;
var myLong = 0L;
var myDouble = 0.5;
var myFloat = 0.5F;
var myDecimal = 0.5M;
var myBool = true;
var myString = "this is a string";

Console.WriteLine("myUInt is a: {0}", myUInt.GetType().Name);
Console.WriteLine("myInt is a: {0}", myInt.GetType().Name);
Console.WriteLine("myLong is a: {0}", myLong.GetType().Name);
Console.WriteLine("myDouble is a: {0}", myDouble.GetType().Name);
Console.WriteLine("myFloat is a: {0}", myFloat.GetType().Name);
Console.WriteLine("myDecimal is a: {0}", myDecimal.GetType().Name);
Console.WriteLine("myBool is a: {0}", myBool.GetType().Name);
Console.WriteLine("myString is a: {0}", myString.GetType().Name);

输出:

myUInt is a: UInt32
myInt is a: Int32
myLong is a: Int64
myDouble is a: Double
myFloat is a: Single
myDecimal is a: Decimal
myBool is a: Boolean
myString is a: String

整数默认为 Int32,小数默认为 Double,其它数字类型需要添加后缀来显示声明类型。

关于 var 关键字的使用,有各种限制。首先,隐式类型只适用于方法或属性范围内的局部变量,使用 var 关键字来定义返回值、参数或类的字段是非法的。其次,用 var 关键字声明的局部变量必须在声明时被分配一个初始值,初始值不能是 null,因为编译器不能只根据 null 来推断变量的类型。

根据 .NET 团队编制的编码规范,建议只在能从等式右边明确知道变量类型或不关心变量类型的时候使用隐式类型。比如:

// 可以从等式右边明确知道变量是什么类型
var myString = "this is a string";
var myClass = new MyClass();

// 大部分时候我们都不需要关心 LINQ 查询表达式的具体类型
var subset = from i in numbers where i < 10 select i;

// 无法可以从等式右边明确知道变量的类型
var foo = GetResult(); // 不推荐
Foo foo = GetResult(); // 推荐

为了代码良好的可阅读性,建议不要过度使用 var 关键字。

04 数据类型的字面量

字面量(Literal)是用于表达源代码中的一个固定值。几乎所有编程语言都具有对基本数据类型的字面量表示。

int myInt = 10; // 10 为整型字面量
string myString = "this is a string"; // "this is a string" 为字符串类型字面量

在 C# 中,有些数据类型的字面量有特殊的写法,比如数字后面添加字母后缀来指定类型(如前文中的 0.5F 表示一个单精度浮点类型的字面量)。

有时数字类型的字面量可能会很长,不利于阅读。C# 7.0 引入了下划线(_)作为数字分隔符,可用于整数、浮点数、十六进制和二进制数。下面是一些使用数字分隔符的例子:

Console.WriteLine(123_456); // 整数
Console.WriteLine(123_456.12); // 浮点数
Console.WriteLine(0x_00_00_FF); // 十六进制
Console.WriteLine(0b_0001_0000); // 二进制

对于数字类型字面量的整数部分,按千分位分隔,即每三位一分隔;对于十六进制和二进制,按字节分隔,即十六进制每两位一分隔,二制每四位一分隔。

本文来自http://cnblogs.com/willick,经授权后发布,本文观点不代表Chaoqiang's Blog立场,转载请联系原作者。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

近期个人博客正在迁移中,原博客请移步此处,抱歉!