96SEO 2026-02-19 21:17 24
备注本页面中列出的某些特性反映了主分支的当前状态因此可能有一些特性在最新版本中缺失。

默认情况下一个类型会将其所有的公共方法、公共属性、公共事件和公共字段与Lua脚本共享。
可以使用
代码和脚本代码之间的接口而不是将应用程序内部模型暴露给脚本。
许多设计模式适配器、外观、代理等可以帮助设计这样一个接口层。
这对于以下方面尤其重要
限制脚本可以做什么和不可以做什么安全性你想让你的模组作者找到一种方法来删除最终用户的个人文件吗
InteropRegistrationPolicy.Automatic;
类型。
为互操作注册一个类型意味着将类型与描述符MoonSharp
提供的自动描述符但你可以实现自己的描述符来提高速度、添加功能、增强安全性等。
如果你想实现自己的描述符这并不容易除非你需要否则不应该这样做你可以遵循以下路径
接口。
这更容易但意味着你无法在没有对象实例的情况下处理静态成员。
StandardUserDataDescriptor并在保持其余行为的同时更改你需要的方面。
StandardUserDataMethodDescriptor
StandardUserDataOverloadedMethodDescriptor
StandardUserDataPropertyDescriptor
StandardUserDataFieldDescriptor
就像调用函数时将值类型作为参数传递一样脚本将对用户数据的副本进行操作因此例如更改用户数据中的字段不会反映在原始值上。
同样这与值类型的标准行为没有任何不同但足以让人感到惊讶。
此外值类型不支持引用类型所具有的全部优化范围因此某些操作在值类型上可能比在引用类型上更慢。
typesUserData.RegisterAssembly();Script
script.DoString(scriptCode);return
explicitely.UserData.RegisterTypeMyClass();Script
MyClass());script.Globals.Set(obj,
script.DoString(scriptCode);return
会以一些有限的方式自动调整大小写以匹配成员以更好地适应不同语言语法约定。
例如一个名为
typesUserData.RegisterAssembly();Script
script.DoString(scriptCode);return
MyClassStaticThroughPlaceholder()
typesUserData.RegisterAssembly();Script
script.DoString(scriptCode);return
有些极端情况可能会有所不同比如如果一个属性返回一个委托并且你打算立即调用那个委托以原始对象作为实例。
这是一个较少见的情景当这种情况发生时你需要手动处理。
重载方法是支持的。
重载方法的分派有些神奇不像C#重载分派那样确定。
这是因为存在一些歧义。
例如一个对象可以声明这两个方法
根据输入类型为所有重载计算出一个启发式因子并选择最佳重载。
如果你认为
尽可能保持启发式权重的稳定性并且在方法之间的得分出现平局时它总是以确定的方式选择相同的一个以提供在不同构建和平台之间一致的体验。
选择的重载可能与你想的不同。
因此极其重要的是重载执行等效的任务以便将调用错误重载的影响降到最低。
这本应是一个最佳实践但在这里强化这一概念是值得的。
作为多个返回值正确地进行了封送处理。
这种支持并非没有副作用因为带有
请注意对非用户数据使用多个索引将引发错误。
这包括通过元方法的场景但如果元表的
以下是标准描述符如何分派运算符的说明但你可以在此单元测试代码中看到工作示例。
修饰的静态方法则使用这些方法来分派相应的元方法。
请注意如果这些方法存在它们将优先于以下任何其他标准。
[MoonSharpUserDataMetamethod(__concat)]
Concat(ArithmOperatorsTestClass
}[MoonSharpUserDataMetamethod(__concat)]
}[MoonSharpUserDataMetamethod(__concat)]
Concat(ArithmOperatorsTestClass
System.Collections.IEnumerable则
进行注册。
前者将注册一个包含扩展方法的单一类型后者注册指定程序集中包含的所有扩展类型。
虽然它们可能看起来有限制但在大多数情况下它们实际上反映了事件设计中的一些最佳实践它们足以支持
a);endmyobj.somethingHappened.add(handler);myobj.raiseTheEvent();myobj.somethingHappened.remove(handler);myobj.raiseTheEvent();;UserData.RegisterTypeEventArgs();UserData.RegisterTypeMyClass();Script
MyClass();script.DoString(scriptCode);
添加和移除事件处理程序是缓慢的操作,它们是在一个线程锁下使用反射执行的。
另一方面,处理事件本身并没有很大的性能损失。
中输入了所有到目前为止的示例你可能已经注意到大多数方法都有一个可选的
翻译没有进行优化每次访问成员时都使用反射。
这是最慢的方法但如果很少使用成员则可以节省大量内存。
LazyOptimizedThis
可以自由地将其“降级”到反射。
第一次访问成员时进行即时优化。
这样可以为从未访问过的所有成员节省内存但代价是增加了脚本执行时间。
PreoptimizedThis
可以自由地将其“降级”到反射。
优化在注册时开始的后台线程中执行。
如果在优化完成之前访问了成员则使用反射。
BackgroundOptimizedThis
翻译这是一个提示,MoonSharp可以自由地将其降级到反射。
优化是在注册时完成的。
HideMembersMembers
翻译成员完全不可访问。
如果您需要一个用户数据类型,其成员对脚本是隐藏的,但仍然可以传递给其他函数,这可能很有用。
另请参阅AnonWrapper和AnonWrapperT。
DefaultUse
Reflection。
例如,在代码提前编译的平台(如iPhone和iPad)上就会发生这种情况。
attribute[MoonSharpVisible(true)]private
attribute[MoonSharpVisible(false)]public
attribute[MoonSharpHidden]public
attribute[MoonSharpVisible(true)]private
attribute[MoonSharpVisible(false)]public
visible![MoonSharpVisible(false)]public
everything[MoonSharpVisible(false)]public
attribute[MoonSharpVisible(true)]private
attribute[MoonSharpVisible(false)]public
supported![MoonSharpVisible(false)]public
有时需要从已注册的类型中移除成员以便在脚本中隐藏它们。
有几种方法可以做到这一点。
其中一种方法是在类型注册后手动移除它们
((StandardUserDataDescriptor)(UserData.RegisterTypeSomeType()));
descr.RemoveMember(SomeMember);
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback