C# 变量

参考Unity 3D C# 脚本基础

一、变量类型
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);

经过调试运行,我们发现匿名类完全可以实现具名类的效果。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

  • C# 变量 一个变量只不过是一个供程序操作的存储区的名字。在 C# 中,每个变量都有一个特定的类型,类型决定了变量...
    acc8226阅读 712评论 0 0
  • stack vs heap Stack( 一块内存)存储本地变量(函数内的变量)和参数 随着函数的进入和退出,st...
    柒轩轩轩轩阅读 165评论 0 1
  • 变量是指以变量名所对应的内存地址为起点,以其数据类型所要求的存储空间为长度的一块内存区域。 内存结构 内存最小单位...
    JunChow520阅读 245评论 0 0
  • 一、类型C#是一种类型安全的静态语言。这要求创建任何变量时,都必须将其数据类型告知编译器;编译器将确保只能将兼容的...
    CarlDonitz阅读 408评论 0 1
  • 1. C# 程序是一组类型声明 越是感觉简单的东西,简单的表述,就很难理解。 C#程序怎么去理解是一组类型声明呢?...
    Ritchie_Li阅读 238评论 3 0