C#:明确声明“不安全”/编译器选项的好处

2023-11-21

我了解指针以及在 C# 代码中使用它们的罕见需求。我的问题是:必须在代码块中明确声明“不安全”背后的原因是什么。此外,为什么必须更改编译器选项以允许“不安全”代码?

底线:CLR(或语言规范)中的什么使得我们不能在需要时就使用指针(就像 C 和 C++ 一样)而不必键入“不安全”并更改编译器选项?

澄清一下:我知道什么是“不安全”和“安全”代码。这只是一个问题:为什么我们必须做所有额外的工作(好吧,不是那么多额外的工作)才能使用这些功能。


C# 创建者 Anders Hejlsberg 的采访谈到了这个主题here。基本上,正如 @Marc Gravell 所说:类型安全第一,显式声明不安全。

所以回答你的问题:CLR 中没有任何东西可以阻止它;这是一种语言习语,旨在让您在处理类型时可以戴着安全手套。如果你想脱掉手套,那是你的选择,但你必须主动选择脱掉手套。

Edit:

澄清一下:我知道什么 “不安全”和“安全”代码是一样的。只是 为什么我们必须做所有的事情 额外的工作(好吧,没有那么多额外的工作) 只是为了能够使用这些功能。

正如我链接的采访中提到的,这是一个明确的设计决定。 C# 本质上是 Java 的演变,而在 Java 中,根本没有指针。但设计者希望允许指针;然而,由于 C# 通常会引入 Java 开发人员,因此他们认为最好default行为与 Java 类似,即没有指针,同时仍然允许通过显式声明使用指针。

所以“额外的工作”是故意强迫你在做之前思考你在做什么。通过明确,它迫使你至少考虑:“我为什么要这样做?我这样做吗?”really当引用类型就足够时还需要指针吗?”

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

C#:明确声明“不安全”/编译器选项的好处 的相关文章

