c#变量声明
答案:2 悬赏:50 手机版
解决时间 2021-01-19 07:45
- 提问者网友:贪了杯
- 2021-01-18 16:26
c#变量声明
最佳答案
- 五星知识达人网友:山有枢
- 2021-01-18 17:07
首先,你得先了解一下动态变量与变量之间的区别!
所谓的变量这里当然可以的——但千万别加动态二字!
.net是静态编译语言,但.net 4.0之后是支持动态的,其实也算是一种运行时绑定!可以换成动态变量吗?答案是可以的!只要你不怕例外或崩溃!
在C#中变量就是变量,比如 int a = 5; a 就是变量!
var a = 5l;a就是一个long型变量!很多人认为var就是动态变量!其实它是静态变量!也有人叫推断变量——这种说法也是相当牵强!没有推断变量一说的!var的做用是程序员可以不指明变量,而是由编译器推断(严格来说其中智能感知就可以推断出来了!)所以var定义的变量由于编译器在编译时直接推断出变量类型!智能感知推断出来只是防止你犯错而已!
所以var在编译时可能会影响一点性能(很微小,甚至可以忽略),在运行时因为是编译的IL文件,所以根据变量命名没有任何区别!
两种观点:一种是大量使用var,理由是给了这么一个方便当然要使用了!另一种观点,少使用var方式,影响代码可读性!我个人的观点是,如果程序员是在源码上交流(直至看到你的源码,建议不要过多使用var,影响阅读性,我当然知道使用var写起来方便,但你写的方便是方便了,但你在源码上读的就没有那么方便了!),如果程序在在模块上交流,无所谓的,用多一点也没什么,反正交流时用不到你的源码,即使是想看源码,也可以使用IL反射工具,反射出来的时候就不再是var了,而是直接的类型!
推断类型只能做一个动词,做为名词来说明var定义的变量是不对了!所以不存在推断类型。
但是确实存在一个叫动态类型的东西!dynamic来声明的类型!要说C#做为一个静态编译,他本身是不支持动态类型的,这个所谓的动态类型其实是躲过了IDE和编译器的检查而已!换句话来说,他不再检查这个类型到底是int还是自定义对象什么的(多数用在定义类上)。允许其直接使用不再对该对象进行检查。运行时当然也不检查,只是按照这种类式的调用而已,如果不存在的话,就会报错!所以呢静态编译其实是在编译时已经确定了类型,而动态类型(也是后期绑定一种)在编译时不检查,在运行时直接使用(有人说是运行时确定类型)!如果说动态变量是运行时确定类型确定是非常有助于理解,但事实上运行时并没有确定类型,只是直接使用而已!
这里有一个概念还是要澄清,弱变量与强变量!强变量表示变量与类型固定,比如int a;a的变量在幅值或使用时都必须是int类型的!如果 a = "15";铁定会错,因为这是强变量,而弱变量则表示声明一个变量,至于存什么类型,无所谓!比如js中var a = 5;转过头你a = "sdfsd",这没有任何问题!【注:有时弱变量与强变量被称为弱类型与强类型】
你可能会说,既然没有动态不再进行检查,那么dynamic声明的变量是不是可以达到弱变量的行式呢?!不可以!所以他实现的原因并不是将C#变量弱类型的语言!只是不再检查该变量类型而已,但还是强变量(强类型)的本质!
那么动态变量的实现的本质是什么?
假定 dynamic instance = new Person();是声明了一个动态变量,如果你使用instance.Age变量有没有问题?你可能会说这没有问题,只要Person有Age的属性!是的,然而它没有——如果你var或Person声明,你编译器都通不过(不能编译),但是如果使用dynamic声明的话却是可以通过的!运行时会报错吗?会的——空引用错误!这样做岂不是无用?第一,你在实际部署时,后来的Person可能有这个属性呢?或者说你的instance可能不是一个person,而是一个具体有Age属性的对象呢?比如Animal与Person都有Age属性,但你运行时不知道他是Aninal类还是Person类(两者没有共同的接口或基类),而这个对象可能是一个程序选择的结果!这时你就知道动态变量的好处了!所以运行时确定类型的说法就来源于此,因为在编译之前你都不知道这个变量到底是Aninal还是Person,唯一知道你要引用的类中的Age属性!只有在运行时才知道这个类到底是哪个!
你可能会注意到了,我说是运行时确定类型有助于理解,但说法不完全正确!为什么?因为如果这个类没有名字怎么办?.net在lambda表达式或其他类似处理时可以生成一个匿名类——注意,没有名字的类可以有助于理解,但是他有类名,是由运行时直接动态给的!在编译时你根本不知道类的名称!这么说了,其实匿名类的处理才是真正引用动态类的真正用途!
嗯,动态变量说完了,根据匿名类的说法,我们是不是可以说其为动态类?不可以!匿名类与动态类是两码事!C#静态语言,不可能支持动态类!上边“动态”的是变量!不是类!比如脚本语言js中,你声明一个person类,然后在运行时可以直接使用person.Age = 15;类声明时并没有声明Age,而这些却是可以直接使用该属性,为什么呢?动态类,比如Python语言就是动态编译类语言。你可以简单地声明一个类,连个属性没有,但使用时(运行时)可以增加(也可以减少)其类的任何属性或方法!这就是动态类——它是反映随着运行时,类可以有属性(不是属性值)和方法等变化!C#并不能!这就是静态语言与动态语言的区别!
几个概念下来,动态变量可不能乱说,如果11换成int等变量是没有问题的,但换成动态变量是有问题的!因为动态变量运行时你根本无法推知其体的类型,运行时若是int类型,不是出错,但若是不同类型,你这比较运行未必支持!
变量就是变量——它是一个值可变的符号来做为占位,这个占位就是变量!
动态变量——那个符号只有运行时才被具体的类(匿名类在运行时有类名的)代替。
强类型/强变量——变量类型一旦声明,不可再更改其使用类型!
动态类——运行时类的属性或方法会发生变量(增加类的属性或方法)
所谓的变量这里当然可以的——但千万别加动态二字!
.net是静态编译语言,但.net 4.0之后是支持动态的,其实也算是一种运行时绑定!可以换成动态变量吗?答案是可以的!只要你不怕例外或崩溃!
在C#中变量就是变量,比如 int a = 5; a 就是变量!
var a = 5l;a就是一个long型变量!很多人认为var就是动态变量!其实它是静态变量!也有人叫推断变量——这种说法也是相当牵强!没有推断变量一说的!var的做用是程序员可以不指明变量,而是由编译器推断(严格来说其中智能感知就可以推断出来了!)所以var定义的变量由于编译器在编译时直接推断出变量类型!智能感知推断出来只是防止你犯错而已!
所以var在编译时可能会影响一点性能(很微小,甚至可以忽略),在运行时因为是编译的IL文件,所以根据变量命名没有任何区别!
两种观点:一种是大量使用var,理由是给了这么一个方便当然要使用了!另一种观点,少使用var方式,影响代码可读性!我个人的观点是,如果程序员是在源码上交流(直至看到你的源码,建议不要过多使用var,影响阅读性,我当然知道使用var写起来方便,但你写的方便是方便了,但你在源码上读的就没有那么方便了!),如果程序在在模块上交流,无所谓的,用多一点也没什么,反正交流时用不到你的源码,即使是想看源码,也可以使用IL反射工具,反射出来的时候就不再是var了,而是直接的类型!
推断类型只能做一个动词,做为名词来说明var定义的变量是不对了!所以不存在推断类型。
但是确实存在一个叫动态类型的东西!dynamic来声明的类型!要说C#做为一个静态编译,他本身是不支持动态类型的,这个所谓的动态类型其实是躲过了IDE和编译器的检查而已!换句话来说,他不再检查这个类型到底是int还是自定义对象什么的(多数用在定义类上)。允许其直接使用不再对该对象进行检查。运行时当然也不检查,只是按照这种类式的调用而已,如果不存在的话,就会报错!所以呢静态编译其实是在编译时已经确定了类型,而动态类型(也是后期绑定一种)在编译时不检查,在运行时直接使用(有人说是运行时确定类型)!如果说动态变量是运行时确定类型确定是非常有助于理解,但事实上运行时并没有确定类型,只是直接使用而已!
这里有一个概念还是要澄清,弱变量与强变量!强变量表示变量与类型固定,比如int a;a的变量在幅值或使用时都必须是int类型的!如果 a = "15";铁定会错,因为这是强变量,而弱变量则表示声明一个变量,至于存什么类型,无所谓!比如js中var a = 5;转过头你a = "sdfsd",这没有任何问题!【注:有时弱变量与强变量被称为弱类型与强类型】
你可能会说,既然没有动态不再进行检查,那么dynamic声明的变量是不是可以达到弱变量的行式呢?!不可以!所以他实现的原因并不是将C#变量弱类型的语言!只是不再检查该变量类型而已,但还是强变量(强类型)的本质!
那么动态变量的实现的本质是什么?
假定 dynamic instance = new Person();是声明了一个动态变量,如果你使用instance.Age变量有没有问题?你可能会说这没有问题,只要Person有Age的属性!是的,然而它没有——如果你var或Person声明,你编译器都通不过(不能编译),但是如果使用dynamic声明的话却是可以通过的!运行时会报错吗?会的——空引用错误!这样做岂不是无用?第一,你在实际部署时,后来的Person可能有这个属性呢?或者说你的instance可能不是一个person,而是一个具体有Age属性的对象呢?比如Animal与Person都有Age属性,但你运行时不知道他是Aninal类还是Person类(两者没有共同的接口或基类),而这个对象可能是一个程序选择的结果!这时你就知道动态变量的好处了!所以运行时确定类型的说法就来源于此,因为在编译之前你都不知道这个变量到底是Aninal还是Person,唯一知道你要引用的类中的Age属性!只有在运行时才知道这个类到底是哪个!
你可能会注意到了,我说是运行时确定类型有助于理解,但说法不完全正确!为什么?因为如果这个类没有名字怎么办?.net在lambda表达式或其他类似处理时可以生成一个匿名类——注意,没有名字的类可以有助于理解,但是他有类名,是由运行时直接动态给的!在编译时你根本不知道类的名称!这么说了,其实匿名类的处理才是真正引用动态类的真正用途!
嗯,动态变量说完了,根据匿名类的说法,我们是不是可以说其为动态类?不可以!匿名类与动态类是两码事!C#静态语言,不可能支持动态类!上边“动态”的是变量!不是类!比如脚本语言js中,你声明一个person类,然后在运行时可以直接使用person.Age = 15;类声明时并没有声明Age,而这些却是可以直接使用该属性,为什么呢?动态类,比如Python语言就是动态编译类语言。你可以简单地声明一个类,连个属性没有,但使用时(运行时)可以增加(也可以减少)其类的任何属性或方法!这就是动态类——它是反映随着运行时,类可以有属性(不是属性值)和方法等变化!C#并不能!这就是静态语言与动态语言的区别!
几个概念下来,动态变量可不能乱说,如果11换成int等变量是没有问题的,但换成动态变量是有问题的!因为动态变量运行时你根本无法推知其体的类型,运行时若是int类型,不是出错,但若是不同类型,你这比较运行未必支持!
变量就是变量——它是一个值可变的符号来做为占位,这个占位就是变量!
动态变量——那个符号只有运行时才被具体的类(匿名类在运行时有类名的)代替。
强类型/强变量——变量类型一旦声明,不可再更改其使用类型!
动态类——运行时类的属性或方法会发生变量(增加类的属性或方法)
全部回答
- 1楼网友:荒野風
- 2021-01-18 18:38
int a=11;追问兄弟我私信你了,麻烦看一下,谢谢
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