【问题标题】:Is UML DataType passed call-by-value like C# structsUML DataType 是否像 C# 结构一样按值传递
【发布时间】:2015-03-12 11:29:55
【问题描述】:

我有一个关于 UML 数据类型的问题。

UML 上层结构说:

数据类型是其实例仅由其值标识的类型。

如果我理解正确,这意味着通过查看所有属性的值来检查相等性。

这是否也意味着 DataType 总是像 C# 结构一样被复制?

它们是按值传递给方法的吗?如果我将 DataType 分配给一个新变量,这是否会产生副本? (例如在 Alf 中)

我在互联网上找不到这个问题的答案。

【问题讨论】:

  • 根据该定义,string 是 DataType,但 string 也是引用类型。基本上,UML“数据类型”是一个语义定义,它没有规定特定的实现(即它没有说明在 c# 中是使用引用类型还是值类型)
  • 好吧,如果您将其作为答案,我会接受。基本上,DataTypes 和 Classes 之间的唯一区别是它们的相等行为。这有点尴尬,因为原始类型是 DataTypes,我希望在分配给新变量时复制一个 Integer。

标签: c# struct uml call-by-value


【解决方案1】:

这是个好问题。通常情况下,基本 UML 规范中的语义描述有点模糊。但是,Alf 是基于基础 UML (fUML) 语义,而 fUML 在这一点上是精确的。

简短的回答是,数据类型确实是按值传递的,而不是引用传递,并且是不可变的。任何对数据类型值的明显变异操作实际上都会导致创建一个新值。例如,考虑 Point 数据类型的以下 Alf 代码:

a = new Point(1,1);
b = a;
a.x = 2;

赋值b = a;实际上复制了点数据值。因此赋值a.x = 2;b 没有影响。事实上,第二个赋值实际上等价于a = new Point(2, a.y);。也就是说,它会创建一个新的点数据值,然后将其重新分配给a

这些语义明确地包含在 Alf 和 fUML 规范中。数据类型的定义在 Alf 规范 1 的子条款 10.4.4 中介绍。但是,上述赋值的语义在第 8.8 节中,它说,在对属性引用的简单赋值(如a.x)的描述下:

如果属性引用具有一个本地的主表达式 名称或参数名称,并且类型为结构化数据类型, 然后对属性引用的分配有效地分配了一个 具有给定的本地或参数名称的新数据值 属性已更新。

如果您对数据值语义的更多细节感兴趣,可以在 fUML 规范2 中找到它。值的语义在 8.3.2.1 小节中讨论。关键是数据值和“扩展值”之间存在区别。扩展值存在于它们的分类器的范围内,独立于它们的使用——这在 fUML 中等同于“堆”的运行时实现概念。

扩展值包括作为关联实例的链接和作为类实例的对象。此外,还有一些用于引用对象的引用值。传递的始终是对对象的引用,而不是对象本身——对象只是存在于执行位置(“在堆上”)。因此,对象具有引用语义,而不是数据值,数据值本身可以作为值传递。

因此,在 fUML 规范中,数据值与对象的语义没有模糊性。

【讨论】:

    【解决方案2】:

    UML 数据类型或多或少等同于Immutable Objects 的概念:一个无法更改的对象。

    这确实也很像 C# 中的 Value Types,除了字符串之类的东西,它们实际上是不可变引用类型。所以字符串也将被视为 UML 数据类型。

    【讨论】:

    • 我找不到 DataTypes 是不可变的官方声明。也许它们注定是不可变的。但只要没有明确说明,人们就会改变复合 DataTypes 的属性。我认为除非有官方声明,否则假设 DataTypes 是不可变的是不安全的。
    • 它们是不可变的这一事实可以源于它们只能通过它们的值来识别的事实。如果值发生变化,您将拥有另一个身份,因此另一个对象。所有具有相同值的对象具有相同的标识 -> 是相同的对象。
    • 我明白你的意思。然而,令我困扰的是,标准中没有明确说明这一点。可能对 UML 无关紧要。但我正在使用需要具有精确执行语义的 Alf。我认为在这种情况下他们失踪了。问题是:例如,如果我有以下 Alf 代码,其中 Point 是 DataType,则存储在 b 中的内容:a = b = new Point(1,1); a.x++;
    • 看到this 我想我现在明白了。没有身份意味着它们不是对象。它们不作为具有地址的可识别对象驻留在堆上。这意味着变量不是对这些类型的引用,而是需要将整个数据类型对象存储在其中。
    猜你喜欢
    • 1970-01-01
    • 2012-03-04
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 2014-09-08
    • 2019-07-16
    • 2011-02-14
    相关资源
    最近更新 更多