随机推荐

  • 如何找到退化树中从特定顶点开始的所有相等路径?

    我有一些degenerate tree 它看起来像数组或双向链表 例如 是这棵树 每条边都有一定的权重 我想找到从每个顶点开始的所有相等路径 换句话说 我想获取所有元组 v1 v v2 其中 v1 和 v2 是任意祖先和后代 使得c v1
  • Android 将图片发布到 Facebook 墙

    我正在尝试将照片发布到我的 Facebook 墙上 我已经成功登录并将文本发布到墙上 然而 当我尝试发布图片时 什么也没有发生 我正在使用Android 脸书 SDK 这是我到目前为止所拥有的 Bundle params new Bundl
  • PHP 5.2 注意:使用未定义常量 __DIR__ - 假定 '__DIR__ [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 在 php 5 3 或更低
  • 使用 Sass / Compass 的多个背景图像

    下面使用 sass compass 生成一个 base64 内联图像 background image inline image paper jpg image jpg 有没有办法制作多个背景图像 或者我必须自己预压缩它们才能做到这一点 T
  • Python OpenCV - 删除标题栏、工具栏和状态栏

    我找到了关于 C 的文档 但关于 python 的文档却很少 python 中显示的基本代码是 import numpy as np import cv2 Load an color image in grayscale img cv2 i
  • 在 Flask 中,如何重定向到模板并在视图中返回 send_file 后显示消息?

    我第一次深入使用 Flask 遇到了一个小问题 我有一个带有表单和一堆复选框的页面 提交表单时 我将从所有复选框中获取值并将其传递到一个脚本 我已经有 中 该脚本基本上会写入一个 CSV 文件 我所做的是 提交表单后 CSV 文件在后台创建
  • 推荐用于 JQuery 的 JavaScript HTML 模板库吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 关于哪个 HTML 模板库
  • 如何使用 JPA Criteria API 解析 Oracle 的“rownum”伪列?

    我想使用 JPA Criteria 从数据库获取第一行 我使用JPA Hibernate 4 2 7 在 SQL 中 语句如下所示 SELECT FROM houses WHERE rownum 1 我的 Java 代码实现如下所示 Cri
  • Fabric js 使用自定义属性扩展 toObject,丢失了默认属性

    在发布这篇文章之前 我一直在这里和其他许多地方一样进行查找 但我可以让它充分发挥作用 我所需要的只是能够在所有形状中保存一些自定义属性 属性是 uuid 和 rt attributes 因此 按照手动方式 我添加了以下代码 fabric O
  • 如何在cygwin上通过控制台安装以前版本的软件包?

    我需要编写一个使用 svn 1 6 17 部署许多 cygwin 应用程序的脚本 我所有的尝试都是通过安装 svn 1 7 或什么都不完成 我尝试安装 subversion subversion 1 6 subversion 1 6 17
  • 连接 xml 文件

    我有几个 xml 文件 其名称存储在另一个 xml 文件中 我想使用 xsl 生成 xml 文件组合的摘要 我记得有一种方法可以使用 msxml 扩展来执行此操作 我正在使用 msxml 我知道我可以使用获取每个文件的内容select do
  • 如何使用 JavaScript 检测 Chrome v78+ 上的 #enable-force-dark 标志?

    我最近为我的网站设计并实现了一种深色模式 该模式使用自定义深色来匹配浅色 默认 配色方案 而且我最近还意识到 Chrome 78 有一个可选标志 称为 enable force dark 启用后 用户必须这样做 Chrome 会自动尝试将网
  • 验证用 javascript 逗号分隔的多个电子邮件

    我想验证一个字符串 它可以是一封电子邮件或多封以逗号分隔的电子邮件 例如 电子邮件受保护 gt 正确账单 gt 假 电子邮件受保护 电子邮件受保护 gt 正确 电子邮件受保护 电子邮件受保护 鲍勃 gt 假 bob 电子邮件受保护 电子邮件
  • 如何在静态上下文中将泛型类与特定对象一起使用?

    我会尽力解释 我使用 Play Framework 2 我会做很多 CRUD 操作 其中一些是相同的 所以我想 KISS 和 DRY 所以一开始我正在考虑一个包含以下内容的抽象类list details create update and
  • 动态将 Expression> 转换为 Expression

    我找不到从 Expression gt 转换为 Expression gt 的方法 由于我使用了大量反射 实际上 我真正需要的是一种采用类型参数并执行转换的方法 public object Convert Expression
  • 检查pandas数据框中是否有多个子字符串[重复]

    这个问题在这里已经有答案了 我有一个 pandas 数据框 我想检查特定列的子字符串 目前我有 30 行这样的代码 df NAME str upper str contains LIMITED df NAME str upper str c
  • python打开不同目录下的所有文件

    我需要在当前目录中打开另一个目录中的文件而不使用它的路径 当我执行以下代码时 for file in os listdir sub dir f open file r lines f readlines for line in lines
  • C++ const Convert [重复]

    这个问题在这里已经有答案了 可能的重复 为什么将 指向非常量指针的指针 转换为 指向指向常量指针的指针 是不合法的 我有一个功能 bool isCirclePolygonIntersection const Point const int
  • 无需编写控制器的简单 ASP.NET MVC 视图

    我们正在构建一个具有非常少代码的网站 它主要只是提供一堆静态页面 我知道随着时间的推移 情况会发生变化 我们需要交换更多动态信息 因此我决定继续使用 ASP NET MVC2 和 Spark 视图引擎构建一个 Web 应用程序 将有几个控制
  • C#:明确声明“不安全”/编译器选项的好处

    我了解指针以及在 C 代码中使用它们的罕见需求 我的问题是 必须在代码块中明确声明 不安全 背后的原因是什么 此外 为什么必须更改编译器选项以允许 不安全 代码 底线 CLR 或语言规范 中的什么使得我们不能在需要时就使用指针 就像 C 和