C#中的var和Object有什么区别?

9

看起来非常类似于https://dev59.com/T3I_5IYBdhLWcg3wDOdC - Mathias
4个回答

22

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

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


4
除了原始类型外,在将变量赋值给“Object”引用之前,它必须被装箱。 - Billy ONeal
我认为应该在所选答案中添加的内容是,如果您使用<code>var</code>,那么正如@Ben Voigt所说,您可以对存储在var中的对象进行操作而无需进行强制转换。 - Eric

14

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
我很想看到那段代码的实际运行情况。 - Joe Enos
你的电脑是运行Windows系统的吗?开个玩笑。我创造了这种特定类型,但我很努力地尝试使用那些实际上可以组合在一起的类型。 - Ben Voigt
那一定是最讨厌的代码片段了 :) - Brian Gideon
1
而且这也是最牵强的……但虽然它有夸张,但并不是太多。 - Ben Voigt
我认为我做过的最糟糕的事情是一个Dictionary<int,List<Dictionary<SomePrimitive,SomeClass>>>,但如果我没记错的话,它是逐步构建和使用的,所以我没有一次性看到所有的东西。 - Joe Enos
为什么没有朋友,你不是吗? :) - Sabuncu

6

变量仍然是强类型的,但使用对象时,您将不得不对所有内容进行转换。


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();

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接