静态字段初始化顺序 (C#) - 有人可以解释这个片段吗?

2023-12-02

我是一名正在学习 C# 的 C++ 程序员。我目前正在阅读 C#4.0 in a Nutshell。

我在第 74 页看到了这个声明/片段:

静态字段初始值设定项运行在 字段的顺序 宣布。下面的例子 说明了这一点:X 被初始化为 0 和 Y 初始化为 3。

class Foo
{
    public static int X = Y; // 0
    public static int Y = 3; // 3
}

我不明白如何在不首先声明 Y 的情况下为 X 分配 Y 中的值。我在这里错过了什么吗?

顺便说一句,来自 C++ 背景的我倾向于使用术语 ctor 来表示构造函数 - 然而,我还没有在 C# 中遇到过这个术语 - 术语 ctor 也在 C# 世界中使用吗?

[Edit]

同一页上的另一个例子(在前面提到的书中)是这样的:

class Program
{
    static void Main() { Console.WriteLine (Foo.X); } // 3
}
class Foo
{
    public static Foo Instance = new Foo();
    public static int X = 3;
    Foo() { Console.WriteLine (X); } // 0
}

书中指出(对于上面的例子):

该示例打印 0 后跟 3 因为字段初始值设定项 实例化一个 Foo 在 X 之前执行 初始化为3:

我对这些例子还有一些进一步的问题。

  1. 这两个示例都出现在标题为静态构造函数和字段初始化顺序然而,代码示例并没有显示静态构造函数 - 至少不是我可以轻松识别的静态构造函数。我期望静态构造函数与类具有相同的名称,无参数并且前面带有 'static' 关键字。所以我不明白这些示例与章节标题有何关系。我在这里缺少什么?

  2. 在第二个示例中,(非静态)构造函数打印出 X 的值 - 其中有明确地在上一行中被赋值为 3 - 但打印出来的输出却是 0。为什么?!


就内容而言,声明的顺序并不重要可用的这里。情况并不像这些local变量,变量只有在声明后才可用。对于实例变量和方法来说也是如此,其中在源中较早声明的方法可以调用在源中较晚声明的方法,等等。

但声明的顺序is就初始化程序的执行而言很重要,这就是您得到这种行为的原因。请注意,如果将这些变量更改为const,两者都将取值 3 - 编译器将计算出所需的求值顺序,并检测是否存在任何循环(这会导致错误)。然后将计算常数compile-时间,以及直接嵌入IL中的值。

有关有效内容等的更多详细信息,请参阅规格.

至于术语 - 我通常不认为有必要将“constructor”缩写为“ctor”,尽管我认为它会被普遍理解。我可能会使用该缩写作为变量名,例如:

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

静态字段初始化顺序 (C#) - 有人可以解释这个片段吗? 的相关文章

  • 在 Vulkan 中,图形队列系列与当前队列系列分离是否有益?

    据我所知 队列系列可能支持呈现到屏幕但不支持图形 假设我有一个同时支持图形和呈现的队列系列 以及另一个仅支持呈现的队列系列 我应该为两个进程使用第一个队列系列 还是应该将第一个队列系列委托给图形 将后者委托给呈现 或者这两种方法之间没有明显
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • 条件类型定义

    如果我有一小段这样的代码 template
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 如何动态改变webView的高度?

    我目前正在使用webView来显示新闻 在新闻下面我打算放一些按钮 所以我需要获取webView的高度 以便在所有下载后根据webView的高度改变按钮的位置 在其他那么 如何动态改变webView的高度呢 try this void we
  • ref($variable) 何时返回“IO”?

    这是文档的相关摘录ref功能 返回的值取决于引用所引用的事物的类型 内置类型包括 SCALAR ARRAY HASH CODE REF GLOB LVALUE FORMAT IO VSTRING Regexp 基于此 我想象调用ref在文件
  • Google Cloud Kubernetes Ingress 静态 IP 地址未反映且与设置不同

    我正在尝试在 Google Cloud 上使用 GKE 部署完整的 Web 应用程序 后端为 Nodejs 前端为 Angular 然后为其启用 SSL 我创建了一个全局 IP 地址 随后在列表中看到了它 gcloud 计算地址创建 mat
  • WCF工作流服务REST接口[重复]

    这个问题在这里已经有答案了 可能的重复 WF4 WCF 中的 RESTful 工作流服务端点 我正在尝试使 Windows Workflow Services 4 0 使用 REST 接口 我有一个非常简单的工作流服务 名为 Service
  • 加载谷歌地图时,Safari v5 隐藏 div

    我在 Mac 上使用 Safari v5 时遇到问题 当我的 Google Map Api 加载到页面中时 它隐藏了我的一些其他 div 它们是绝对定位的 在地图加载之前 页面会正确呈现 如果我有一个没有地图的页面 则不会发生问题 例子 w
  • 如何在运行时设置 JTextField 的宽度?

    有人可以帮我如何设置 a 的宽度吗JTextField在运行时 我希望在运行时调整我的文本字段的大小 它将询问用户长度 然后输入将更改文本字段的宽度 if selectedComponent instanceof javax swing J
  • 我正在尝试获取唯一的 CPU ID

    我使用下面的代码来获取唯一的 CPU ID 我在网上找到了使用此代码的各种示例 然而 一个偶然的机会 我碰巧拥有两台华硕笔记本电脑 一个是四核 i5 另一个是重型 i7 八核 两者都是 64 位机器 令我大吃一惊的是 它们都产生相同的 唯一
  • 如何在Powershell中解压文件?

    我有一个 zip文件 需要使用 Powershell 解压其全部内容 我正在这样做 但它似乎不起作用 shell New Object ComObject shell application zip shell NameSpace C a
  • 如何无限期删除 PouchDB 数据库以释放空间?

    如何删除 PouchDB 中的数据库以再次释放磁盘空间 删除仅设置参数 deleted 并保留记录的数据 但是 如何才能以真正删除记录并节省一些空间的方式删除记录呢 因为我想时不时地重置数据库 这样它就不会变得太大 听起来您正在寻找压实 它
  • 如何在asp.net中显示警告框

    我有一个带有提交按钮的注册页面 我想在 用户单击提交按钮 时显示一个警报框 然后 用户输入的数据被插入到数据库中 int i obj IU SubscriberMaster 0 txtFirstname Text txtLastname T
  • Python删除输入行

    我想在 python 3 中有一个输入循环 其中输入的信息会自动从终端删除 f eks 3秒后 我知道 r 的功能可以返回行 但在输入后很难自动换行 while True inputStr input Add the hidden word
  • 如何使用案例删除mysql中的重复项

    现在我正在使用类似的方法来删除 mysql 表中的重复项 delete t2 from my table1 as t1 my table1 as t2 where t1 TestCase t2 TestCase and t2 id gt t
  • 为 Razor 调整自定义 Html Helper(它使用 HtmlTextWriter 因此返回 void)

    问题 我有一个为 WebFormViewEngine 视图编写的非常漂亮的菜单 Html 帮助器 该引擎允许您的助手返回 void 但仍然能够使用 Html Theseus 这对我的助手来说非常有用 因为它可以使用 HtmlTextWrit
  • Python:使用批量 API V3 将订阅者添加到 mailchimp

    我试图编写一个函数来在 mailchimp 中创建订阅者 但出现错误 并且我不明白出了什么问题 我在用着python mailchimp 是的 我有正确的列表 ID 而不是 000000 My code from mailchimp3 im
  • Sequelize - findOrCreate 在“through”表上、belongsToMany 关联上

    首先 我对 Node JS 相当陌生 对 Sequelize 甚至更陌生 这已经困扰我一段时间了 我有以下模型实体 Match js module exports function sequelize DataTypes var Match
  • 禁用浏览器缓存

    Issue 我经常使用样式表 更改一些内容并检查它的外观 然而 大多数 如果不是全部 当前浏览器都会存储样式表 因此不会让我看到差异 只有在多次重置 Safari 后 按清空缓存按钮才会突然更新 但这确实很烦人 Question 有没有办法
  • Html & JS 点击时将图像旋转 90 度

    我试图在单击时向右旋转该图像每次单击 图像都会向右旋转 90 度 因此单击 4 次会将其恢复到原始位置 由于某种原因 将类 rotateimg90 分配给图像不起作用 function rotate90 alert rotate theIm
  • 在 matplotlib 中合并颜色图

    我想合并两个颜色图以生成 imshow 图 我想使用 RdBu 的范围 0 4 到 0 4 然后从 0 4 到最大值 比如 1 5 我想使用从相同的蓝色到另一种颜色 例如绿色 的渐变 我怎样才能做到这一点 这是我到目前为止所取得的进展 im
  • 如何将 @class 前向声明翻译为 Swift?

    我在 Objective C 中的 AppDelegate 中有 class PhoneViewController interface AppDelegate NSObject
  • 静态字段初始化顺序 (C#) - 有人可以解释这个片段吗?

    我是一名正在学习 C 的 C 程序员 我目前正在阅读 C 4 0 in a Nutshell 我在第 74 页看到了这个声明 片段 静态字段初始值设定项运行在 字段的顺序 宣布 下面的例子 说明了这一点 X 被初始化为 0 和 Y 初始化为