知识大全 C#教程:隐式类型的局部变量

Posted 类型

篇首语:学问是心灵的慧眼。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#教程:隐式类型的局部变量相关的知识,希望对你有一定的参考价值。

C#教程:隐式类型的局部变量  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  隐式类型的局部变量

  在C# C# 中 其类型系统是静态的 显式和安全的 在C# 中 这一点也几乎一致 首先 类型系统依然是静态和安全的(忽略显式的unsafe代码) 并且多数情况下 它依然还是显式的——不过你也可以让编译器帮你推断局部变量的类型

  使用var声明局部变量

  要使用隐式类型 只需要简单的将原先声明的特定类型的局部变量改用var来声明 当然会有一些限制 我们稍候讨论 不过基本上你只需要做类似下面这样的改变:

   : MyType variableName = someInitialValue;

  改为:

   : var variableName = someInitialValue;

  这两行代码实际上是一样的(基于编译后的代码) someInitialValue的类型都是MyType 编译器在编译时可以根据初始化表达式判断类型并使得变量也拥有该类型 其类型可以是任意的 net类型 包括泛型 代理 和接口 变量依然还是静态的 只是你没有将类型名写在你的代码中而已

   : var stringVariable = Hello world ;   : stringVariable = ;

  以上的代码不能编译通过 因为stringVariable的类型是System String 而我们不能将值 赋给一个字符类型的变量 在很多动态语言中 上面的代码是可以编译通过的 它们不会给予变量特定的类型 相反这是编译器 IDE或者运行时环境要考虑的 使用var并不像使用或者VB 中的Variant var声明的变量类型依然是静态的; 只不过类型是由编译器推断的而已

  在VS 中 当你的鼠标停留在var所声明的变量上的时候 其智能提示可以告诉你该类型的精确类型 这与我们声明显式类型的时候是一样的 这也更清晰的表明了var声明的变量类型是静态的——编译器清楚的知道变量类型

  隐式类型的限制

  你不能在所有的情况下对每一个变量都使用隐式类型声明 只有当在下列情况之一时使用:

  变量被声明为局部变量   变量作为声明的一部分被初始化   初始化表达式不是一个方法组或者匿名函数(没有类型转换)   初始化表达式不能是null   语句只包含一个变量声明   赋给变量的初始化表达式是个编译时类型   其中 第 点与第 点是很有趣的 你不能这样编写:

   : var starter = delegate() Console WriteLine();

  因为编译器不知道你将要使用的类型 然而你可以使用下面的代码:

   : var starter = (ThreadStart) delegate() Console WriteLine();

  但如果你要这么做的话最好在开头空白的地方就使用显式类型声明 同样的做法也适用于null的情况——你应该将null转换为适当的类型 另外我们也可以使用方法调用值或者属性作为初始化表达式——指向常量或者构造器调用也是没有问题的 例如 可以使用下列的代码:

   : var args = Environment CommandLine;

  在这个例子中 args将会被初始化为string[]类型 实际上 将方法调用的返回值赋给一个变量在LINQ to SQL当中几乎是最常用的一种情景 另外 还有一点也是值得注明一下的 在using for foreach的头一个部分使用var声明是被允许的 例如:

   : for (var i = ; i < ; i++)   : using (var x = File OpenText( test dat ))   : foreach (var s in Environment CommandLine)

  上述代码中的变量将会各自结束于int StreamReader和string类型 当然 仅仅是被允许这么做并不意味着你就应该要这样做 让我们来看一下支持和反对使用隐式类型声明的理由

  隐式类型声明的好与坏

  使用隐式类型声明的主要理由(先排除匿名类型)是它减少了大量的代码输入 同时屏幕上可见的代码数量也变多了:) 特别是当类型名包含泛型的时候可能会很长 因为太长你可能会使用一行来声明变量 另外一行用于初始化表达式 另外的一种选择使用别名 但那样的话为了要看到变量的真实类型你可能要经过一道长长的路途(无法在查看变量的时候就知道其真实类型) 相反 如果使用var 这一切都迎刃而解 代码也更少 编辑器也可以及时告诉你具体的变量类型

  所有的这些听起来都不错 那么我们有什么理由来反对使用隐式类型声明呢? 可读性!其几乎是反对使用隐式类型声明最重要的一个理由 对于没有使用显式声明的变量来说 代码可能会更难读一点 它打破了 我们声明的是什么类型 那么其就应该始于对应的初始值 的思维 这使得声明初始化完全分离了 至于难读的程度则去取决于读者和初始化表达式所包含的代码 如果是显式调用一个构造器 那么这可以非常明显的知道你要创建的是什么类型 如果是调用一个方法或者使用一个属性 则取决于返回类型是否足够明显 下面整数型的列子显示了推断类型比显式声明更加困难 多快你可能区分中每一种类型所对应的真实类型?

   : var a = ;   : var b = ;   : var c = ;   : var d = ;   : var e = ;   : var f = ;

  答案是int uint long long和ulong 这些类型完全依赖于表达式的结果

  建议

  以下是个人的一些关于使用隐式类型的建议

cha138/Article/program/net/201311/15315

相关参考

知识大全 C#中的匿名类型与隐式类型变量

C#中的匿名类型与隐式类型变量  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在C#中引入了Li

知识大全 C# 2.0 局部类型、空属类型、静态类[1]

C#2.0局部类型、空属类型、静态类[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  局部类

知识大全 C# 2.0 局部类型、空属类型、静态类[2]

C#2.0局部类型、空属类型、静态类[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  局部类

知识大全 C# 2.0 局部类型、空属类型、静态类[3]

C#2.0局部类型、空属类型、静态类[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  局部类

知识大全 新增匿名类[1]

  一用var定义变量  在C#中提供了一种新的声明变量的方式这就是var通过这个关键字在声明变量时就无需指定类型了变量类型是在初始化时由编译器确定的代码如下:varss=abcd;MessageBo

知识大全 C# 语言规范--1.3 变量和参数

C#语言规范--1.3变量和参数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  变量表示存储位置

知识大全 C#里面中将字符串转为变量名

C#里面中将字符串转为变量名  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 JavaScript获取后台C#变量以及调用后台方法

JavaScript获取后台C#变量以及调用后台方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 深入理解C# 3.0的五项主要改进

深入理解C#3.0的五项主要改进  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!隐型局部变量  C#

知识大全 java问题,请大神指教

java问题,请大神指教?!因为这个new什么的是闭包隐式声明的方法、在里面调用外部变量的时候、外部的变量需要final修饰、但是这个该死的i是变化的、故而不能使用final、于是矛盾产生、故而使用中