【问题标题】:C# & VB6: How to convert 'with' statement to C#?C# & VB6:如何将“with”语句转换为 C#?
【发布时间】:2019-06-04 21:06:07
【问题描述】:

如何将这段 VB6 代码转换为 C#?

http://pastebin.com/f16e19351

我自己尝试过,到目前为止:

http://pastebin.com/f7ca199f0

编辑:我要翻译的代码存在于此处: http://www.codeproject.com/KB/vb-interop/MouseHunter.aspx

【问题讨论】:

标签: c# vb6


【解决方案1】:

您还没有显示EventThief 代码,这确实让人无法分辨。但总的来说:

With expression
   .Foo = a
   .Bar = b
End With

会翻译成

var x = expression;
x.Foo = a;
x.Bar = b;

(当然你可以明确指定类型...)

这里的共同点是expression 只被评估一次。在您展示的特定代码中,当然不需要额外的变量,因为表达式首先只是局部变量。

您的实际错误看起来只是与 EventThief.RIGHT_DOWN 等的类型有关,而不是与 WITH 语句有关。

编辑:好的,您现在已经展示了 确实 使用布尔值的原始 EventThief 代码...但是您还没有展示您的 ported EventThief 代码。你写道:

它说 et.LEFT_UP 很短

...但它不应该是。原来是Boolean,那为什么你的端口是short呢?

【讨论】:

  • 我在我的问题中添加了一个链接,请参阅编辑。只需搜索“eventthief”即可找到。
  • 我不知道为什么它很短,我使用这里提到的 tlbimp:csharp-station.com/Articles/CSharpAndActiveXDlls.aspx 允许在 .NET 中使用 ActiveX dll,我认为它将它转换为短相反还是什么?我将尝试手动将整个内容转换为 C#。感谢您的帮助!
【解决方案2】:

VB中的以下内容

With EventStealingInfo
    .RIGHT_DOWN = True
    .RIGHT_UP = True
End With

大致可以翻译成

var EventStealingInfo = new EventThief(){
    RIGHT_DOWN = true,
    RIGHT_UP = true
};

其中RIGHT_UPRIGHT_DOWNEventStealingInfo 类中的公共属性。

这个结构在 C# 中被称为Object Initializer

【讨论】:

    【解决方案3】:

    像这样

    With EventStealingInfo
        .RIGHT_DOWN = True
        .RIGHT_UP = True
    End With
    

    变成

    EventStealingInfo.RIGHT_DOWN = true;
    EventStealingInfo.RIGHT_UP = true;
    

    【讨论】:

      【解决方案4】:

      我认为你可以走的更近:

      EventThief EventStealingInfo = new EventThief()
      {
          RIGHT_DOWN = true,
          RIGHT_UP = true
      };
      

      【讨论】:

      • 我会选择这个答案(除非它真的应该说... = new EventThief())。对象初始化器可能是最接近 Visual Basic 的 With 语句的东西。
      【解决方案5】:

      我可以致电您的提案选项 A

      1. 以社区VB6 code 为例,该社区创建了一个用于处理 Windows 挂钩的 DLL。
      2. 将其转换为 C#

      我可以推荐选项 B 和选项 C,我认为这会更容易吗?

      选项 B
      1. 以Microsoft's C# code 开头,用于处理 Windows 挂钩。
      2. 根据需要调整它,查看哪些 API 调用了VB6 code makes

      选项 C
      1. 从community code获取内置的VB6 DLL。
      2. 通过Interop 从新的 C# 应用程序调用该 DLL。

      【讨论】:

      • 我先尝试了选项 2,然后在第一次失败时尝试了选项 3。那时我在 EventThief 结构中遇到了错误类型的错误,因此我尝试了选项 1,但遇到了另一个错误,说明 GUID 错误,我不知道该怎么做。
      【解决方案6】:

      据我所知,在 C# 中没有与 With 等效的功能,当引用其成员函数/属性时,您需要显式列出该对象。

      【讨论】:

        【解决方案7】:

        没有 C# 等价物。

        【讨论】:

          【解决方案8】:

          你不能把 LEFT_UP 的类型改成 bool 吗?

          查看您的代码和您使用 EventThief 的方式,您可能希望使用标志枚举,以便您可以设置各个位,然后进行按位比较。

          【讨论】:

          • 我得查一下。谢谢!
          【解决方案9】:

          “with”关键字只是在设置多个属性时节省重新键入变量名称的快捷方式。 C# 中没有等价物。

          即使您仍然会遇到一个问题,即您显然试图将布尔值分配给短数据类型。

          EventThief 类中有什么?您可以简单地将 LEFT_UP 字段设为布尔值吗?

          【讨论】:

          • 查看我问题中编辑中的链接,搜索“EventThief”即可找到。
          • 实际上它还缓存了对象引用,如果必须通过追踪嵌套的一系列属性来解决有问题的对象,或者更糟糕的是创建临时使用的实例的方法调用,这可以节省时间.当然你也可以通过先创建一个新的临时引用变量并使用它来手动缓存。
          猜你喜欢
          • 2011-10-29
          • 1970-01-01
          • 1970-01-01
          • 2015-03-29
          • 2019-09-25
          • 2022-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多