DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: xkjdf02
今日帖子: 1
在线用户: 8
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 feiyanm (feiyanm) ▲▲▲▲▲ -
普通会员
2019/3/13 9:54:22
标题:
说说新的语法糖:临时变量? 浏览:2191
加入我的收藏
楼主: 由于使用上的原因,突然发现新语法糖的一个好用的地方,那就是强制转换,一般情况下,我们写的代码是这样的:
procedure TTabbedwithNavigationForm.Button3Click(Sender: TObject);
var
  ABtn: TButton;
begin
  ABtn := TButton(Sender);
  if Assigned(ABtn) then
    ABtn.Tag := 1;
end;
有了新版的语法糖,我们好像可以这样写了:
procedure TTabbedwithNavigationForm.Button1Click(Sender: TObject);
begin
  var ABtn: TButton := TButton(Sender);
  if Assigned(ABtn) then
    ABtn.Tag := 1;
end;
正在开心的时候,发现问题了,如果我需要定义两个临时指针,那么只能这样写了:
procedure TTabbedwithNavigationForm.Button1Click(Sender: TObject);
begin
  var ABtn: TButton := TButton(Sender);
  var Btn2: TButton := TButton(Sender);
  if Assigned(ABtn) then
    ABtn.Tag := 1;
end;
注意:为了定义多个变量,好像多写了一个var,好吧,改一下:
procedure TTabbedwithNavigationForm.Button1Click(Sender: TObject);
begin
  var ABtn, Btn2: TButton;
  ABtn := TButton(Sender);
  Btn2 := TButton(Sender);
  if Assigned(ABtn) then
    ABtn.Tag := 1;
end;
最后,吐槽一下吧:有没有发现,跟c/c++比起来,感觉这个“var”字符好像脱裤子放屁?既然改了,干脆就把var给去掉呗,完全不影响使用啊!!!也能体现所谓现代语言的NB啊!!!同理,如果去掉var的强制声明,其实前置声明段(var段)可以完全去掉的呀!算了,本来语法糖就是脱裤子。。。
BTW:我是菜鸟,你们可以拿砖头过来了。。。
----------------------------------------------
Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!我去WC吐一会儿去!
作者:
男 feiyanm (feiyanm) ▲▲▲▲▲ -
普通会员
2019/3/13 9:59:54
1楼: 再多说一句,为了比较两种格式性能上的差别,简单用循环测试了一下,结果是:区别不大。菜鸟原因没有对生成的汇编代码进行比较,也没有对编译机制进行比较。请各位高手继续扔砖吧。
----------------------------------------------
Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!我去WC吐一会儿去!
作者:
男 dmzn (dmzn) ★☆☆☆☆ -
盒子活跃会员
2019/3/13 10:01:54
1楼: 对于Delphi这种需要开发者管理对象和内存的语言,隐式声明变量没什么好处.
----------------------------------------------
生活愉快.
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2019/3/13 10:15:11
2楼: 语法是可以, 但ide似乎还没兼容过来...
此帖子包含附件:
PNG 图像
大小:36.7K
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 feiyanm (feiyanm) ▲▲▲▲▲ -
普通会员
2019/3/13 10:36:29
3楼: 看了2楼,其实,我想这样写:
  ShowMessage(var s := Copy('Hello,World!', 1, 5));

  ShowMessage(var 变量 := '真的可以吗?');
实际上,真的不可以。。。
当然,我知道,这个水很深,反过来,如果真的能这样用,说明编译器确实有进步。
----------------------------------------------
Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!我去WC吐一会儿去!
作者:
男 kentty (kentty) ★☆☆☆☆ -
普通会员
2019/3/13 11:43:20
4楼: ShowMessage(var s := Copy('Hello,World!', 1, 5)); 这个才是脱裤子放屁吧
ShowMessage(Copy('Hello,World!', 1, 5)); 多直接
就算第一行的的可以运行,S的生存期在括号外就终结了,强行声明一个短命鬼没用啊
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2019/3/13 12:41:14
5楼: 用变量类型推断,不需要说明使用对象的类型,编译器可以直接推断出它的类型。
  var I := 22;
  var s := 'Hello world';
  var o := TObject.Create;
  var Btn := TButton(Sender);
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 netrobo (netrobo) ★☆☆☆☆ -
盒子活跃会员
2019/3/13 13:38:15
6楼: 这个特性在 for 循环定义临时变量应该挺方便的。
另外,不知道这个变量的作用域是怎样的,是函数级的,还是块级的?

