var与C#中的对象

San*_*eep 8 c#

可能重复:
C#中"var"和"object"之间的差异

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

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

使用它们的利弊.

Mar*_*off 19

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

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

  • 除非它是一个原语,在这种情况下它必须在被分配到`Object`引用之前被加框. (4认同)

Ben*_*igt 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>>>>();
Run Code Online (Sandbox Code Playgroud)

为什么没有朋友,你没有.var改为使用:

var myDict = new Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>();
Run Code Online (Sandbox Code Playgroud)

现在myDict真的是一个Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>,所以你可以添加东西,枚举它,等等.

如果你声明它,object你不能用它提供的任何操作Dictionary,只有那些对所有对象有效的操作.

  • 我很乐意看到代码在行动中. (2认同)

小智 5

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();
Run Code Online (Sandbox Code Playgroud)

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

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


Cra*_*aig 5

var仍然是强类型的,但是对象你必须抛出一切.