以此类推,C#基本上就像一套机械工具,有人读过,您通常应该避免使用钳子和活动扳手,因此它根本不包含活动扳手,并且钳子被锁定在标记为“不安全”的特殊抽屉中,并且只有在签署免责声明后才可使用,该免责声明使您的雇主对您的健康负有任何责任。
相比之下,C ++不仅包括活动扳手和钳子,还包括一些用途不明显的怪异的专用工具,如果您不知道正确的握持方法,它们可能会轻易切断您的手。拇指(但是一旦您了解了如何使用它们,就可以使用C#工具箱中的基本工具完成本质上不可能的操作)。此外,它还具有车床,铣床,平面磨床,金属切割带锯等,可让您在需要时设计和创建全新的工具(但是,这些机械师的工具会并且会导致如果您不知道自己在做什么,或者即使您只是粗心大意,也可能会受到严重伤害)。
这反映了哲学上的基本差异:C ++试图为您提供您可能想要的任何设计所需的所有工具。它几乎不会尝试控制您使用这些工具的方式,因此也很容易使用它们来生成仅在极少数情况下才能正常工作的设计,以及可能只是一个糟糕想法而没人知道这种情况的设计。他们可能会很好地工作。尤其是,很多工作都是通过解耦设计决策来完成的,即使实际上实际上几乎总是耦合在一起的。结果,仅编写C ++和编写良好的C ++之间存在巨大差异。为了很好地编写C ++,您需要了解很多习惯用法和经验法则(包括关于在打破其他经验法则之前应认真考虑的经验法则)。结果是,C ++的重点是易于使用(专家)而不是易于学习。在很多情况下,使用它们也不是一件容易的事。
C#做出了很多努力来试图(或者至少非常强烈地建议)语言设计师认为好的设计实践。在C ++中有很多解耦的东西(但通常在实践中会结合在一起)在C#中直接耦合。它确实允许“不安全的”代码稍微突破界限,但老实说,并不是很多。
结果是,一方面,有很多设计可以直接用C ++进行表达,而这些设计在C#中表达起来却很笨拙。在另一方面,它是一个整体更容易学习C#,并产生一个很可怕的设计,将您的情况不工作(或者可能是任何其他)的的机会大大减少。可以说,在很多(可能甚至是大多数)情况下,只需“顺其自然”,就可以得到可靠,可行的设计。或者,正如我的一个朋友(至少我喜欢将他视为朋友-不确定他是否真的同意)喜欢说的那样,C#使其很容易陷入成功。
因此,更具体地看一下这两种语言的方式class
和struct
获得方式的问题:在继承层次结构中创建的对象,在这些继承层次中,您可能以其基类/接口的名义使用派生类的对象,因此,您几乎可以坚持您通常需要通过某种指针或引用来做到这一点的事实-具体而言,发生的事情是派生类的对象包含一些可以视为基类/实例的内存。接口,并且派生对象通过该部分内存的地址进行操作。
在C ++中,取决于程序员是否正确执行此操作-当他使用继承时,取决于他(例如)确保与层次结构中的多态类一起工作的函数通过指针或对基的引用来做到这一点类。
在C#中,类型之间基本相同的分隔要明确得多,并且由语言本身来实施。程序员无需采取任何步骤即可通过引用传递类的实例,因为默认情况下会发生这种情况。
struct
s并不总是存储在堆栈中;考虑带有struct
字段的对象。除此之外,正如梅森·惠勒(Mason Wheeler)提到的,切片问题可能是最大的原因。