还没安装10.3,有10.3的试一下。
----------------------------------------------
-
作者:
男 msfm (清洁工) ★☆☆☆☆ -
盒子活跃会员
2019/3/13 13:42:55
7楼: 非常好用
----------------------------------------------
-
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2019/3/13 14:45:15
8楼: for 循环 最实用
----------------------------------------------
-
作者:
男 tianpanhaha (tianpanhaha) ▲▲▲▲△ -
普通会员
2019/3/13 15:08:10
9楼: 变量统一写前面不是挺好吗,这里搞个变量那里搞个,看着乱七八糟。
----------------------------------------------
 QQ群:325010556 欢迎加入。
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/3/13 19:12:39
10楼: 去掉var就成隐式定义了。这样那代码能乱到不可想象。
----------------------------------------------
--
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2019/3/14 9:32:50
11楼: 我觉得可以去掉var因为变量后面有冒号和类型。
自推导类型的,应该是必须写var。
例如var a := 123;
其实语法糖还可以加一个连续赋值的语法糖,a := b := c;
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 feiyanm (feiyanm) ▲▲▲▲▲ -
普通会员
2019/3/14 12:26:40
12楼: 回复一下4楼:
ShowMessage(var s := Copy('Hello,World!', 1, 5)); 
ShowMessage(Copy(s, 1, 2));
稍微改了一下,在我看来,如果支持这样用那么明显有用。
----------------------------------------------
Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!我去WC吐一会儿去!
作者:
男 feiyanm (feiyanm) ▲▲▲▲▲ -
普通会员
2019/3/14 12:45:29
13楼: 又试了一下下面代码,结果是报错。

  for var i := 0 to 10 - 1 do
    Caption := IntToStr(i);

  for i := 0 to 10 - 1 do
    Caption := IntToStr(i);

看来变量作用域和编译器还有待进步。
----------------------------------------------
Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!我去WC吐一会儿去!
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/3/14 13:13:15
14楼: 第一个循环变量i应该算for循环的局部变量,第二个循环变量i当然应该先定义了,我觉得这样才严谨。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/3/14 21:37:48
15楼: for里定义的变量生存期就在for语句内部。
出了就失效了。
没毛病。
----------------------------------------------
--
作者:
男 hawke2e (hawke2e) ★☆☆☆☆ -
普通会员
2019/3/15 11:47:57
16楼: 语法糖属于可有可无的东西,知道了就够了,习惯用喜欢用就用。
引入新语法导致开发人员容易犯错是愚蠢的行为。
如果哪个公司把语法糖作为面试题目,说明这公司技术水平低。
----------------------------------------------
软件是什么,相信很多人都说不清。
作者:
男 forjoylee (天地无缘) ★☆☆☆☆ -
普通会员
2019/4/2 10:34:28
17楼: var是不能省略的,假如前面有一个同名变量,你后面本意是想申明一个新变量,省略了var,编译器会认为你不是申明新变量,而是对前面已有变量赋值。
----------------------------------------------
这家伙很懒,什么都没有留下。
作者:
男 linsigong (lins) ▲▲▲▲△ -
普通会员
2019/4/2 15:41:40
18楼: 这里节省的时间,以后都会花在找 bug 上。
----------------------------------------------
-
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2019/4/3 9:28:07
19楼: @ linsigong (lins) 同意你的说法,节省时间是一方面,稳定健壮才是王道。
----------------------------------------------
18114532@qq.com
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2019/4/4 20:11:16
20楼: 我还是决定不使用这个语法糖,主要是:
  1.这个语法糖有诱导你写大函数的可能
  2.代码向后兼容问题
  3.IDE支持还不完善
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行83.98438毫秒 RSS