为什么静态类被视为“类”和“引用类型”?

2023-12-21

我今天一直在思考 C# 和 CIL 类型系统,并且开始想知道为什么静态类被视为类。在很多方面它们并不是真正的类:

  • “普通”类可以包含非静态成员,而静态类则不能。在这方面,类更类似于struct与静态类相比,结构体具有单独的名称。
  • 您可以引用“普通”类的实例,但不能引用静态类(尽管它被视为“引用类型”)。在这方面,类更类似于界面与静态类不同,但接口具有单独的名称。
  • 静态类的名称永远不能用在通常适合类型名称的任何地方:您不能声明此类型的变量,不能将其用作基类型,也不能使用它作为泛型类型参数。在这方面,静态类有点像命名空间.
  • “普通”类可以实现接口。再一次,这使得类更加类似于structs比静态类。
  • “普通”类可以从另一个类继承。

同样奇怪的是静态类被认为是派生自系统对象。虽然这允许他们“继承”静态方法Equals and 参考等于,该继承的目的是有问题的,因为您会调用这些方法object反正。 C# 甚至允许您在静态类上显式指定无用的继承,但不能在接口或结构上指定,其中隐式派生自object and 系统值类型,分别实际上有一个目的。

关于特征子集参数:静态类具有类特征的子集,但它们也具有结构体特征的子集。所有使类与其他类型不同的东西似乎不适用于静态类。

关于typeof争论:将静态类变成新的不同类型并不妨碍它被用于typeof.

考虑到静态类的奇特之处,以及它们与“普通”类之间缺乏相似之处,难道它们不应该被制作成一种单独的类型而不是一种特殊的类吗?


就 CLR 而言,它是一个类。基本上,它只是 C# 编译器中的语法糖。

我认为在这里添加不同的名称不会有任何好处 - 它们的行为mostly就像只有静态方法并且不能构造的类,通常是这样的类became当我们从 C# 1 迁移到 C# 2 时,它是一个静态类。

请记住,如果您想为其创建一个新名称,这可能也意味着一个新关键字......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么静态类被视为“类”和“引用类型”? 的相关文章

  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 全局使用和 .NET Standard 2.0

    我最近意识到我可以使用 C 10 功能文件范围的命名空间在 NET Standard 2 0 项目中也可以通过设置
  • 带有运算符语法的错误消息,但不带有函数语法的错误消息

    为什么我在调用 unary 时收到错误消息 使用运算符语法 如果我用函数语法调用它就可以了 现场演示 https godbolt org z j7AbeQ template
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • 为什么不能调用带有 auto& 参数的 const mutable lambda?

    include
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • doxygen c++:记录由“using”声明公开的私有继承成员

    作为一个例子 我有以下课程 class A public void methodOne class B private A public Brief description using A methodOne 我还没有找到强制 doxyge
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void
  • 这种尺寸对齐是如何工作的

    对于所提供的评论 我无法理解以下代码 这段代码的作用是什么 以及等效的代码是什么8 aligned segment size must be 4 aligned attr gt options ssize 3 Here ssize is o
  • 将 char 绑定到枚举类型

    我有一段与此非常相似的代码 class someclass public enum Section START MID END vector section Full void ex for int i 0 i section
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可
  • 为什么表达式 a = a + b - ( b = a ) 在 C++ 中给出序列点警告?

    以下是测试代码 int main int a 3 int b 4 a a b b a cout lt lt a lt lt a lt lt lt lt b lt lt b lt lt n return 0 编译此命令会出现以下警告 gt g

