《Effective C#》Item 13:使用静态构造函数初始化静态成员

利用wolcmd.exe批处理执行远程唤醒 代码如下: @echo off cls :check if exist wolcmd.exe goto targetmac echo 缺少wolcmd.exe echo. goto end :targetmac cls echo -------------------------------------------------------- echo 目标主机PC-01地址:40235678A... 阅读详情

编写程序的时候难免要使用到静态成员,由于静态成员的访问是脱离类型对象的,所以使用非静态构造函数,私有方法或者一些其他方法都是不合理的。.Net提供了成员初始化语句和静态构造函数来初始化静态成员。

 

根据上一个单元,我们可以知道静态成员的初始化语句会早于静态构造函数执行,其次还知道成员初始化语句的好处和一些限制。这里要提的一点就是,静态构造函数和实例构造函数之间的区别,因为静态构造函数是由CLR调用执行的,所以静态构造函数只能是一个,同时不能还有参数。那么静态构造函数相对于成员初始化的一些弊端都不复存在。

 

此外,对于成员初始化最大的问题,就是异常无法捕获,可能对于普通成员来说,还可以在构造类型对象的时候加上try-catch;而对于静态成员来说,有时无法确定哪一个类型访问语句会先执行,如果对每个使用类型的地方都加上try-catch,会降低程序可读性。但如果把这种异常散发出去,会导致整个程序崩溃。那么使用静态构造函数就能比较好的捕获异常,并进行异常处理。

 

对于静态成员初始化语句和静态构造函数一个对比大致如下。

 

简便性

安全性

异常处理

静态成员初始化

最简便

比较安全

非常难

静态构造函数

比较简便

最安全

容易

 

那么到底用什么方法来初始化静态成员呢,给出以下两点建议。

第一就是简单静态成员,例如类型为值类型等,使用成员初始化语句来完成;

第二静态成员初始化比较复杂,或者有可能出现异常,那么用静态构造函数来完成。

 

本单元的内容基本上讲完了,现在说说静态成员最主要的一个应用“Singleton”,就是保证此类型的对象唯一性。其实实现很简单,如下就举一个简单的例子。

        public class MySingleton

        {

            private static readonly MySingleton _theOneAndOnly;

 

            static MySingleton()

            {

                _theOneAndOnly = new MySingleton();

            }

 

            public static MySingleton TheOnly

            {

                get{ return _theOneAndOnly; }

            }

 

            /// <summary>

            /// Private constructor to avoid object created from outside

            /// </summary>

            private MySingleton()

            {

            }

        }

 

对于静态成员何时被初始化,其实仔细看我上一个单元所说的对象构造步骤就可以分析出来。可能看起来比较抽象,尤其在分析嵌套关系的时候,现在就举一个例子来进行说明。

    class A

    {

        public static int X = B.Y;

        static A()

        {

            ++X;

        }

    }

 

    class B

    {

        public static int Y = A.X;

        static B()

        {

            ++Y;

        }

    }

 

那么大家先猜猜如下调用输出结果是什么。

    Debug.WriteLine( A.X.ToString() );

    Debug.WriteLine( B.Y.ToString() );

 

其结果是“2,1”,也就是A.X的值为2,而B.Y的值为1。

分析此类问题,只要记住三点就行了。

第一代码的执行顺序,代码在前的先执行;

第二静态成员初始化语句要先于静态构造函数执行;

第三静态成员初始化语句与静态构造函数只执行一次。

 

如果了解这三点,接下来就分析为什么会出现上面的结果。

当调用到第一条语句的时候,

Debug.WriteLine( A.X.ToString() );

首先是访问A这个类型,那么要对A这个类型的静态成员进行初始化,其次如果有静态构造函数,需要调用它。

对于A的静态成员只有“X”,按照上一单元的过程,先给其分配空间,并辅以0来初始化,其次调用其对应的成员初始化语句来初始化这个静态成员。

那么它的成员初始化语句是“X = B.Y”,那么需要访问“B.Y”来初始化X这个静态成员。

对于“B.Y”的访问,就是访问B类型,也是和访问A一样,首先对这个类型的静态成员进行初始化,其次如果有静态构造函数,需要调用它。而B的静态成员只有“Y”,先给其分配空间,并辅以0来初始化,其次调用其对应的成员初始化语句来初始化这个静态成员。

那么对于“Y = A.X”成员初始化语句,由于此时不是第一次访问类型A,所以不再进行静态成员初始化和静态构造函数的调用,对于“A.X”的访问是直接访问。此时“A.X”的值为0,那么Y的值也为0;接着执行B的静态构造函数,这样处理后Y的值为1。

那么对于A中的成员初始化语句“X = B.Y”,到此就执行完了,此时A类型中的X与B类型中的Y都是一样的,值为1。不过B中的静态成员初始化语句和静态构造函数都执行过了,而A中的静态构造函数还未执行。因此经过A的静态构造函数处理,A的X值为2,这也就是最后显示的结果。

 

