【问题标题】:how to convert use of VAR to explicit type in C#如何在 C# 中将 VAR 的使用转换为显式类型
【发布时间】:2017-03-11 15:37:17
【问题描述】:

我有一些代码使用了一个类,该类是从 Java 和 IKVM 转换的,用于 .NET。所以我的代码示例在实例化类的时候使用了VAR,比如:

var Something = new OriginallyFromJavaClass("c:\ReadInThisFile.txt");

然后这个类的方法对该文本文件执行一些操作,例如:

var analyze = OriginallyFromJavaClass.method1(whatever);

请注意,该类的这些其他用途不引用“Something”,而只是直接调用 java 类名而不使用“new”字。

问题是读取文本文件一次需要大约 30 秒,所以我想在我的 WinForms 应用程序中只执行一次,然后单击按钮调用其他方法。但是,如果我将上面的代码行移到我的类级别,因此我只需要打开 TXT 文件一次,C# 编译器就会失败,因为它不允许在类级别使用 VAR 类型。我从根本上知道,从使用 GetType 来评估这个变量,它是一个类。那么我将如何使用显式类型重构上述内容以及我在哪里实例化类(从而读取我的 TXT 文件)一次?

【问题讨论】:

  • 它是什么类型的?这就是它的类型。使用那种类型。代码显示new OriginallyFromJavaClass()。这就是它的类型。这就是它的类型。对象的类型就是它所属的类。类就是类型。将该字段声明为该类型。它可能是什么其他类型?看起来你在那里创建一个整数吗? 尝试什么了吗?
  • OriginallyFromJavaClass Something = new OriginallyFromJavaClass(@"c:\ReadInThisFile.txt");
  • 只要找出变量是什么类型,然后用你的类型替换var...?即var Something = 将变为OriginallyFromJavaClass Something =
  • 埃德,是的,我确实尝试过。谢谢你只是消极。我的困惑源于这样一个事实,即这涉及一些移植的 Java 代码,而我尝试过的通用方法不起作用。

标签: java c# ikvm


【解决方案1】:

试试

 OriginallyFromJavaClass Something = new OriginallyFromJavaClass("c:\ReadInThisFile.txt");

【讨论】:

    【解决方案2】:

    好吧,var just infers the type 如果你只是声明实际类型,你应该没问题。

    TypeClass something = new TypeClass("c:\ReadInThisFile.txt");
    

    【讨论】:

    • 这不是答案。应该是评论。我相信你可以以 50 个代表离开 cmets。
    【解决方案3】:

    var 简直就是糖,因为你不必像这样重复自己

    OriginallyFromJavaClass Something = new OriginallyFromJavaClass("c:\ReadInThisFile.txt");
    

    所以你可以使用

    A a = new A()
    

    而不是

    var a = new A()
    

    【讨论】:

    • 除了你使用var时,VS intellisense 不会在开发时接员。否则var 很好,可爱又花花公子。
    • @ajeh,这不是真的,无论您是否使用 var,VS intellisense 的行为方式都完全相同
    • @ajeh 对我有用。
    • @ajeh 要点是,不要传播错误信息。我只是让您知道问题出在 您或您的配置 并且您的陈述不准确。所以你可以把“对你有好处”的废话带到其他地方。
    • @ajeh 如果我没记错的话,Visual Studio 在编码期间引入了实时编译。所以 Intellisense 在开发/运行时的行为应该相同。
    【解决方案4】:

    虽然var 只是语法糖,但可以清理一些代码。有时可能会发生错误,因为 CLR 期望的内容与推断的返回内容实际上是不正确的。所以有时明确将是理想的。

    否则它是短手的理想选择:

    Dictionary<int, List<Sample>> example = new Dictionary<int, List<Sample>>();
    var example = new Dictionary<int, List<Sample>>();
    

    所以只要正确推断出类型,就和显式声明一样。希望这可以澄清您的问题。

    【讨论】:

      猜你喜欢
      • 2018-09-09
      • 2012-02-24
      • 2016-03-20
      • 1970-01-01
      • 2014-09-02
      • 2017-07-25
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      相关资源
      最近更新 更多