- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我真正想知道的是哪些反射方法会触发类型初始化?我有点不清楚。具体来说,如果将提到的两个方法 GetField 和 GetValue 应用于静态字段,是否会触发类型初始化?我已经尝试调查此事,据我所知,执行诸如引用或访问静态字段之类的操作将触发所有静态字段的类型初始化。下面我引用了我认为相关的规范部分,但使用诸如“引用”和“访问”之类的措辞正是我犹豫的地方:
哪些操作实际上符合“访问”条件?
获取字段的 FieldInfo 元数据算作“引用”还是“访问”该字段?
请帮我找到规范的相关部分,这样我就知道我的代码*是安全和规范的。合规并且不会因为一些未记录的实现细节或因为行星恰好对齐而简单地“碰巧工作”。
*我的代码通过了测试,但依赖于类型初始化行为。我的代码没有在这里显示,因为它很冗长,问题不是关于我只是想要一个“你的代码看起来不错”的回复,而是我想了解如何以及为什么这样我可以评估我的代码是否符合规范。我自己是否合规,并且(假设它是合规的)推理我可以和不可以对其进行哪些更改,而不必每次都问一个新问题。
到目前为止,我知道规范的以下部分,其中使用了上述术语“引用”和“访问”:
我知道 ECMA-334(C#语言规范),静态字段初始化,17.4.5.1节
If a static constructor (§17.11) exists in the class, execution of the static field initializers occurs immediately prior to executing that static constructor. Otherwise, the static field initializers are executed at an implementation-dependent time prior to the first use of a static field of that class.
还知道 ECMA-334(C# 语言规范),静态构造函数,第 17.11 节
The static constructor for a non-generic class executes at most once in a given application domain. The static constructor for a generic class declaration executes at most once for each closed constructed type constructed from the class declaration (§25.1.5). The execution of a static constructor is triggered by the first of the following events to occur within an application domain:
- An instance of the class is created.
- Any of the static members of the class are referenced.
If a class contains the Main method (§10.1) in which execution begins, the static constructor for that class executes before the Main method is called. If a class contains any static fields with initializers, those initializers are executed in textual order immediately prior to executing the static constructor (§17.4.5).
更相关ECMA-335(CLI 规范),类类型定义,第一部分,第 8.9.5 节
[...] The semantics of when and what triggers execution of such type initialization methods, is as follows:
- A type can have a type-initializer method, or not.
- A type can be specified as having a relaxed semantic for its type-initializer method (for convenience below, we call this relaxed semantic BeforeFieldInit).
- If marked BeforeFieldInit then the type’s initializer method is executed at, or sometime before, first access to any static field defined for that type.
- If not marked BeforeFieldInit then that type’s initializer method is executed at (i.e., is triggered by):
a. first access to any static field of that type, or
b. first invocation of any static method of that type, or
c. first invocation of any instance or virtual method of that type if it is a value type or
d. first invocation of any constructor for that type.- Execution of any type's initializer method will not trigger automatic execution of any initializer methods defined by its base type, nor of any interfaces that the type implements.
相关 MSDN 链接:
Type.GetField Method
FieldInfo Class
FieldInfo.GetValue Method
最佳答案
What I really want to know is which reflection methods will trigger type initialization?
[...]
Specifically, will the two mentioned methods, GetField and GetValue, trigger type initialization if applied to static fields?
FieldInfo.GetValue
触发类型初始化。是从实验观察中得来的。这一切都取决于实现,并且不会有任何证据。它不一定在所有情况下都有效,因为 Reflection 不需要遵循任何规范,因为规范不涵盖 Reflection。有一些signs你可以获得一个未初始化的字段,但我无法生成实现它的代码。
typeof()
、Type.GetType
和 Type.GetField
很可能不会触发类型初始化。但同样,这是来自观察。
如果您需要确保在任何特定时间/之前调用您的类型初始值设定项,您需要调用 RuntimeHelpers.RunClassConstructor
方法。这是保证类型初始值设定项将被调用的唯一方法,并且在应用程序域的生命周期内仅调用一次。
What actions actually qualifies as "access"?
这些操作都不是,因为规范也没有涵盖反射,因此这些术语不适用于此处。
Does getting FieldInfo metadata for a field count as "referencing" or "accessing" the field?
都没有。
从规范上看不清楚,但我是这样理解“访问”和“引用”的区别的:
PS:目前还不清楚你在问什么以及你试图解决什么具体问题。
关于c# - GetField 和 GetValue 等反射方法是否执行 ECMA 规范术语中的 "referencing"或 "access"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44312778/
我们有一个 Java 项目,每天晚上使用 TeamCity 对 Java 类进行静态分析,以查找代码中容易出现的错误。我们想告诉 TeamCity 寻找开发人员可能引入的与 == 与 .equals
Promises/A+ 这是一个开放标准,旨在让不同开发者实现的 JavaScript Promise 能够无缝衔接并应用——由前辈们制定,为其他后来者提供参考 一个 promise 所
前言 🍊缘由 Git分支管理好,走到哪里都是宝 🏀事情起因: 最近翻看博客中小伙伴评论时,发现文章【规范】看看人家Git提交描述,那叫一个规矩一条回复: 本狗亲测在我司中使用规范
使用带有不存在的命名空间的命名空间限定关键字来定义规范是否被认为是不好的做法?我想在公共(public) domain 命名空间中定义实体映射...所以为了避免在合并规范时丢失数据,我使用约定 :en
有没有办法在调用 clojure.spec.test.alpha/check 时覆盖核心谓词函数的生成器? 可以通过 s/gen 中的路径覆盖谓词生成器: (gen/generate (s/gen
以内核 rpm 为例,它允许在一个系统上同时安装多个版本。规范文件中究竟是什么允许的? 我想打包一个已经存在的具有不同安装前缀的多个版本的项目。 最佳答案 百胜 找到了让 yum 安装而不是更新的方法
我正在尝试用 C# 编写 PDF 解析器,但我遇到了一个问题,我不确定如何解释规范。 除非另有说明,否则 PDF 文档中的用户空间为 1/72 英寸(即 1pt)。 Tf 运算符提供的比例将字体从标准
我正在编写一些代码,需要能够获取两个 pdf 并将它们附加到页面级别(例如,如果它们都是 2 页文档,则有一个 4 页文档,其中所有 4 页都与原始文档相同). 在不使用库的情况下,最好的方法是什么?
是否有序言语言语法,或接近它的通常用作引用的东西?我正在使用 SWI-prolog,所以有一个适合这种风格的会很好,否则一般的 prolog 语言语法/规范也能工作。 最佳答案 自 1995 年起,P
我需要一个函数来过滤参数和构建查询。我有 4 个参数,因此如果我尝试为每个条件实现查询,我将不得不写 16 (2^4)实现 - 这不是一个好主意。 我尝试使用界面改进我的代码 Specificatio
这个 ExtGState 对象对图像做了什么: > 我有 PDF 规范,但一点也不清楚。显然,这将身份函数(什么的身份?单位矩阵?)从 [0.0 1.0] 映射到 [0.0 1.0](相同),这是没有
只是想获得有关 ePub 规范的一些帮助。toc.ncx 是否必须具有 src(即 xhtml)。我观察到 .opf 文件中也提供了相同的内容 src。 最佳答案 是的,这是强制性的,这是一个设计问题
让我们看看莱宁根项目 map 的真实示例 :global-vars : ;; Sets the values of global vars within Clojure. This example
我正在开发一个 LOB 框架,它具有 SL 和 MVC 前端、WCF 后端以及在服务器上运行的几个服务模块。我一直在查看 Spec#,看它是否对我有任何帮助。不可空类型和检查异常本身非常好,但我还没有
Promises/A+规范是最小的规范之一。因此,实现它是理解它的最佳方法。福布斯·林德赛(Forbes Lindesay)的以下回答将引导我们完成实现Promises / A +规范Basic Ja
哪个文档指定了 MySQL definer 格式? 具体来说,definer admin@% 中的 % 是什么意思(以及为什么使用这个符号)? 最佳答案 这里MySQL使用的格式定义在the MySQ
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
在 css 规范中,什么会影响更多的 inline 样式或外部 !important 外部“style.css”: #di{color: green!important;} div 文本颜色是红色还
我正在努力思考 CSS 的一些细节,我从 W3 CSS Visual Formatting Spec 9.2.2 中找到了这部分摘录。特别迟钝: Inline-level boxes that are
这个问题在这里已经有了答案: Are (non-void) self-closing tags valid in HTML5? (8 个答案) 关闭 9 年前。 在 HTML5 中你应该使用 或
我是一名优秀的程序员,十分优秀!