随机推荐

  • 有 Windows 的良好 Valgrind 替代品吗?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 当我发现 Valgrind 仅适用于 Linux 时 我正在研究 Valgrind 来帮助改进
  • 如何在C#中获取TPL任务线程的引用?

    当我创建任务时 Task task Task Factory StartNew gt someMethod args 在 C 4 0 中 如何获取此任务的线程的引用 该任务是否有可能在创建该任务的同一个线程中执行或生成多个线程 Update
  • 与 Redux 反应?那么“背景”问题呢?

    我通常在 Stack 上发布与代码相关的内容 但这更多的是关于社区总体想法的问题 似乎有很多人提倡使用 Redux 和 React 来管理数据 状态 但是在阅读和学习两者时 我发现了一些看起来不太正确的东西 Redux 在此页面底部 htt
  • 如何获取datagrid列绑定的字段?

    在我的 xaml 中 我修改了每个列标题以包含一个按钮 对于命令参数 我想使用列的数据字段名称 而不是标题内容 例如 我想要 JOB TITLE 而不是标题内容的 职位名称 对于标题内容我会使用
  • 在 VSTS 中创建 Kubernetes 端点会生成错误

    设置新的 Kubernetes 端点并单击 验证连接 时出现错误消息 Kubconfig 不包含用户字段 请检查 kubeconfig 始终显示 尝试了多种输出配置文件的方法均无效 我还从网上复制并粘贴了许多示例配置文件 但最终都遇到了相同
  • Google 表格当前用户

    我希望你能帮助我 我希望在单元格中显示 google 工作表的当前用户以进行 vlookup 我添加了一个脚本来将登录的用户名拉入脚本库 但我无法将 logger log 信息转储到 google 工作表中 任何信息都会很棒 谢谢 奈杰尔
  • 无法使用 Elixir 连接到远程 SSH 服务器

    我已经尝试使用 elixir 连接到远程 ssh 服务器一段时间了 这就是我在 IEX 中所做的 Macintosh elixir logglycious master gt iex 15 07 20 0 11 Erlang OTP 17
  • 应用程序的启动时间

    在android中启动应用程序并计算其启动时间的最佳方法是什么 如果可以用一些代码完成 那就更好了 嗯 首先 更准确地说 我应该指出 在 Android 中 您启动的是 Activity 而不是应用程序 因此 由于应用程序的入口点是处理 L
  • 无法在 .NET standard 2 项目中使用实体框架

    如何在 NET Standard 项目中使用实体框架或类似的东西 NET Standard 2 似乎不支持 EF 这真的很烦人 所以我尝试使用 Microsoft EntityFrameworkCore SqlServer 和 icroso
  • 我可以使用 Razor Intellisense 查看 .html 文件,就好像它们是 Visual Studio 2010 中的 .cshtml 文件一样吗?

    我已经让 Net MVC3 来处理 html 和其他自定义扩展 就像处理 cshtml 文件一样 但 VS2010 不会突出显示 Razor 语法或显示它的 Intellisense 如何让 VS2010 将 html 文件识别为 csht
  • 使用 VS 2015 Professional 创建无需管理员权限即可运行的安装程序

    我正在尝试创建一个无需管理员权限即可运行的安装文件 MSI 为此 我尝试了以下选项 我已经设置了安装所有用户财产给false如下 还设置了安装所有用户可见 to false 我还更改了默认位置 应用程序数据文件夹 更改上述属性后 仍然需要管
  • 如何重新启动用 Delphi 编写的 Windows 服务应用程序?

    我有一个用 Delphi 编写的 Windows 服务 它使用的第三方资源之一偶尔会被损坏 我发现解决这种情况的唯一方法是退出并重新启动程序 我可以从程序内部检测到资源何时损坏 并且可以告诉 Windows 在服务停止后重新启动该服务 但我
  • 新的 ViewController 导致黑屏

    我通过界面生成器添加新的视图控制器 场景 我将它们放在画布上 然后创建一个新的视图控制器子类 NewViewController 这会创建两个文件 NewViewController h and NewViewController m 然后
  • 通知用户应用程序商店中应用程序的新更新作为警报并自动在 iPhone 中安装更新版本?

    目前我的应用程序版本 1 1 可以在应用程序商店中找到 当前情况 当我更新新版本时 当用户访问应用程序商店时 更新会显示在应用程序商店中 必需的 一旦用户启动应用程序警报 就会弹出 如果应用程序商店中有新版本 它应该如果用户单击 确定 则自
  • 从应用程序内部调用地图获取路线 - iOS 5 iOS 6

    这是一个奇怪的问题 我的应用程序应该能够调用 iOS 中的内置地图 5 1 和 6 事实证明 它在iOS6下工作得很好 但在iOS5 1下却不行 iOS6 中的地图被调用 并跟踪从saddr 到daddr 的方向 但是当我在iOS5 中时
  • JDK 似乎已安装,但未检测到且命令不起作用

    我家里刚买了一台新电脑 我整晚都在尝试在我的 Windows 7 64 位机器上安装 JDK 8u11 我知道我下载了正确的 64 位版本 我知道我的计算机上已经安装了 JRE 因为java version回报java version 1
  • 无法在 Windows 上安装 pylibmc

    我尝试在 Windows 10 计算机上使用 pip install pylibmc 安装 pylibmc 但出现以下错误 我需要知道是否有任何方法可以在 Windows 10 上安装 libmemcached 因为我需要安装需要 libm
  • exif数据中没有方向 - PHP图像上传

    一直在尝试检测从 iPhone 上传的图像的图像方向 然后据此调整它们的方向 我正在尝试解决以肖像拍摄的图像以 90 度旋转上传的问题 我尝试了许多不起作用的 switch 语句 因此决定在 JSON 返回中返回 exif 数据 我看到的问
  • 在 mongodb C# 驱动程序中设置 DateTimeSerializationOptions.Defaults 的新方法是什么?

    我正在使用这一行来设置日期时间默认值 DateTimeSerializationOptions Defaults DateTimeSerializationOptions LocalInstance 我收到这个警告 MongoDB Bson
  • 为什么静态类被视为“类”和“引用类型”?

    我今天一直在思考 C 和 CIL 类型系统 并且开始想知道为什么静态类被视为类 在很多方面它们并不是真正的类 普通 类可以包含非静态成员 而静态类则不能 在这方面 类更类似于struct与静态类相比 结构体具有单独的名称 您可以引用 普通