预定义类型和自定义类型之间的“对称性”是什么意思?

时间:2013-06-28 22:59:16

标签: c#

目前,我正在阅读 C#5.0 in Nutshell 和Type Basics(位于第2章)子主题中,术语预定义类型和自定义类型的对称性是引入...

...为什么作者谈到这些类型之间的对称性?有什么理由说类型是对称的?

这是原始段落:

  

C#的一个优点是预定义类型和自定义类型几乎没有差异。预定义的 int 类型用作整数的蓝图。它保存数据-32位 - 并提供使用该数据的函数成员,例如 ToString 。同样,我们的自定义 UnitConverter 类型充当单位转换的蓝图。它保存数据 - 比率 - 并提供功能成员使用该数据。

3 个答案:

答案 0 :(得分:5)

该文本的含义是语言中的所有类型“表现得像对象”。例如,您可以这样做:

int i = 42;
Console.WriteLine(i.ToString()); // called a method on an int

尽可能轻松地做到这一点:

DateTime d = DateTime.Now;
Console.WriteLine(d.ToString()); // called a method on a DateTime

也就是说,如果您不知道id的类型,只需阅读调用.ToString()的代码就无法推断出任何内容。

将此与C ++之类的语言进行对比:

std::string s = "hello";
std::cout << s.length();

int i = 42;
// ...but you cannot invoke any method on i; "ints are special"

这里s.length()编译的事实告诉我们s不是int,或指针,或任何其他原始类型。

这种统一性从技术的角度来看并不能为你带来任何好处,但它仍然是一个受欢迎的功能 - 特别是如果你只是学习这门语言。

答案 1 :(得分:1)

有些语言无法创建与int内置内容类似的行为。在C#中,可以创建具有'int'的所有属性的类型(这是System.Int32的同义词) - 带有+ / - / =操作的值类型。

即。在JavaScript中,无法创建其他Array类型或string类型。在Java值类型中(不是?)不存在,因此程序员(Does Java make distinction between value type and reference type)无法写入等效于“int”的类型。

答案 2 :(得分:1)

我认为作者的观点是内置类型和自定义类型都旨在用于类似的目的;保存数据并提供使用该数据的机制。我相信在那里还有一个隐含的参考,内置对象和自定义对象都继承自System.Object,因此它们具有相似的能力(即ToString())。

我不一定同意术语“对称性”,但这是关于这个话题的两分钱。