【问题标题】:How to translate a specific line of code from C# to VB.net如何将特定的代码行从 C# 转换为 VB.net
【发布时间】:2020-07-12 18:02:56
【问题描述】:

我在网上找到了非常有前途的代码,我想尝试一下。 由于我的项目是用VB.net 编写的,而有问题的代码在C# 中,我开始将我需要的点点滴滴翻译成VB.net。 我已经完成了翻译,但我无法弄清楚一行特定的代码究竟做了什么以及如何将其翻译成 VB.net。 而且我不知道如何用 google 搜索来自己找到答案。

那么也许您可以对 C# 的奥秘有所了解?

这是 C# 源代码(精简到相关位):

public class TestClass
{
    private ListView listView;

    public TestClass(ListView input)
    {
        this.listView = input;
        this.listView.Loaded += new RoutedEventHandler(ListViewLoaded);
        this.listView.Unloaded += new RoutedEventHandler(ListViewUnloaded);
    }

    public static readonly DependencyProperty EnabledProperty = DependencyProperty.RegisterAttached(
        "Enabled",
        typeof(bool),
        typeof(TestClass),
        new FrameworkPropertyMetadata(new PropertyChangedCallback(OnEnabledChanged)));

    private static void OnEnabledChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        ListView input = obj as ListView;
        new TestClass(input);   // <== this is the mystic line
    }
}

我正在为静态过程OnEnabledChanged 中的最后一行代码而苦苦挣扎。看起来这个类的构造函数被调用了,但是结果没有被赋值给任何东西。

将其转换为 VB.net 为 New TestClass(input) 会导致语法错误。

我在互联网上尝试了一些自动翻译,但它们只返回New TestClass(input),所以它们和我一样聪明(或不知道)。

那么你能告诉我这行代码是做什么的,以便我可以将其转换为有效的 VB.net 吗?

【问题讨论】:

  • object input = ... 这不可能。但这很关键。请显示整行。
  • 没什么大不了的。更改了描述中的示例代码。
  • 这让我想知道:你的代码有终结器吗?
  • 没有终结器,只有构造函数。
  • 好的,那么这些事件永远不会发布this.listView.Loaded += ....

标签: c# vb.net


【解决方案1】:

如果这条线是孤立的,即:它真的只是new TestClass(input);,它可能是为了触发构造函数的一些代码,也许是一些静态初始化。

虽然是不好的做法,但您可以将其转换为 VB,只需将其存储在临时对象中即可。结果是等价的。

所以,而不是:New TestClass(input)

Dim temp = New TestClass(input)

所以总的来说,关于神秘线:

private static void OnEnabledChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
    ListView input = obj as ListView;
    new TestClass(input);   // <== this is the mystic line
}

它构造一个TestClass对象并调用它的构造函数,传入ListView。结果被丢弃。

如前所述:有一个动作应用于输入。虽然这确实是不好的做法;你失去了对改变输入列表的对象的引用。很难撤消它的操作 - 并且可能很难调试。

但是;这也意味着您不能省略该行。

【讨论】:

  • 构造函数中的代码没有做任何静态的东西,至少我看不到。它只是将输入参数存储到一个类变量并附加两个事件。
  • 该行可以省略-但是:您需要非常确定。我会更新我的答案。
  • 我在描述中添加了构造函数的代码。
  • 啊,对不起,和我想的一样; input 应用了一些东西...好的,那么您不能省略该行...但是可以说代码有点混乱。
  • 嗯...我想一定是这样,当我这样做时,我确实确实在新对象上调用了一个方法,这就是允许它的原因。这是有道理的,因为正如建议的那样,如果该类型设计良好,那么创建一个新对象而不将其用于任何事情确实不是您应该做的事情,所以我怀疑这是我会做的事情。我想我只是没有意识到是方法调用使Call 关键字OK。在这种情况下,我收回我的建议。
猜你喜欢
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多