【问题标题】:Is using var in c# really that bad? [closed]在 C# 中使用 var 真的那么糟糕吗? [关闭]
【发布时间】:2013-07-19 00:56:35
【问题描述】:

所以我正在为我的一位同事创建一个连接库,以节省他在当前项目上的时间。我的同事将在他的 c# 应用程序中使用这个库来连接到一个 rest api。在库中,我为每个请求(GET / POST / PUT / DEL)创建了处理程序。当他的应用程序与我的库对话时,我将返回如下响应:

return client.PostAsync(url, content).Result;

这会从 rest api 返回一个动态对象。

今天他使用了我的库,但由于某种原因无法将它与他的应用程序结合使用。我告诉他使用 var,它会像这样工作:

var x = API.CreateTraject(parameter1,parameter2);

他拒绝使用 var,最终花了大约 40 分钟弄清楚如何在没有它的情况下让它工作。然后他指责我返回了一个动态对象,并且他永远不会使用 var 因为显式更好所以他告诉我。

我通常作为移动开发人员(IOS / Android)工作,我一直使用 var。

现在我的问题是:

使用 var 真的那么糟糕吗?我应该在我的库中转换响应,以便他可以在他的应用程序中显式键入它吗?在我看来,我宁愿使用 var 并节省一些时间,然后花 40 分钟尝试让它变得明确。

【问题讨论】:

  • 我刚刚在此处删除的 cmets 指出了正是为什么此类问题未在此处悬而未决。你在下面得到了很好的信息。阅读、上网或买本书。

标签: c# coding-style desktop-application


【解决方案1】:

使用 var 真的那么糟糕吗?我应该在我的库中转换响应,以便他可以在他的应用程序中明确键入它吗?在我看来,我宁愿使用 var 并节省一些时间,然后花 40 分钟尝试让它变得明确。

var 在 C# 中只是一个编译器“技巧”。不涉及动态类型,编译后的代码完全一样。当您将鼠标悬停在变量上时,IDE 会告诉您使用的“真实”类型。

他是否使用var 或您的实际返回类型对于您如何创建库而言根本不重要。

如果您的图书馆返回dynamic不必要,那可能是另一个问题,用户可能会提出有效的投诉。与var(这只是一个编译时技巧)不同,dynamic 确实显着改变了行为。

或者,如果您要从库中返回匿名类型,您可能需要考虑为您的值创建一个实际类。匿名类型实际上只打算在本地范围内使用,不应成为任何公共 API 的一部分。

【讨论】:

  • 谢谢,动态由我们正在合作的另一家软件公司制作的其余 api 返回。我觉得返回其余 api 的响应是应该的,如果它通过使用 var 工作,为什么不呢。
  • @FlorianSchaal 如果它真的是一个动态对象,那么让他使用动态,而不是 var...
  • 好的,但是 var 不会让它在未来的代码中使用强类型吗?比如说动态是一个 json 容器,他需要从中提取数据。
  • @FlorianSchaal 如果您要返回动态,则 var 将只是“动态” - var 只是说“使用任何用于初始化我的类型”。
  • 啊,好吧,这对我来说很清楚!感谢您提供信息。
【解决方案2】:

使用var 并没有什么不合法的地方,它只是让编译器确定对象应该是什么数据类型。

唯一的危险是你,程序员,直到鼠标悬停才知道它是什么。这可能会导致问题,您认为这是一回事,但结果却是另一回事。

【讨论】:

    【解决方案3】:

    使用var是可以的,不违法什么的。

    但我想如果你知道变量的类型,用类型声明变量。这将使您的代码更易于阅读。

    【讨论】:

      【解决方案4】:

      使用implicit typing 并不不好,只是风格问题。我个人经常使用它,因为它使我所有的变量声明都占用了相同数量的空间,而不管类型如何。

      但是,使用dynamic 肯定会很糟糕,尤其是在过度使用时。这意味着可以在编译时执行的类型安全检查需要推迟到运行时。有时这很有用,但它可能会对性能产生影响。除非您真的需要返回动态,否则我强烈建议您从 API 方法返回特定类型。

      对于它的价值,如果你的同事非常反对隐式输入,他可以使用这个:

      dynamic x = API.CreateTraject(parameter1,parameter2);
      

      【讨论】:

        【解决方案5】:

        vardynamic 无关。 var 约等于type inference

        您的方法一开始不应返回dynamic。无论如何创建Generic Methods 并让消费者(您的同事)决定该方法将返回什么类型的对象。

        【讨论】:

          猜你喜欢
          • 2011-08-10
          • 2014-12-13
          • 1970-01-01
          • 1970-01-01
          • 2011-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-01
          相关资源
          最近更新 更多