何时应该劝阻弱势群体?在大型项目中,弱势类型是否会受到阻碍?如果左侧是强类型,如下所示,那将是规则的例外吗?
int i = 5 string sz = i sz = sz + "1" i = sz
是否有任何语言支持与上述类似的语法?告诉我更多关于弱相关类型和情况的利弊.
我认为你将"弱打字"与"动态打字"混为一谈.
术语"弱类型"表示"非强类型",这意味着允许内存位置的值与其类型指示的值不同.
C是弱类型语言的示例.它允许写这样的代码:
typedef struct { int x; int y; } FooBar; FooBar foo; char * pStr = &foo; pStr[0] = 'H'; pStr[1] = 'i'; pStr[2] = '\0';
也就是说,它允许将FooBar实例视为一个字符数组.
在强类型语言中,这是不允许的.要么生成编译器错误,要么抛出运行时异常,但在任何时候,FooBar内存地址都不会包含不是有效FooBar的数据.
C#,Java,Lisp,Java Script和Ruby是不允许这类事物的语言示例.它们是强类型的.
其中一些语言是"静态类型",这意味着变量类型在编译时分配,有些是"动态类型",这意味着变量类型直到运行时才知道."静态与动态"和"弱与强"是正交问题.例如,Lisp是"强动态类型"语言,而"C"是"弱静态类型语言".
此外,正如其他人所指出的那样,"推断类型"与程序员指定的类型之间存在区别.C#中的"var"关键字是类型推断的一个示例.但是,它仍然是一个静态类型的构造,因为编译器在编译时而不是在运行时推断出变量的类型.
那么,你的问题真的是问:
静态类型,动态类型,弱类型,强类型,推断的静态类型和用户指定的静态类型的相对优缺点是什么.
我提供以下所有这些的答案:
静态打字
静态类型有三个主要好处:
更好的工具支持
减少某些类型的错误的可能性
性能
由于静态类型提供的额外信息,静态类型语言中的用户体验和诸如智能和重构之类的准确性得到了极大的改善.如果输入"a".在代码编辑器中,"a"具有静态类型,然后编译器知道可以合法地在"."之后出现的所有内容.因此可以向您显示准确的完成列表.可以用动态类型语言支持某些场景,但它们更受限制.
此外,在没有编译器错误的程序中,重构工具可以识别使用特定方法,变量或类型的每个位置.在动态类型语言中不可能这样做.
第二个好处有点争议.静态类型语言的支持者喜欢提出这种说法.然而,静态类型语言的反对者认为,他们捕获的错误是微不足道的,并且无论如何他们都会被测试捕获.但是,您可以预先获得拼写错误或方法名称之类的通知,这可能会有所帮助.
静态类型语言还可以实现更好的"数据流分析",当与Microsoft的SAL(或类似工具)结合使用时,可以帮助发现潜在的安全问题.
最后,通过静态类型编译,编译器可以进行更多优化,因此可以生成更快的代码.
缺点:
静态类型的主要缺点是它限制了您可以执行的操作.您可以使用动态类型语言编写程序,而这些语言不能用静态类型语言编写.Ruby on Rails就是一个很好的例子.
动态打字
动态类型的最大优点是它比静态类型更强大.你可以用它做很多很酷的事情.
另一个是它需要更少的打字.您不必在整个地方指定类型.
缺点:
动态打字有两个主要缺点:
你没有从编译器或IDE获得那么多"手持"
它不适用于关键性能方案.例如,没有人在Ruby中编写OS内核.
强类型:
强类型的最大好处是安全性.执行强类型通常需要某种类型的运行时支持.如果一个程序可以证明类型安全,那么许多安全问题,例如缓冲区溢出,就会消失.
打字不好:
强类型的大缺点和弱打字的大好处是性能.
当您可以按照自己喜欢的方式访问内存时,可以编写更快的代码.例如,数据库只需写出原始字节就可以将对象交换到磁盘,而不需要求助于"ISerializable"接口.视频游戏可以通过在大缓冲区上运行单个空闲而不是为许多小对象运行析构函数来丢弃与一个级别关联的所有数据.
能够做这些事情需要弱打字.
类型推断
类型推断允许静态类型的许多好处,而不需要太多的输入.
用户指定的类型
有些人不喜欢类型推断,因为他们喜欢明确.这更像是一种风格的东西.