为什么使用int, float等而不是object

本文关键字:object float int 为什么 | 更新日期: 2023-09-27 18:18:18

我一直在读一本关于c#的书,书中解释说int、float、double等都是"基本"类型,这意味着它们将信息存储在语言的最底层,而像"object"这样的类型将信息存储在内存中,然后程序必须在那里访问这些信息。作为一个初学者,我不知道这到底意味着什么!

然而,这本书没有解释区别是什么。为什么我每次都要用int或string之类的而不是object,因为object本质上就是这些类型中的任何一种?它如何影响程序的性能?

为什么使用int, float等而不是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,那么分配内存和回收内存的速度将会变慢。

文档