aardio - 小窍门及注意事项收集贴

如果您有好的小经验,请在本帖下留言,我会编录进去,供更多朋友学习。 

关键词

描述

1匿名函数返回值λ()、lambda()  只能返回 个返回值,使用时需要注意。
2

函数中逐个参数进行处理的方法

一个函数中对所有参数逐个进行处理,除了在函数内部用for等类似语句遍历处理外,还可以采用函数递归的方式,将剩余的参数递归传递处理。如:

func = function( v , ... ){

        // 此处对第一个参数 v 进行处理。
        func( ... ); // 此处递归调用,实现对剩余的参数进行处理。
}

3输出调试信息

console.debug() 输出调试信息,该函数在开发环境中会自动打开控制台,而发布后则不会。类似易语言中的 输出调试文本 ()、调试输出 ()。

4操作Excel的方法

1、com.excel 库,需要系统中安装微软excel软件(使用其com接口),局限性较大。官方库封装的也较简单,适合简单的读写单元格数据。

2、access 库,使用ado驱动,一般系统中都已集成该驱动。适合把excel文件当数据库使用,对数据进行读写、排序、统计等复杂处理。

3、光庆封装的 godking.libxl 库,该库封装的功能比较全面,且为了实现简捷操作和良好容错,做了很多优化工作。适合对文件的数据、格式等进行处理。脱离office环境,读写速度很快,不支持公式取值。

4、风行者封装的 npoi 库,调用c#的dll实现,脱离office环境,支持公式取值,发布后要带.net相关库或文件,可能会造成exe文件体积较大。

5、使用dida表格等可以导入excel数据的表格组件,读写excel文件。有特殊需求的可以尝试使用,比如需要显示数据、调试打印的。

5System.ValueTuple使用注意事项

1、使用 .Create() 创建 ValueTuple 时,最多支持8个参数(成员)。

2、aardio只能通过参数自动匹配 .NET 泛型函数。
3、ValueTuple 前7个元素可使用字段 .Item1.Item7 访问。
4、第 8 个元素访问方法:通过 Rest 字段放到下一个 ValueTuple 里,tuple.Rest.Item1

5、遍历 tuple:
for i,v in System.ValueTuple.each(tuple){
    console.log(i,v);
}

6类内调用外部变量的方法

namespace aaa 
var var1 = "我是一个名字空间局部变量"
var2 = "我是一个名字空间成员变量1"
self.var3 = "我是一个名字空间成员变量2"
..var4 = "我是一个全局变量"
class bbb{
    ctor( /*输入构造函数所需要的参数*/ ){
        console.dump(var1);
        console.dump(..aaa.var2);
        console.dump(..aaa.var3);
        console.dump(..var4);
    };
}

7string.split模式匹配

string.split("",'\r\n'

'\r\n' 使用的是模式匹配,意思是  \r 或 \n ,很容易 误解为 \r+\n 

string.split("",'<\r\n>'

'<\r\n>' 使用的是非模式匹配,意思是 \r+\n

8table.gc()

经测试,析构函数中调用的对象,如果发生改变,会导致执行析构函数程序闪退。

所以,如果要在析构函数中释放对象,最好保证该对象在设置好析构函数后不会发生改变。

9tabs.loadForm()

win.ui.tabs组件,loadForm加载的窗口,在切换后,并不会关闭,而是隐藏。当再次切换回来后,窗口各控件还是保持原来的数据,并不会重新加载。

如果需要每次打开窗口时重新加载数据,可使用mainForm.custom.loadForm()

10io["open"]()io.open()

当你使用索引操作符调用成员函数 io["open"]() 时,被调用函数的 owner 参数为

所以一般不应当写 io["open"]() ,而应当写 io.open()

如果要给 io["open"]() 加上owner,可以使用 call:

call ( io["open"], io );

11wb.external 使用方法

import web.view
var wb = web.view(winform.custom)
//external必须在go之前赋值,内部的函数或常量都是promise对象,必须用异步方法async/await或then取回结果
wb.external = {    str =  "123"; }
wb.go("about:blank")

//eval会返回执行结果,所以会等待代码执行完毕,所以str的值是按顺序显示的
wb.eval("aardio.str.then(e=>{alert(e)})") //这里会显示123

//eval会返回执行结果,所以会等待代码执行完毕,所以str的值是按顺序显示的
wb.external.str =  "456";
wb.eval("aardio.str.then(e=>{alert(e)})") //这里会显示456

//doScript是不用返回结果的,所以不会阻塞线程执行,所以str的值并不一定是当前值
wb.external.str =  "789";
wb.doScript("aardio.str.then(e=>{alert(e)})") //这里会显示000

//doScript是不用返回结果的,所以不会阻塞线程执行,所以str的值并不一定是当前值
wb.external.str =  "000";
wb.doScript("aardio.str.then(e=>{alert(e)})") //这里会显示000

12$包含文件

1、正常情况下,如果$找不到包含文件会报错。

2、如果在包含文件前面加一个问号,则找不到文件时不报错而是返回null。如:io.print ( $"?不存在的路径" ) //不报错而是返回null

13thread.var()

// 正确用法

var abcObject = thread.var("abc");
var abcTable = abcObject.get();
abcObject.set("");
abcObject.release(); // 及时释放

// 错误用法

var abcTable = thread.var("abc").get(); //未释放
thread.var("abc").set(""); //未释放

//在线程里面的正确用法

var abcObject = thread.var("abc",{});
abcObject.set("123");
thread.invokeAndWait(
    function(abcObject){
        var abc = abcObject.get();
        abcObject.set("456");
        //abcObject.release(); //请不要在线程里面释放该对象
    },abcObject //给线程传递共享变量对象即可
)
abcObject.release();

//在线程里面的错误用法

var abcObject = thread.var("abc",{});
abcObject.set("123");
thread.invokeAndWait(
    function(){
        var abcObject = thread.var("abc"); //错误:不要在线程里面重新创建对象
        abcObject.set("456");
        abcObject.release(); //错误:也不要在线程里面释放
    }
)
abcObject.release();
web.rest.jsonLiteClient

import  web.rest.jsonLiteClient
//这是我个人认为可以及时释放内存占用的一种用法,循环期间内存时钟保持较低占用。

//作者并不提倡此种用法,因为内存会自动释放,无需这种处理方式。经测试,自动释放时,内存会维持在占用100多兆到200多兆左右,可能后期会在合适的时机进行释放。
for(i=1;9999;1){
    var js = web.rest.jsonLiteClient();
    var t = js.get("https://www.baidu.com");
    js.request(); 
    js.close(); 
}

thread.manage(63)

thread.manage() = 创建线程管理器。

参数:线程池大小,默认为 63,该值必须小于 64(测试发现=64也能正常工作,不知有何弊端,暂未进行大量测试)。

union联合体

union联合体数据转换时,只有最后一个“非空”成员的数据才是有效的,将其作为转换数据,其他数据无效。

如:

import console

var to = { 
   union u= {
      byte a[4];
      word b[2];
      int c;
   }

to.u.a = {1,2,3,4}; // 此数据不是最后一个非空数据,不作为转换数据
to.u.b = {5,6}; // c是null,则b为最后一个非空成员,对其进行转换

// to.u.c 是null,视为无效数据

raw.convert( to, to ); // 转换结构体数据

console.dump(to);
console.pause();

====================================================

转换后的数据:
{
    u={    a={[1]=5;[2]=0;[3]=6;[4]=0};
             b={[1]=5;[2]=6};
             c=393221;
    };
}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢光庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值