MQL5中的OOP问题 - 页 40

 
Dmitry Fedoseev:

const - 如果有必要禁止变量赋值(除了在初始化期间的一次)。如果一个变量被声明为conts,那么当它通过引用传递给一个函数时,函数参数也必须是const,但是编译器会强制这样做,你不必考虑这个问题。如果一个变量没有被分配,它也可以被标记为常量--它的工作速度会更快,这适用于函数参数。然而,在任何时候,你可能需要修改它...

static - 如果它是一个类中的变量,那是一种罕见的情况,甚至是最罕见的。如果它是一个类方法,那么如果该方法只处理这个方法的参数和类的静态变量,这也是一种罕见的情况(不过,如果你只是为了方便而把函数收集到一个类中,就不那么罕见了)。

我还没来得及尝试MQL5的C# DLL。我曾经使用C++封装器,并在C#中创建了一个类实例。我怀疑这个DLL现在将使用一个静态类,这严重限制了选择。有没有人知道现在创建的是静态类还是动态类?

 
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的调用,并应用一个古老的规则--如果你调用一段代码超过一次,那么你必须把这段代码作为一个子程序....。

 
Igor Makanu:

我只在MQL5中使用了静态的 - 如果你有静态修改器,签名将直接从MU中可见,非常方便。

关于这个限制,你可以把任务扔到一个单独的线程中,然后再杀死它。

或在dll内写入调用

我不认为这是一个问题。

我不是指夏普的静态成员,我是指这个

public static class ClassName {}

你不能通过new创建一个静态类实例并通过delete销毁它,它没有构造函数和析构函数,所有成员和方法都是静态的。总之,我已经很久没有在那里工作了,但我记得那是多么的不舒服,就像一张普罗克鲁斯的床。

它们通常被用作库函数的容器,如数学函数。

 
Alexey Volchanskiy:

我不是指夏普的静态成员,而是这个

我想这是一个没有静态修饰符的类不会看到MQL,但它会看到有静态修饰符 的类里面的方法

你可以在本地使用dll中的任何类,我在一个没有静态的dll类中有WinForm。一切工作正常,但我调用了用静态声明的函数,这些函数在类中声明的地方--对于从MQL调用dll来说并不重要,即使整个类是静态或不是。

我还不能检查,我的笔记本换成SSD后还没有安装工作室,我还不需要它。

 
Alexey Volchanskiy:

还没来得及尝试MQL5的C# DLL。我曾经用C++封装器来做,从正面看,C#中创建了一个类的实例。我怀疑现在的DLL将使用静态类,这严重限制了它的可能性。有没有人知道现在创建的是静态类还是动态类?

该类是常规的,方法是静态的。我没有尝试过任何其他选择。

 
伊戈尔、德米特里,总之,你必须自己尝试。根据我的理解,在任何情况下,都需要参考类的名称,而不是类对象的 名称。我会试试的,谢谢。
 
你好,如果我有一个关于信号的问题,我应该在哪里写?我想知道,如果存款=312美元,订阅信号是否合理? 如果我在一个半月前开始交易,如何避免对经纪人的依赖并有效工作?我一个半月前开始交易,谢谢。
 
Alexey Volchanskiy:
伊戈尔、德米特里,总之,你必须自己尝试。据我所知,在任何情况下,都需要用类的名称来引用,而不是用类对象的 名称。我会试试的,谢谢。

按班级名称称呼。

 
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 - 到目前为止,一切都能正常工作

 

看了看我与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方法的渴求还没有减弱的时候