为什么使用int,float等而不是对象?

时间:2015-10-18 19:46:17

标签: c#

我一直在读一本关于C#的书,它解释说int,float,double等是" basic"类型意味着它们将信息存储在语言的最低级别,而类型如“对象”类型。将信息放入内存中,然后程序必须在那里访问这些信息。但是,我并不确切地知道这对初学者来说意味着什么!

然而,这本书没有解释它的区别。为什么我每次都会使用int或string或者any而不是object,因为对象基本上都是这些类型中的任何一种? 它如何影响该计划的表现?

3 个答案:

答案 0 :(得分:4)

这是一个非常广泛的主题,我担心你所提出的问题很容易被搁置。这个答案几乎不会刮到表面。尝试更多地教育自己,然后你就可以提出更具体的问题。

  

为什么我每次都会使用int或string或者any而不是object,因为对象基本上都是这些类型中的任何一种?

基本上,您使用适当的类型来存储不同类型的信息,以便对它们执行有用的操作。

就像你没有"添加"两个对象,你不能得到一个数字的子串。

所以:

int foo = 42;
int bar = 21;
int fooBar = foo + bar;

如果您将变量声明为object,那么这不会起作用。您可以进行添加,因为数字类型上定义了数学运算符,例如+ operator

可以将整数类型称为对象(或任何类型,就像在C#中所有从对象继承的一样):

object foo = 42;

但是现在您无法将此foo添加到另一个号码。它被称为boxed值类型。

存储这些不同类型的确切位置是另一个主题altofhether,已经写了很多。请参阅示例Why are Value Types created on the Stack and Reference Types created on the Heap?。正如评论中所指出的那样,value types and reference types之间的区别也是相关的。

答案 1 :(得分:3)

C#是一种强类型语言,这意味着编译器会检查您使用的变量和方法的类型是否始终一致。这就是阻止你写这样的事情的原因:

void PrintOrder(Order order)
{
    ...
}

PrintOrder("Hello world");

因为没有意义。

如果您只是在任何地方使用object,编译器都无法检查任何内容。无论如何,它不会让你访问实际类型的成员,因为它不知道它们存在。例如,这有效:

OrderPrinter printer = new OrderPrinter();
printer.PrintOrder(myOrder);

但这不是

object printer = new OrderPrinter();
printer.PrintOrder(myOrder);

因为类PrintOrder中没有定义Object方法。

如果你来自松散类型的语言,这似乎有些限制,但你会明白它,因为它可以让你在编译时检测到许多潜在的错误,而不是在运行时。

答案 2 :(得分:2)

本书所指的基本上是值类型(int,float,struct等)和引用类型(字符串,对象等)之间的区别。

值类型将内容存储在堆栈上分配的内存中,这对于引用类型(几乎任何可以具有null值的内容)存储数据所在的地址是有效的。在堆上分配引用类型,其效率低于堆栈,因为分配和取消分配用于存储数据的内存存在成本。 (并且它只被垃圾收集器解除分配)

因此,如果您每次使用object时分配内存的速度会慢一些,而回收它的速度会慢一些。

Documentation