如果您有好的小经验,请在本帖下留言,我会编录进去,供更多朋友学习。
关键词
描述
1 匿名函数返回值 λ()、lambda() 只能返回 1 个返回值,使用时需要注意。 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文件。有特殊需求的可以尝试使用,比如需要显示数据、调试打印的。
5 System.ValueTuple使用注意事项 1、使用 .Create() 创建 ValueTuple 时,最多支持8个参数(成员)。
2、aardio只能通过参数自动匹配 .NET 泛型函数。
3、ValueTuple 前7个元素可使用字段 .Item1 到 .Item7 访问。
4、第 8 个元素访问方法:通过 Rest 字段放到下一个 ValueTuple 里,tuple.Rest.Item15、遍历 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);
};
}7 string.split模式匹配 string.split("",'\r\n')
'\r\n' 使用的是模式匹配,意思是 \r 或 \n ,很容易 误解为 \r+\n
string.split("",'<\r\n>')
'<\r\n>' 使用的是非模式匹配,意思是 \r+\n
8 table.gc() 经测试,析构函数中调用的对象,如果发生改变,会导致执行析构函数程序闪退。
所以,如果要在析构函数中释放对象,最好保证该对象在设置好析构函数后不会发生改变。
9 tabs.loadForm() win.ui.tabs组件,loadForm加载的窗口,在切换后,并不会关闭,而是隐藏。当再次切换回来后,窗口各控件还是保持原来的数据,并不会重新加载。
如果需要每次打开窗口时重新加载数据,可使用mainForm.custom.loadForm()
10 io["open"]()与io.open() 当你使用索引操作符调用成员函数 io["open"]() 时,被调用函数的 owner 参数为空。
所以一般不应当写 io["open"]() ,而应当写 io.open()。
如果要给 io["open"]() 加上owner,可以使用 call:
call ( io["open"], io );
11 wb.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)})") //这里会显示00012 $包含文件 1、正常情况下,如果$找不到包含文件会报错。
2、如果在包含文件前面加一个问号,则找不到文件时不报错而是返回null。如:io.print ( $"?不存在的路径" ) //不报错而是返回null
13 thread.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;
};
}