【问题标题】:structs, enums, classes, interfaces, anything else?结构,枚举,类,接口,还有什么?
【发布时间】:2013-05-06 20:23:18
【问题描述】:

我在编写一些处理反射的辅助函数时正在思考这个问题。 C#中除了classes、structs、enums和interfaces还有什么别的吗?如果我编写一个检查classstructenuminterface 的函数,那会是包罗万象的函数吗?

我读到delegates 无论如何都是类herehere

帮助我完善我对这种层次结构的想法:

   reference type                   value type
         |                               |    
  ---------------                   ----------
  |             |                   |        |
interface    class                struct    enum


// the all encompassing function - pseudo code:
public static bool IsC#Stuff(this Type type)
{
    return type.IsEnum || type.IsStruct || type.IsClass || type.IsInterface;
}

我错过了什么吗?

【问题讨论】:

  • 指针和几种引用(例如用于ref参数的那些)
  • @asawyer 代表无论如何都是内部的类。由typeof(Func<>).IsClass 确认。但我不知道你为什么说泛型。
  • 请注意您的层次结构:值类型可以实现接口以及引用类型..
  • 泛型提出了一个有趣的例子:泛型类型/方法中的T 可以是要么 值类型 引用类型;有特殊的操作码(“unbox any”和“constrained”)来允许这项工作
  • @nawfal: 数组和委托instances很像其他堆对象实例,但是数组和委托类型描述(即@987654336的实例@ 定义数组和委托类型)是特殊的,因为它们封装了其他类型。如果泛型是 NET 1.0 规范的一部分,那么委托和数组的处理方式可能与其他泛型类型大致相同,但需要进行特殊处理以使其成为准泛型。

标签: c# .net class types struct


【解决方案1】:

还有数组和委托,虽然它们实际上是类。

在泛型方法或类型的定义中还有引用(ref 方法参数)和泛型类型参数。

在不安全的代码中,也有指针。

【讨论】:

  • 嗯,很有趣。从来没有想过指针。但我不明白你为什么提到ref 参数和泛型类型参数。它们是否等同于类、结构等?
  • @nawfal:不;他们不是。
  • @nawfal:如果有int字段,并且调用Interlocked.Increment(ref myField),则传递的参数是Int32 byref。普通的“引用”类型包含独立的持久对象引用,可以根据需要保留它,并且只要引用存在,就会保留底层对象。每个独立对象都有一些与之关联的“额外”信息来帮助垃圾收集器。 “byref”可能指的是没有存储 GC 信息的原语,但仅在传递给它的过程范围内有效。
【解决方案2】:

不确定这是不是您问题的直接答案,但 .NET 有 5 种类型:
类、结构、接口、委托和枚举

Common Type System

【讨论】:

  • Blam,代表在内部基本上是类。
  • @nawfal:值类型也是类(它们派生自 System.ValueType,而 System.ValueType 派生自 System.Object)有时这种区别很有用,有时则不然。有时区分代表很有用,有时则不然。
  • @BenVoigt 没错,但这里我说的是基础对象本身。我知道intValueType,这又是一个类。但是typeof(int).IsClass 返回false,即使typeof(ValueType).IsClasstrue。同样,typeof(Delegate).IsClasstrue,但即使typeof(Func<>).IsClass 返回true。有一点令人困惑,但我对该主题进行了一些阅读,并在内部意识到它们是类(具有特殊语法)。请通过我在问题中附加的两个链接。
  • @nawfal:那是因为IsClass 的规范不是“如果它是一个类则为真”。 “如果它是一个类但它不是一个值类型,则为真”。
  • @nawfal 这是来自 CTS 的正式类型定义。
猜你喜欢
  • 2016-11-26
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
相关资源
最近更新 更多