MQL5中的OOP问题 - 页 40 1...333435363738394041424344454647...96 新评论 Alexey Volchanskiy 2019.09.16 06:02 #391 Dmitry Fedoseev: const - 如果有必要禁止变量赋值(除了在初始化期间的一次)。如果一个变量被声明为conts,那么当它通过引用传递给一个函数时,函数参数也必须是const,但是编译器会强制这样做,你不必考虑这个问题。如果一个变量没有被分配,它也可以被标记为常量--它的工作速度会更快,这适用于函数参数。然而,在任何时候,你可能需要修改它... static - 如果它是一个类中的变量,那是一种罕见的情况,甚至是最罕见的。如果它是一个类方法,那么如果该方法只处理这个方法的参数和类的静态变量,这也是一种罕见的情况(不过,如果你只是为了方便而把函数收集到一个类中,就不那么罕见了)。 我还没来得及尝试MQL5的C# DLL。我曾经使用C++封装器,并在C#中创建了一个类实例。我怀疑这个DLL现在将使用一个静态类,这严重限制了选择。有没有人知道现在创建的是静态类还是动态类? Igor Makanu 2019.09.16 06:41 #392 Alexey Volchanskiy: 还没来得及尝试MQL5的C# DLL。我曾经用C++封装器来做,从正面看,C#中创建了一个类的实例。我怀疑现在的DLL将使用静态类,这严重限制了它的可能性。有谁知道它现在是在创建静态类还是动态类? 我只在MQL5中使用了静态的 - 如果使用了静态修改器,签名将直接从MU中可见,非常方便。 关于这个限制,你可以把任务扔到一个单独的线程中,然后把它钉死,在C#中做得非常快。 或在dll内写入调用 没问题 UPD。 我不确定能否解释我最近关于在MQL任务中使用OOP的理由的研究,但我要告诉你我所看到的情况 一般来说,如果我们使用OOP风格,充分尊重访问控制,确保设置所有 私有/受保护/公共的修饰符,并在每个方法定义和签名中强制使用const(如果用于修改数据,可以在以后删除),用get/set编写所有对受保护数据的访问,正确使用OOP的结果是,在开发过程中 发现关于非故意修改 数据的大bug。 我从头开始这样重写了一个类--编译器立即发现与我的问题不兼容,在检查(测试)时从后代进入基类,像往常一样分心,忘了删除--不是说我在测试中会发现这个错误,我可能认为它的目的就是这样))。 对我来说,另一个明显的优势是没有所有全局描述的变量--我尽量不使用它们,它们在这里根本没有被使用(好吧,除了全局优化标志--以适应我的需要和交易时的关键错误标志)。 一个有趣的观察是,当通过get/set重写所有的调用时,源类的大小首先增加,然后开始显著缩小,当我开始在get/set的调用中进行替代时--我不说它大大膨胀了代码的大小,但同样--这将提供对数据完整性的控制 SZY:好吧,如果你是一个完美主义者,并且相信通过get/set的额外调用是CPU上的额外时钟,那么当任务100%完成时,不难在源码中通过搜索计算对每个get/set的调用,并应用一个古老的规则--如果你调用一段代码超过一次,那么你必须把这段代码作为一个子程序....。 Alexey Volchanskiy 2019.09.16 09:58 #393 Igor Makanu: 我只在MQL5中使用了静态的 - 如果你有静态修改器,签名将直接从MU中可见,非常方便。 关于这个限制,你可以把任务扔到一个单独的线程中,然后再杀死它。 或在dll内写入调用 我不认为这是一个问题。 我不是指夏普的静态成员,我是指这个 public static class ClassName {} 你不能通过new创建一个静态类实例并通过delete销毁它,它没有构造函数和析构函数,所有成员和方法都是静态的。总之,我已经很久没有在那里工作了,但我记得那是多么的不舒服,就像一张普罗克鲁斯的床。 它们通常被用作库函数的容器,如数学函数。 Igor Makanu 2019.09.16 10:09 #394 Alexey Volchanskiy: 我不是指夏普的静态成员,而是这个 我想这是一个没有静态修饰符的类不会看到MQL,但它会看到有静态修饰符 的类里面的方法 你可以在本地使用dll中的任何类,我在一个没有静态的dll类中有WinForm。一切工作正常,但我调用了用静态声明的函数,这些函数在类中声明的地方--对于从MQL调用dll来说并不重要,即使整个类是静态或不是。 我还不能检查,我的笔记本换成SSD后还没有安装工作室,我还不需要它。 Dmitry Fedoseev 2019.09.16 11:51 #395 Alexey Volchanskiy: 还没来得及尝试MQL5的C# DLL。我曾经用C++封装器来做,从正面看,C#中创建了一个类的实例。我怀疑现在的DLL将使用静态类,这严重限制了它的可能性。有没有人知道现在创建的是静态类还是动态类? 该类是常规的,方法是静态的。我没有尝试过任何其他选择。 Alexey Volchanskiy 2019.09.16 12:19 #396 伊戈尔、德米特里,总之,你必须自己尝试。根据我的理解,在任何情况下,都需要参考类的名称,而不是类对象的 名称。我会试试的,谢谢。 atmar1963 2019.09.16 12:29 #397 你好,如果我有一个关于信号的问题,我应该在哪里写?我想知道,如果存款=312美元,订阅信号是否合理? 如果我在一个半月前开始交易,如何避免对经纪人的依赖并有效工作?我一个半月前开始交易,谢谢。 Dmitry Fedoseev 2019.09.16 12:38 #398 Alexey Volchanskiy: 伊戈尔、德米特里,总之,你必须自己尝试。据我所知,在任何情况下,都需要用类的名称来引用,而不是用类对象的 名称。我会试试的,谢谢。 按班级名称称呼。 Igor Makanu 2019.09.16 13:01 #399 Alexey Volchanskiy: 伊戈尔、德米特里,总之你必须自己去尝试。我的理解是,在任何情况下都应该参考类的名称,而不是类对象的 名称。我会试试的,谢谢。 我不能说这是从MQL5调用C#的唯一方法,我使用了一个来自https://www.mql5.com/ru/forum/285631 开发者的例子 #import "TestLib.dll" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int x=41; TestClass::Inc(x); Print(x); } public class TestClass { public static void Inc(ref int x) { x++; } } 我使用开发人员的例子来获得C#中的入口点,我没有使用其他方法,经过一些调整,同样的.dll代码可以编译为MT4的代码。 文章和我对文章中的代码为什么不能按预期工作的研究https://www.mql5.com/ru/forum/3153/page4#comment_10366498 - 到目前为止,一切都能正常工作 Igor Makanu 2019.09.16 16:29 #400 看了看我与OOP风格的代码斗争的结果--嗯......。优秀的!)))) 我有一个问题,但在我的代码中,嗯,确切地说,有三次,我使用了这样的结构。 private: COrder *m_order; ....... // использую так return(CheckPointer(m_order)==POINTER_INVALID ? true : m_order.Orderclose()); //или так if(CheckPointer(m_order)==POINTER_INVALID) 所有的调用都在私有方法中,但是在源代码中是否有一个 "绝地方法?"来摆脱CheckPointer(m_order)==POINTER_INVALID的困扰? 我问的是一些获取/设置 没有特别的问题,但可以说是心血来潮,或者说在对C++中的OOP方法的渴求还没有减弱的时候 1...333435363738394041424344454647...96 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
const - 如果有必要禁止变量赋值(除了在初始化期间的一次)。如果一个变量被声明为conts,那么当它通过引用传递给一个函数时,函数参数也必须是const,但是编译器会强制这样做,你不必考虑这个问题。如果一个变量没有被分配,它也可以被标记为常量--它的工作速度会更快,这适用于函数参数。然而,在任何时候,你可能需要修改它...
static - 如果它是一个类中的变量,那是一种罕见的情况,甚至是最罕见的。如果它是一个类方法,那么如果该方法只处理这个方法的参数和类的静态变量,这也是一种罕见的情况(不过,如果你只是为了方便而把函数收集到一个类中,就不那么罕见了)。
我还没来得及尝试MQL5的C# DLL。我曾经使用C++封装器,并在C#中创建了一个类实例。我怀疑这个DLL现在将使用一个静态类,这严重限制了选择。有没有人知道现在创建的是静态类还是动态类?
还没来得及尝试MQL5的C# DLL。我曾经用C++封装器来做,从正面看,C#中创建了一个类的实例。我怀疑现在的DLL将使用静态类,这严重限制了它的可能性。有谁知道它现在是在创建静态类还是动态类?
我只在MQL5中使用了静态的 - 如果使用了静态修改器,签名将直接从MU中可见,非常方便。
关于这个限制,你可以把任务扔到一个单独的线程中,然后把它钉死,在C#中做得非常快。
或在dll内写入调用
没问题
UPD。
我不确定能否解释我最近关于在MQL任务中使用OOP的理由的研究,但我要告诉你我所看到的情况
一般来说,如果我们使用OOP风格,充分尊重访问控制,确保设置所有 私有/受保护/公共的修饰符,并在每个方法定义和签名中强制使用const(如果用于修改数据,可以在以后删除),用get/set编写所有对受保护数据的访问,正确使用OOP的结果是,在开发过程中 发现关于非故意修改 数据的大bug。
我从头开始这样重写了一个类--编译器立即发现与我的问题不兼容,在检查(测试)时从后代进入基类,像往常一样分心,忘了删除--不是说我在测试中会发现这个错误,我可能认为它的目的就是这样))。
对我来说,另一个明显的优势是没有所有全局描述的变量--我尽量不使用它们,它们在这里根本没有被使用(好吧,除了全局优化标志--以适应我的需要和交易时的关键错误标志)。
一个有趣的观察是,当通过get/set重写所有的调用时,源类的大小首先增加,然后开始显著缩小,当我开始在get/set的调用中进行替代时--我不说它大大膨胀了代码的大小,但同样--这将提供对数据完整性的控制
SZY:好吧,如果你是一个完美主义者,并且相信通过get/set的额外调用是CPU上的额外时钟,那么当任务100%完成时,不难在源码中通过搜索计算对每个get/set的调用,并应用一个古老的规则--如果你调用一段代码超过一次,那么你必须把这段代码作为一个子程序....。
我只在MQL5中使用了静态的 - 如果你有静态修改器,签名将直接从MU中可见,非常方便。
关于这个限制,你可以把任务扔到一个单独的线程中,然后再杀死它。
或在dll内写入调用
我不认为这是一个问题。
我不是指夏普的静态成员,我是指这个
你不能通过new创建一个静态类实例并通过delete销毁它,它没有构造函数和析构函数,所有成员和方法都是静态的。总之,我已经很久没有在那里工作了,但我记得那是多么的不舒服,就像一张普罗克鲁斯的床。
它们通常被用作库函数的容器,如数学函数。
我不是指夏普的静态成员,而是这个
我想这是一个没有静态修饰符的类不会看到MQL,但它会看到有静态修饰符 的类里面的方法
你可以在本地使用dll中的任何类,我在一个没有静态的dll类中有WinForm。一切工作正常,但我调用了用静态声明的函数,这些函数在类中声明的地方--对于从MQL调用dll来说并不重要,即使整个类是静态或不是。
我还不能检查,我的笔记本换成SSD后还没有安装工作室,我还不需要它。
还没来得及尝试MQL5的C# DLL。我曾经用C++封装器来做,从正面看,C#中创建了一个类的实例。我怀疑现在的DLL将使用静态类,这严重限制了它的可能性。有没有人知道现在创建的是静态类还是动态类?
该类是常规的,方法是静态的。我没有尝试过任何其他选择。
伊戈尔、德米特里,总之,你必须自己尝试。据我所知,在任何情况下,都需要用类的名称来引用,而不是用类对象的 名称。我会试试的,谢谢。
按班级名称称呼。
我不能说这是从MQL5调用C#的唯一方法,我使用了一个来自https://www.mql5.com/ru/forum/285631 开发者的例子
我使用开发人员的例子来获得C#中的入口点,我没有使用其他方法,经过一些调整,同样的.dll代码可以编译为MT4的代码。
文章和我对文章中的代码为什么不能按预期工作的研究https://www.mql5.com/ru/forum/3153/page4#comment_10366498 - 到目前为止,一切都能正常工作
看了看我与OOP风格的代码斗争的结果--嗯......。优秀的!))))
我有一个问题,但在我的代码中,嗯,确切地说,有三次,我使用了这样的结构。
所有的调用都在私有方法中,但是在源代码中是否有一个 "绝地方法?"来摆脱CheckPointer(m_order)==POINTER_INVALID的困扰?
我问的是一些获取/设置
没有特别的问题,但可以说是心血来潮,或者说在对C++中的OOP方法的渴求还没有减弱的时候