为什么使用int, float等而不是object
本文关键字:object float int 为什么 | 更新日期: 2023-09-27 18:18:18
我一直在读一本关于c#的书,书中解释说int、float、double等都是"基本"类型,这意味着它们将信息存储在语言的最底层,而像"object"这样的类型将信息存储在内存中,然后程序必须在那里访问这些信息。作为一个初学者,我不知道这到底意味着什么!
然而,这本书没有解释区别是什么。为什么我每次都要用int或string之类的而不是object,因为object本质上就是这些类型中的任何一种?它如何影响程序的性能?
这是一个非常广泛的话题,恐怕你的问题目前很容易被搁置。这个答案只能触及表面。试着多教育自己,然后你就能问更具体的问题了。
为什么每次都要使用int或string之类的而不是object,因为object本质上就是这些类型中的任何一种?
基本上,您使用适当的类型来存储不同类型的信息,以便对其执行有用的操作。
就像你不能"加"两个对象一样,你不能得到一个数字的子字符串。
:
int foo = 42;
int bar = 21;
int fooBar = foo + bar;
如果将变量声明为object
,这将不起作用。您可以进行加法运算,因为数字类型上定义了数学运算符,例如+
运算符。
你可以引用一个整数类型作为对象(或者任何类型,在c#中一切都继承自对象):
object foo = 42;
然而,现在你将无法将这个foo
添加到另一个数字。它被称为盒装值类型。
这些不同的类型究竟存储在哪里完全是另一个主题,关于这个主题已经写了很多。参见示例:为什么值类型在堆栈上创建,而引用类型在堆上创建?同样相关的是值类型和引用类型之间的区别,正如在注释中指出的那样。
c#是一种强类型语言,这意味着编译器会检查变量和方法的类型是否始终一致。这就是为什么你不能写这样的东西:
void PrintOrder(Order order)
{
...
}
PrintOrder("Hello world");
因为它没有意义。
如果你只是到处使用object
,编译器不能检查任何东西。不管怎样,它不会让你访问实际类型的成员,因为它不知道它们的存在。例如,可以这样做:
OrderPrinter printer = new OrderPrinter();
printer.PrintOrder(myOrder);
但这不是
object printer = new OrderPrinter();
printer.PrintOrder(myOrder);
因为在Object
类中没有定义PrintOrder
方法。
如果您使用的是松散类型的语言,那么这似乎是一种约束,但是您会逐渐欣赏它,因为它使您可以在编译时而不是在运行时检测许多潜在的错误。
这本书所指的基本上是值类型(int, float, struct等)和引用类型(string, object等)之间的区别。
值类型将内容存储在堆栈上分配的内存中,这是有效的,而引用类型(几乎任何可以具有null
值的类型)存储数据所在的地址。引用类型是在堆上分配的,这比堆栈效率低,因为分配和释放用于存储数据的内存是有成本的。(它只被垃圾收集器释放)
因此,如果您每次都使用object
,那么分配内存和回收内存的速度将会变慢。