【问题标题】:Differences between C# "var" and C++ "auto"C#“var”和C++“auto”的区别
【发布时间】:2017-04-08 11:12:10
【问题描述】:

我现在正在学习 C++,因为我需要编写一些低级程序。

当我了解“auto”关键字时,它让我想起了来自 C# 的“var”关键字。

那么,C#“var”和C++“auto”有什么区别?

【问题讨论】:

  • 因为本质相同,所以都用于类型推断
  • 那么,它们在技术上是一样的吗?
  • 它们是两个关键字,达到相同的效果,只是编程语言不同
  • 注意:当用于 lambdas/delegates 时,它们相同。
  • 好吧,我需要找到一些相关信息...因为我从开始编程后就没有使用过 lambdas/delegates。

标签: c# c++ var auto


【解决方案1】:

在 C# 中,var 关键字仅在函数内部本地起作用:

var i = 10; // implicitly typed 

在 C++ 中的 auto 关键字 can deduce 中不仅可以输入变量,还可以输入函数和模板:

auto i = 10;

auto foo() { //deduced to be int
    return 5;
}

template<typename T, typename U>
auto add(T t, U u) {
    return t + u;
}

从性能的角度来看,auto keyword in C++ does not affect runtime performance。和 var 关键字does not affect runtime performance as well

另一个区别在于 IDE 中的智能感知支持。 C#中的var关键字可以很容易地推断出来,你会看到鼠标悬停的类型。在 C++ 中使用 auto 关键字可能会更复杂,这取决于 IDE。

【讨论】:

  • 那么,auto 的使用范围更广吗?
  • 是的,使用 C++ 中的 auto,您可以使用强类型检查构建整个演绎链。
  • var 不会影响 C# 中的性能,您链接到的示例已损坏,因为 List&lt;int&gt; bar1 = Foo(); 会产生编译时错误。见Servy's comment
  • 怎么不影响性能呢?我必须花费一些 CPU 时间来确定变量的类型,对吗?还是在编译时确定的?作为后续,我们为什么不只使用 auto?
  • 是的,是在编译时进行的,所以性能没有变化。我不会过多地使用 auto/var,因为我喜欢通过鼠标悬停在代码中的每个变量上来查看类型。但是如果类型很复杂,我就懒得写了,我用auto/var。
【解决方案2】:

简单地说,autovar 复杂得多。

首先,auto 可能只是推导类型的一部分;例如:

std::vector<X> xs;
// Fill xs
for (auto x : xs) x.modify(); // modifies the local copy of object contained in xs
for (auto& x : xs) x.modify(); // modifies the object contained in xs
for (auto const& x : xs) x.modify(); // Error: x is const ref

其次,auto可以用于一次声明多个对象:

int f();
int* g();
auto i = f(), *pi = g();

第三,auto 用作函数声明中尾随返回类型语法的一部分:

template <class T, class U>
auto add(T t, U u) -> decltype(t + u);

也可用于函数定义中的类型推导:

template <class T, class U>
auto add(T t, U u) { return t + u; }

第四,未来可能开始用于声明函数模板:

void f(auto (auto::*mf)(auto));
// Same as:
template<typename T, typename U, typename V> void f(T (U::*mf)(V));

【讨论】:

  • 这应该是公认的答案,即使它错过了一些用途。 1 - auto&amp;&amp; 是唯一一个使用通用引用的地方。 2 - auto 可用于 lambda 表达式参数。我猜我什至错过了一些用法。
【解决方案3】:

它们是等价的。它们都允许您不自己指定变量的类型,但变量保持强类型。以下几行在 c# 中是等价的:

var i = 10; // implicitly typed  
int i = 10; //explicitly typed  

以下几行在 c++ 中是等价的:

auto i = 10;
int i = 10;

然而,您应该记住,在 c++ 中,auto 变量的正确类型是使用函数调用的模板参数推导规则确定的。

【讨论】:

  • 加一。请注意,在 C++ 中的某些情况下,auto 的使用是不可避免的——例如当您使用 lambda 函数时。在 C# 中也是如此吗?另请注意,auto i = 10; 在 C++11 前后具有非常不同的含义(即使在这种特殊情况下,标准都将 i 设置为 int 类型)。
  • 为什么不可避免? auto 确实 在编译时解析为具体或泛型类型。您可以将其替换为该具体类型
  • 而 lambda 函数的具体类型是?
  • 编译器分辨率决定的那个。 vector&lt;T&gt; 的项目类型是什么?
  • @Bathsheba 实际上,您不能在 C# 中将 var 用于隐式类型的 lambda。您必须使用适当的委托类型(可以是Action&lt;&gt;Func&lt;&gt;)。所以实际上,varauto 并不等同,至少就 lambdas 而言。
猜你喜欢
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2011-03-21
  • 2010-12-05
  • 2010-10-31
相关资源
最近更新 更多