我想知道var和object之间的区别。
何时使用Var以及何时使用Object。
使用它们的利弊。
答案 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
)的隐式向下转换。它是编译时类型安全规则的一部分。