分析过程看起来很绕,其实只要把握我前面所说的三个原则,那么在复杂的问题也一样分析 
GEE:随机森林分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积) 本文将介绍在Google Earth Engine (GEE)平台上进行随机森林分类的方法和代码,其中包括制作样本点教程(本地、在线和本地在线混合制作样本点,合并样本点等),加入特征变量,运行随机森林分类器教程,计算随机森林分类结果的精度,优化随机森林分类算法的参数,打印各个变量特征的贡献度等步骤的方法和代码。本教程可以应用于多种分类场景,包括土地利用分类、种植区提取(大蒜、小麦、玉米等)、局部气候区分类、植被分类等多种场景。 阅读详情

相关推荐

Android开发者必看:5分钟搞定MQTT客户端连接EMQX服务器(附完整代码)

本文为Android开发者提供了一份快速实现MQTT客户端连接EMQX服务器的实战指南。通过引入Eclipse Paho SDK,详细讲解了从项目配置、权限申请到核心连接、主题订阅与消息发布的完整流程,并附有即拿即用的Kotlin代码,帮助开发者在物联网应用中高效集成轻量级实时通信功能。

weixin_29228781的博客 272

如何初始化类中的静态变量?

在编程时会遇到这样的需求:统计某个类被实现了多少次? 可以通过在类中声明一个静态成员变量来实现: class A { private: static int num_A; public: A(); } 对于这样的一个静态成员变量,如何保证其在类多次创建的过程中只会初始化一次? 错误的操作: 1.在放置类的头文件中对其初始化,当该头文件被多个程序include时,num_A会被多次初始化,且将引发错误。 2.在构造函数中对其初始化,当该类被实现时,num_A会被迫

Kallou的博客 4139

Python爬取公交线路信息及站点shp数据 文末附数据下载地址

三、现在已经获取到了各个线路名称、链接,以及所途径的上下行站点,那么接下来就应该对开始对第三页url进行信息采集,即本次爬虫的最终目的:爬取所有站点的GPS坐标数据。但坑就坑在,二环一号线属于环线,所以只有左侧有站点数据,而其他非环线车次的站点数据分有上下行,如果用正则匹配,则分不清楚到底哪些是上行站点哪些是下行站点。以前爬过百度地图,当时用的是API平台,加上网站比较规范,所以标签节点什么的都比较清晰,但这次由于特殊原因所选择的网站为公交网,废话不多说直接开始吧。checi=二环一号线。

J_Giser的博客 1317

静态成员

