var与C#中的对象

时间:2010-07-10 23:06:49

标签: c#

  

可能重复:
  Difference between “var” and “object” in C#

我想知道var和object之间的区别。

何时使用Var以及何时使用Object。

使用它们的利弊。

4 个答案:

答案 0 :(得分:18)

var只是“让编译器为我选择正确的变量类型”的简写(编译时类型推断是更精确的术语)。

另一方面,

object是一种特定的类型;所有其他引用类型都派生自object,因此您可以将任何内容分配给object类型的变量。

答案 1 :(得分:11)

当你发现自己要问时,

var就是答案,我真的必须输入两次长型名称,例如:

Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>> myDict = new Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>();

为什么没有朋友,你没有。请改用var

var myDict = new Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>();

现在myDict真的是Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>,所以你可以添加内容,枚举它等等。

如果您将其声明为object,则无法使用Dictionary提供的任何操作,只能对所有对象有效。

答案 2 :(得分:5)

var仍然是强类型的,但是使用对象你必须投射所有内容。

答案 3 :(得分:4)

var foo = "Hello, I am a string!";
// foo is a string, so this compiles
var fooCharArray = foo.ToCharArray(); 

object bar = foo;
// bar is not a string, so this does not compile
var barCharArray = bar.ToCharArray();

在第一个示例中,编译器知道foo是一个字符串,因此我们可以在foo上调用字符串方法。

在第二个示例中,我们将字符串foo“向上”转换为对象。现在编译器不知道(因为它不应该知道!)bar实际上是一个字符串,我们不能在bar上调用字符串方法。编译器不允许从对象(或任何基类型)到派生类型(例如System.String)的隐式向下转换。它是编译时类型安全规则的一部分。