永发信息网

c#变量声明

答案:2  悬赏:50  手机版
解决时间 2021-01-19 07:45
c#变量声明
最佳答案
首先,你得先了解一下动态变量与变量之间的区别!
所谓的变量这里当然可以的——但千万别加动态二字!
.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类型,不是出错,但若是不同类型,你这比较运行未必支持!
变量就是变量——它是一个值可变的符号来做为占位,这个占位就是变量!
动态变量——那个符号只有运行时才被具体的类(匿名类在运行时有类名的)代替。
强类型/强变量——变量类型一旦声明,不可再更改其使用类型!
动态类——运行时类的属性或方法会发生变量(增加类的属性或方法)
全部回答
int a=11;追问兄弟我私信你了,麻烦看一下,谢谢
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
为什么我拳皇恶魔使者打法老王老是DISS
山煤国际退市,股民是亏多少
中都华庭周边环境怎么样?生活便利吗?
外语教学与研究是核心期刊?
古代十当是什么意思
恶魔奶爸求解这是第几集
菜鸟驿站(百世邻里新区四部)地址有知道的么?
起诉七天了不知道法院通知对方没有
很多耳聋的患者都好了怎么好的呢?
空气中的小水滴位于低空叫
有谁听过道家秘派王玉川大师?
18.9x33.4一23.4x18.9简便计算
监控NVR支持哪些协议平台
为什么支付宝里面的余额宝存有一万一千元为什
请教建筑面积200平的平层,地暖8路分水器能做
推荐资讯
彩笔和蜡笔有什么不同
深圳哪有火烧祛湿的
俄罗斯侧推ld香烟焦油量是多少
鸭子是上火还是下火
为什么每一次关机再开机后原来整理好的图标又
双腿在水里浸泡,麻木不能走路怎么回事
呼德阿伦(锡林郭勒锡林浩特市)地址在哪,我要
解析请问佩戴真命佛与本命佛一样吗
876除以口的商是三位数口里最大填几?
潮虫能促进骨头愈合么?
和启结构相同的字有哪些?
举箸提笔 诸多不便 恐大去之期不远矣… 请问
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?