C# 是强类型语言;因此每个变量和对象都必须具有声明类型。
数据类型概述
数据类型可描述为:
内置数据类型,如 int 或 char,
用户定义数据类型,如 class 或 interface。
数据类型还可以定义为:
值类型(用于存储值),
引用类型(用于存储对实际数据的引用)。
值类型
值类型主要由两类组成:结构
- 结构是值类型,而类是引用类型。
- 与类不同,结构的实例化可以不使用 new 运算符。
- 结构可以声明构造函数,但它们必须带参数。(为什么不能没有参数,上面有答案)
- 一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自 System.ValueType,后者继承自 System.Object。
- 结构可以实现接口。
枚举
enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常数(是常数)组成的独特类型,
每种枚举类型都有基础类型,该类型可以是除 char 以外的任何整型,
枚举元素的默认基础类型为 int。默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1,
枚举数可以具有重写默认值的初始值设定项:
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
在此枚举中,强制元素序列从 1 而不是 0 开始。
将 System.FlagsAttribute 应用于某个枚举时,如果该枚举包含一些使用按位“或”运算组合的元素,这时您会注意到该属性在用于某些工具时会影响 enum 的行为
// enumFlags.cs
// Using the FlagsAttribute on enumerations.
using System;
[Flags]
public enum CarOptions
{
SunRoof = 0x01,
Spoiler = 0x02,
FogLights = 0x04,
TintedWindows = 0x08,
}
class FlagTest
{
static void Main()
{
CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
Console.WriteLine(options);
Console.WriteLine((int)options);
}
}
输出
SunRoof, FogLights
5
5
5
值类型的主要功能
基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
所有的值类型均隐式派生自 System.ValueType。
与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。
与引用类型不同,值类型不可能包含 null 值。然而,可空类型功能允许将 null 赋给值类型。
每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。有关值类型默认值的信息,请参见默认值表。
有关格式化数字类型输出的信息,请参见格式化数值结果表。int myInt=0;=====>int myInt=new int();
引用类型
引用类型的变量又称为对象,可存储对实际数据的引用。本节介绍以下用于声明引用类型的关键字:
- class
- interface
- delegate
重要的引用类型
object 类型在 .NET Framework 中是 Object 的别名。在 C# 的统一类型系统中,所有类型(预定义类型、用户定义类型、引用类型和值类型)都是直接或间接从 Object 继承的。可以将任何类型的值赋给 object 类型的变量。将值类型的变量转换为对象的过程称为“装箱”。将对象类型的变量转换为值类型的过程称为“取消装箱”。有关更多信息,请参见装箱和取消装箱
string 类型表示零或更多 Unicode 字符组成的序列。string 是 .NET Framework 中 String 的别名。
尽管 string 是引用类型,但定义相等运算符(== 和 !=)是为了比较 string 对象(而不是引用)的值
+ 运算符用于连接字符串:
用 @ 引起来的字符串以 @ 开头,并且也用双引号引起来。若要在一个用 @ 引起来的字符串中包括一个双引号,请使用两对双引号.