一、静态数据成员 静态数据成员是一种特殊的数据成员,它以关键字static开头。 例:声明一个长方体类 class Box { public:                 Box( int length = 0, int width = 0) :_length( length)                                 , _width(

Sunnylunch-blog 1773

刚体转动欧拉方程:从理论到卫星姿态控制的实践

刚体转动欧拉方程是描述刚体旋转运动的基本动力学方程,在卫星姿态控制、机器人学、航空航天等领域有着广泛应用。本文将详细讲解欧拉方程的物理概念、数学推导、数值计算方法,并重点分析其在卫星姿态控制系统中的具体应用。

ScilogyHunter的博客 644

基于STM32设计的老人摔倒检测报警系统【升级版】(235)

在 `235 基于STM32设计的老人摔倒检测报警系统(OneNet+MQTT)` 项目基础上增加了心率、血氧、体温测量3个功能。

1511

对静态数据成员进行初始化

1.如果希望同类的各个对象中的数据成员的值是一样的,就可以把它定义为静态数据成员。 2.静态数据成员是在编译时预留空间的,在程序开始运行时被分配空间,到程序结束才释放空间。 3.静态数据成员可以初始化,但只能在类体外进行初始化。但要注意的是,不能用构造函数的参数 初始化表对静态数据成员进行初始化。 如下 4.静态数据成员既可以用对象名引用,也可以用类名引用。(这点与静态成员函数非常相像) ...

qq_64071349的博客 5345

自动驾驶大模型---小鹏汽车VLA大模型

随着自动驾驶技术的进步,小鹏汽车正通过云端大模型蒸馏技术,将72B参数的VLA大模型轻量化后部署到车端,以提升自动驾驶系统的智能和安全性。这种技术路线不仅解决了“模态不统一”的问题,还通过强化学习增强了模型的表现。

智能汽车人的博客 2235

静态成员初始化

1,对于非静态数据成员,每个类对象都有自己的拷贝,而静态数据成员对每个类类型只有一个拷贝。由于静态数据成员分配在全局数据区,因此在程序开始运行时就必须存在,故静态数据成员的空间分配和初始化不可能在main函数或其他函数中完成(因而在局部类中也不允许出现静态数据成员)。这样一来,静态数据成员的空间分配和初始化只可能有以下三种途径:(a)类的头文件:这里有类的声明。但存在一个无法回避的问题:对于静态数

HelloWorld 1396

YOLOv11的代数不变量解释:Syzygy模分析特征重要性,用交换代数揭示卷积核的语义相关性

本文提出了一种基于代数几何与交换代数的创新方法,特别是运用Syzygy模理论,对YOLOv11目标检测算法的卷积核语义相关性进行数学解释。研究揭示了YOLO系列算法演进背后的代数结构特征,建立了网络组件与多项式环、理想簇等代数概念的对应关系。通过构建分层的准同构代数系统,分析了YOLOv11在不同尺度下保持语义不变性的数学本质。文章系统阐述了Syzygy模在CNN特征冗余分析、跨层依赖关系建模和语义聚类中的应用,并提出了适用于动态稀疏训练的改进算法。该理论框架为深度神经网络的解释性研究提供了新的数学工具,同

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1272

华为HCIE之TS部分整理

TroubleShooting 整体拓扑 1. MSTP 题目需求:site1 中,CLIENT1 属于 VLAN12,CLIENT3 属于 VLAN34;MSTP 中的 VLAN12 属于 instance1,vlan34 属于 instance2;两个 instance 的主备根桥分别在 SW1 和 SW2 上,并且要求 CLIENT1访问 R1 时经过的路径是 SW3-SW1-R1;同时要求 CLIENT3 访问 R1 时经过的路径是SW3-SW2-R1; 排错思路: ①查看SW3 SW1 SW

ledrsnet的博客 5759

C++面向对象进阶:从构造函数到static成员

再探构造函数,类型转换(类型转换涉及的编译器优化),static成员,静态成员变量的应用,静态成员相关题目

2502_91499791的博客 837

使用 Simulink + Simscape Electrical 实现一个三相半控桥式整流器的仿真模型

本文详细介绍了使用Simulink搭建三相半控桥式整流器仿真模型的方法。主要内容包括系统结构设计、建模步骤(从创建项目到参数配置)、移相触发控制的实现,以及阻感负载下的动态响应分析。通过合理设置三相电源、整流器模块、触发控制和测量模块,实现了输出电压和电流波形的仿真观测。文章还提供了优化建议,如添加滤波器、实时控制等改进方向,为电力电子变换器的仿真研究和性能优化提供了实用指导。

amy_mhd的博客 140

[转载]《Effective C#》Item 13:使用静态构造函数初始化静态成员

《Effective C#》Item 13:使用静态构造函数初始化静态成员《Effective C#》Item 13:使用静态构造函数初始化静态成员 编写程序的时候难免要使用到静态成员,由于静态成员的访问是脱离类型对...

congji3817的博客 119

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Effective C# Item13: Initialize Static Class Members with Static Constructiors

Item13: Initialize Static Class Members with Static Constructiors 我们知道应当在创建类型的所有实例之前首先初始化静态成员变量。C#让我们使用静态初始化和静态构造函数来达到这个目的。静态构造函数是一种特殊的函数,它会在类中的所有的方法、成员变量或者属性定义之前运行。我们使用这个方法在类中来声明静态变量,构造si...

aijinyao5713的博客 115

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Effective C# Item13:使用静态构造器初始化静态类成员

在创建类型的任何实例之前,我们需要初始化这个类型中的静态成员变量,C#可以通过静态初始化器或者静态构造函数来完成这个任务,其中静态构造器是一个特殊的函数,它会在一个类的任何方法、变零或者属性被访问之前执行。     我们不应该使用类型的示例构造函数或者类型中的某些非静态方法来初始化类型的静态成员变量。     如果静态成员初始化的过程不复杂,那么我们可以在类型的初始化器中对其进行初始化;如果静

尹自强.DoSomething() 473

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【转】Effective C# Item13: Initialize Static Class Membe

本文转自:http://www.chenjiliang.com/article/View.aspx?ArticleID=1810&TypeID=34 我们知道应当在创建类型的所有实例之前首先初始化静态成员变量。C#让我们使用静态初始化和静态构造函数来达到这个目的。静态构造函数是一种特殊的函数,它会在类中的所有的方法、成员变量或者属性定义之前运行。我们使用这个方法在类中来声明静态变量,构造...

weixin_30902675的博客 85

Effective C# Item14:利用构造器链

    编写构造函数通常是一件重复性的劳动,我们经常需要在不同声明形式的构造函数中,对同一个成员变量进行同样的初始化操作,为了完成这个任务,通常有以下三种方式。 对代码采用“复制/粘贴”的方式,在写好一个构造函数后,将代码粘贴到其他构造函数中。 采用辅助函数的方式,将共通的逻辑放置到一个单独的方法中,然后在每个构造函数中调用这个方法。 采用构造器链的方式,在一个构造函数中,使用另外的构造...

weixin_34227447的博客 106

Item 2: Prefer readonly to const(Effective C#)

  Compile-time constants are limited to numbers and strings. Read-onlyvalues are also constants, in that they cannot be modified after the constructorhas executed.  You can use readonly values for i...

weixin_30823833的博客 103

Item 13: Use Proper Initialization for Static Class Members(Effective C#)

  Static initializers and static constructors provide the cleanest, clearest wayto initialize static members of your class. They are easy to read and easy toget correct. They were added to the langu...

weixin_30532987的博客 106
上一篇: 《Effective C#》Item 12:推荐使用成员初始化语句
下一篇: 《Effective C#》Item 14:使用构造函数初始化语句
Knight94
博客等级 码龄25年 1013粉丝 87原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值