【发布时间】:2009-10-17 23:23:49
【问题描述】:
没看懂……
为什么他们需要一个共同的基地?
【问题讨论】:
没看懂……
为什么他们需要一个共同的基地?
【问题讨论】:
这个问题以虚假为前提。它们不需要通用的基本类型。这一选择并非出于必要。它是出于为客户提供最佳价值的愿望。
在设计类型系统或其他任何事情时,有时您会遇到决策点——您必须决定是 X 还是非 X。通用基础类型或无通用基础类型。发生这种情况时,您权衡 X 的成本和收益以确定净值,然后权衡非 X 的成本和收益以确定净值,然后选择价值更高的那个。拥有共同基类型的收益大于成本,由此产生的净收益大于没有共同基类型的净收益。所以我们选择有一个通用的基类型。
这是一个相当模糊的答案。如果您想要更具体的答案,请尝试提出更具体的问题。
【讨论】:
我认为,主要是为了有一个类型来引用任何对象。 object 类型的参数可以是原始类型、结构、引用类型,等等。拥有这样的类型很重要。
然后是每个类型都实现了一些通用成员,例如 Equals、ToString、GetHashCode。这确实也可以是一个通用接口,但是您不会继承默认实现。
【讨论】:
【讨论】:
许多/大多数是的一些原因:
提供Equals、Finalize、GetHashCode、ToString等常用成员......
帮助拳击......
【讨论】:
Java 和 C# 对此采取了不同的方法。这主要与性能有关。
如果你想象每个对象都可以为空,那么它必须是一个指向值的指针,可以将其更改为指向空的指针。现在这意味着对于每个对象,您至少需要一个指针和一块内存来存储值。
Java 有原始值的概念,它不是对象。它没有指针,也不能为空。这打破了 OOP 范式,但在性能方面是有意义的。
C#(或更准确地说是 CLR + BCL)尝试了一个很好的折衷方案,即 ReferenceType 和 ValueType 派生。任何从 ValueType 派生的东西都被视为 CLR 的原语,避免了对象引用。然而,这个值仍然可以通过装箱被视为对象,允许您获得原始类型的性能优势,但允许将所有内容都视为对象。
这些东西之间真正的关键区别在于将参数传递给方法的语义。如果一切都是对象,那么您将传递对对象的引用,即可以通过将对象传递给方法来更改对象。基元和 C# 值类型是按值传递的,因此它们被有效地复制到方法调用中,并且原始值不变。
这是标准的开发故事。先试着把它做好,然后看看你是否可以在看到瓶颈后对其进行优化。传递值语义还允许您防止编码错误的可变性。 (例如,在 C# 中传递一个类与一个结构)
【讨论】:
到字符串。例如。
【讨论】:
对装箱和拆箱很有用
【讨论】:
.NET 中的每个对象都有共同的属性和方法。但是,这些又分为两类:值类型和引用类型。值类型(即 int)存储在堆栈中,引用类型(即您的自定义类)存储在堆中。引用类型存储对实际数据的引用(即在堆上)。值类型直接包含它们的数据。
您可以在 MSDN 上阅读更多内容:
【讨论】:
作为其他“答案”的旁注,结构是一种值类型,它也继承自对象。
也许答案是它假设我们正在编程面向对象的风格/范式?球是一个物体。剑是物体。员工是一个对象。采购订单是一个对象。
一些公司将他们的 .NET(或 Java、Ruby 或 PHP)应用程序设计为继承自一个公共基类,以便在他们的系统中以同样的方式对待它们。如果我在过去的 Java 时代没记错的话……所有 EJB 共享同一个基类,以便统一管理和识别它们。
【讨论】: