【发布时间】:2011-03-14 08:46:40
【问题描述】:
我想知道var和object的区别。
何时使用 Var,何时使用 Object。
使用它们的优点和缺点。
【问题讨论】:
标签: c#
我想知道var和object的区别。
何时使用 Var,何时使用 Object。
使用它们的优点和缺点。
【问题讨论】:
标签: c#
var 只是“让编译器为我选择正确的变量类型”的简写(编译时类型推断是更准确的术语)。
另一方面,object 是一个特定类型;所有其他引用类型都派生自object,因此您可以将任何内容分配给object 类型的变量。
【讨论】:
Object 引用之前被装箱。
var 那么正如@Ben Voigt 所说,您可以对存储在 var 中的对象执行操作而无需必须投射它。
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 提供的任何操作,只有对所有对象有效的操作。
【讨论】:
var 仍然是强类型的,但使用 object 你将不得不强制转换所有内容。
【讨论】:
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)。它是编译时类型安全规则的一部分。
【讨论】: