有没有一个词可以包括“类”和“结构体”?

6

C#中的类和结构体具有几个共同的特点:

  • 它们可以实例化(除了抽象类和静态类之外)
  • 它们可以包含方法和属性实现
  • 类型的作者定义类型的实例字段

我们通常使用“class”和“struct”来区分“引用类型”和“值类型”,但有时考虑两种类型都是有用的。此外,“引用类型”还包括接口和委托,它们不是类。因此,“class”并不意味着任何引用类型,它指的是“一个引用_(填空)_”。

例如,如果引用和值类型声明如下:

public sealed class ref String { }
public class val Int32 { }

不要像这样:

public sealed class String { }
public struct Int32 { }

那么“class”这个词可以用来表示这个概念。

我想到的最好的答案是“具体类型”,但这会让人感到困惑,因为它也可能指抽象类的非抽象子类。

有什么建议吗?

编辑

澄清一下,我不是在寻找一个能够共同描述类和结构体实例的单词。我试图描述类类型和结构体类型。

换句话说,如果“class”表示包括System.StringSystem.FileInfo等在内的一组,而“struct”表示包括System.Int32System.Collections.Generic.List<T>.Enumerator等在内的一组,则我正在寻找表示这些集合的并集的单词。

编辑2

(针对Jordão的回答)回答这个问题的另一种方法是完成以下句子:“所有C#方法实现都必须声明为_(填空)_的成员。”


“Object” 包含它们两个... 但不是唯一的! - Widor
1
Types 和被实例化后的 Objects. - Oded
1
@Oded Types 包括各种类型,但我想排除某些类型;请参见编辑2以获得澄清。 - phoog
@phoog - 正确的术语是Type。除了引用类型(类)和值类型(结构体)之外,您还有什么其他类型想到的吗? - Oded
我想要包含使用关键字 classstruct 声明的 C# 类型,同时排除使用关键字 enumdelegateinterface 声明的类型。 - phoog
6个回答

5

我通常使用术语“类型”来引用那些元素:类、结构体,甚至接口和枚举。

我从来没有真正感觉到有必要专门讨论类和结构体,我可能只会说“类”,然后根据需要进行区分。


我特别寻找一个词,它排除了接口和枚举(例如,因为您无法将方法实现为这些类型的成员)。 - phoog

4
在C#中,“type”一词可以指任何以下内容之一:
引用类型 object、dynamic和string 类类型 接口类型 委托类型 构造的类/接口/委托类型(如List) 数组类型
值类型 结构类型 枚举类型 简单类型(整型、浮点型、decimal和bool) 可空类型
指针类型
所有这些都是C#规范中的术语。
类、接口、委托、结构和枚举类型也称为“类型声明”(或:“用户定义类型”)。
根据您的观点,您还可以考虑类型参数和void为类型。
但是,“类或结构体”没有任何特殊术语。在C#规范的语言中,人们会说:
所有C#方法实现必须声明为class或struct声明的成员。

2
我知道这个问题已经有了一个精选答案,但我相信我可以提供一个新的见解,仍然会有帮助:

我认为你要找的词可能是模型。在计算机科学中,这个术语有多种不同的含义,但维基百科数学模型的文章描述了我的意图。

在这个背景下,模型是对某个系统用一些元语言进行描述。一个系统可以完全用其三个部分来表达:结构、行为和互联性。.NET类和.NET结构都符合这个定义。接口不符合,因为行为没有被定义。你只能指示方法调用和成员声明的结构以及操作的类型契约(互连性)。枚举可能与此定义兼容,也可能不兼容,但通常不兼容,因为它们通常不表达行为。例外是枚举,其中按位运算足以表示有意义的集合操作。在此前提下,我认为将枚举分类与类和结构体相同是公平的。

作为一个附注,如果将扩展方法解释为类型本身固有的内容,则界面和标准枚举都可以被视为系统。然而,无论是编译器还是我都不认为扩展方法是第一个操作数类型固有的内容。更准确的解释是将枚举/接口和扩展方法都视为系统的必要组件。这些组件类型与类/结构体/特殊情况的枚举之间的区别在于,类/结构体/特殊情况的枚举本身就是一个系统,因此是其包含系统的子系统,而组件类型只是组件,而不是系统本身。
值得澄清的是,在这种解释下,术语“模型”类似于类型,而术语“系统”类似于实例。系统也可以应用于更大的组合,例如程序集,但这不是问题所在。
声明“所有C#方法实现必须声明为模型的成员”似乎是行得通的。它也不会逻辑上暗示“所有模型都可以包含自定义方法实现”,因此在集合论枚举的特殊情况下我们是安全的。它也适用于模拟系统由静态扩展方法实现和接口组成的情况。

 


非常有趣。 “操作类型契约”与“方法调用和成员声明结构”有何不同? 我查看了维基百科文章,以了解“连接性”如何适用于.NET类型,但该词在那里并未出现。 - phoog
@phoog,通过“操作类型契约”,我指的是接受参数的契约,以便将其与系统互连性的概念相对应。如果您熟悉面向对象编程中的“协作者”概念,则基本上是相同的,但短语“操作类型契约”采用了更具体的实现角度。 - smartcaveman
通过“方法调用和成员”声明的结构,我所指的是一组方法声明和相应的元数据、声明顺序以及已声明或继承的成员之间的区别。基本上,它是接口/类等的组合“签名”。此外,您将在系统相关的互连性方面找到更多信息,可以在维基百科的“系统”文章中查阅。这不是.NET术语。 - smartcaveman

1

我认为这是一个伪讨论。第三点也可以适用于枚举和接口,而关于抽象类的子类不适合混合使用的观点,我就是不明白。我认为你自己提出的“具体类型”是可以的,但也许你只想谈论它们作为类和结构体,哦等等,但除了抽象类的子类和实现接口的类。没有一个术语来描述你所寻找的可能是因为它本身并不是一个非常有用的概念。

编辑:

所有C#方法实现都必须声明为类或结构体的成员。


我觉得我的问题有点让你困惑了,对此我很抱歉。我并不是要排除抽象类;我只是想说,“具体类型”与抽象类有关的含义已经被确立,因此“具体类型”不是这个问题的好答案。至于第三点,在枚举中无法定义实例字段,因为它已经被指定了,而接口没有字段。鉴于枚举值被实现为静态字段,我意识到第三点不够具体,所以我会进行编辑。感谢指出这个疏忽。 - phoog
@phoog 好的,我明白你所说的“具体类型”。我的错误。 - Klaus Byskov Pedersen

1

应该是Microsoft术语。这些概念的起源是C ++,其中结构体只是所有成员都是公共类。因此,Microsoft在这里混合了一些C,C ++和Java的新判断。所以他们也应该发明一些术语。

Microsoft将它们全部称为“类型”,可以是“值”,“引用”和“指针”:http://msdn.microsoft.com/en-us/library/3ewxz6et(v=vs.100).aspx

但这些概念并不仅限于结构体和类。

因此,如果发明一些自定义术语,我们可以从Pascal语言中选择一个,例如“记录”。或者可以从这里创造出其他术语:http://en.wikipedia.org/wiki/Object_composition


0

类和结构体都是定义对象的类型。它们是面向对象编程语言中的构建块。您可以使用UML或其他高级面向对象建模语言对它们进行建模。选择其中之一是实现细节。


-1:它们是类型,不是对象。对象是类型的实例。 - John Saunders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接