一、变量类型
1.整数类型
C# 将整数分为 8 种类型,如下表所示。使用时,根据数值的可能大小,选择范围最小的类型,一般常用的类型为 short、int 和 long 3 种。
- sbyte 有符号 8 位整数 -128 〜127
- byte 无符号 8 位整数 0 〜255
- short 有符号 16 位整数 -32768〜32767
- ushort 无符号 16 位整数 0〜65535
- int 有符号 32 位整数 -2147489648〜2147483647
- uint 无符号 32 位整数 0〜42994967295
- long 有符号 64 位整数 -2⁶³ 〜2⁶³
- ulong 无符号 64 位整数 0 〜2⁶⁴
int age=5;
byte classSize=23;
ushort student=2344;
2.浮点类型
float 32位单精度浮点类型 -2¹²⁸〜2¹²⁸
double 64位单精度浮点类型 -2¹⁰²⁴〜2¹⁰²⁴
float angles=36.5f;
double rate=0.253D;
3.布尔类型
bool b=true;
4.字符类型
为保存单个字符,C#支持字符(char)类型,字符类型的字面量是用单引号括起来的。一些特殊字符要用反斜线\
后跟一个字符表示,称为转义字符,如下表所示。
\' 单引号
\" 双引号
\\ 反斜线
\0 空
\a 报警
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
5.引用类型
引用类型是构建 C# 应用程序的主要数据类型,C#的所有引用类型均派生自 System.Object
6.枚举
使用枚举类型可以增强程序的可读性,在 C# 中使用关键字 enum
类声明枚举类型的变量,格式如下:
enum枚举名称
{
常量1=值1;
常量2=值2;
?
常量n=值n
}
参考 C#枚举高级战术
枚举类型的作用是限制其变量只能从有限的选项中取值,这些选项(枚举类型的成员)各自对应于一个数字,数字默认从 0 开始,并以此递增。例如:
public enum Days
{
Sunday, Monday, Tuesday, // ...
}
其中 Sunday 的值是 0,Monday 是 1,以此类推。为了一眼能看出每个成员代表的值,一般推荐显示地将成员值写出来,不要省略:
public enum Days
{
Sunday = 0, Monday = 1, Tuesday = 2, // ...
}
C# 枚举成员的类型默认是 int 类型,通过继承可以声明枚举成员为其它类型,比如:
public enum Days : byte
{
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6,
Sunday = 7
}
枚举类型一定是继承自 byte、sbyte、short、ushort、int、uint、long 和 ulong 中的一种,不能是其它类型。下面是几个枚举的常见用法(以上面的 Days 枚举为例):
// 枚举转字符串
string foo = Days.Saturday.ToString(); // "Saturday"
string foo = Enum.GetName(typeof(Days), 6); // "Saturday"
// 字符串转枚举
Enum.TryParse("Tuesday", out Days bar); // true, bar = Days.Tuesday
(Days)Enum.Parse(typeof(Days), "Tuesday"); // Days.Tuesday
// 枚举转数字
byte foo = (byte)Days.Monday; // 1
// 数字转枚举
Days foo = (Days)2; // Days.Tuesday
// 获取枚举所属的数字类型
Type foo = Enum.GetUnderlyingType(typeof(Days))); // System.Byte
// 获取所有的枚举成员
Array foo = Enum.GetValues(typeof(MyEnum);
// 获取所有枚举成员的字段名
string[] foo = Enum.GetNames(typeof(Days));
另外,值得注意的是,枚举可能会得到非预期的值(值没有对应的成员)。比如:
Days d = (Days)21; // 不会报错
Enum.IsDefined(typeof(Days), d); // false
即使枚举没有值为 0 的成员,它的默认值永远都是 0。
var z = default(Days); // 0
枚举可以通过 Description、Display 等特性来为成员添加有用的辅助信息,比如:
public enum ApiStatus
{
[Description("成功")]
OK = 0,
[Description("资源未找到")]
NotFound = 2,
[Description("拒绝访问")]
AccessDenied = 3
}
static class EnumExtensions
{
public static string GetDescription(this Enum val)
{
var field = val.GetType().GetField(val.ToString());
var customAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
if (customAttribute == null) { return val.ToString(); }
else { return ((DescriptionAttribute)customAttribute).Description; }
}
}
static void Main(string[] args)
{
Console.WriteLine(ApiStatus.Ok.GetDescription()); // "成功"
}
二、变量声明
1.修饰
private(默认修饰符),只能在本类中访问。
protected,只能在类或派生类中访问。
internal,只能在本项目中访问。
如果想让脚本中定义的变量在 Unity 3D 中的 Inspector 面板上显示,必须用 public 修饰。
//public 变量不想在编辑器中显示
[HideInInspector]
public int A;
//private变量想在编辑器中显示
[SerializeField]
[Range(1,100)]//范围
private int b;
2.var
参考 C#中 Var关键字
Var是C#3.5新增的一个关键字,用来代替某些具体的类型,由编译器自动判断变量类型,编译器可以根据变量的初始化值“推断”变量的类型。
其主要作用有2个:
- 代替具体类型,实现快速编程的隐式类型用法,常见在foreach便历中,实质是VS编译器给我们提供的一个语法糖。
- 和new 一起使用,来实现一个匿名类型,用来代替需要预先创建的实体类,灵活高效。
隐式类型用法:
var a=1;//int a=1;
var b="1";//string a="1";
var c=DateTime.Today;//DateTime c=DateTime.Today;
在定义一个具体类型的变量时,可以利用var来代替实际的真正类型,如上,//前面与后面的代码完全等价,编译器会自动根据后面的变量值的类型帮我们转换成最匹配的类型,属于一个与语法糖。
注意点:
- 无法使用var来定义一个全局变量,只能定义在方法的内部(因为预先不可知,所以预先不可置)
- 不能用来定义函数的签名,包括返回值,参数类别
- 在定义变量的时候,必须先给值,不能为null,也不能只定义不给值。
- 一旦一个变量被定义成var类型,并确定了指定的类型以后,不能再给这个变量其他类型的值。例: var a="1";a=1;(错误:无法将类型“XX”隐式转换成“YY”)
在开发中,我们有时会像下面的代码一样声明一个匿名类:可以看出,在匿名类的语法中并没有为其命名,而是直接的一个new { }就完事了。从外部看来,我们根本无法知道这个类是干神马的,也不知道它有何作用。
var annoyCla1 = new
{
ID = 10010,
Name = "EdisonChou",
Age = 25
};
Console.WriteLine("ID:{0}-Name:{1}-Age:{2}", annoyCla1.ID,annoyCla1.Name, annoyCla1.Age);
经过调试运行,我们发现匿名类完全可以实现具名类的效果。