NET CLR via C#读书笔记 - 第十一章 事件

《CLR via C#》学习笔记【1】 一、CLR的执行模块1.1 将源代码编译成托管模块 非托管C/C++可对系统进行低级控制,按自己的想法管理内存、VB可以快速生成UI应用程序,并控制COM对象和数据库。 公共语言运行时(Common Language Runtime, CLR)是一个由多种编程语言使用的“运行时”。CLR的核心功能(如内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用。 事实上在运行 阅读详情

1 事件简述

  事件的本质是委托,事件是回调机制的一种应用。
  定义了事件成员的类型或者类型的实例可以通过其它对象发生了特定的通知。

2 如何定义事件

  事件的定义可以大致分为以下4步:
  ① 定义类型来实现需要发送给事件接收者的附加消息。
  ② 定义事件成员。
  ③ 定义负责引发事件的方法来通知事件的登记对象。
  ④ 定义方法将输入转化为期望事件。

2.1 定义类型来实现需要发送给事件接收者的附加消息

  事件引发时,通常需要向事件接收者传递一些附加信息,这种附加信息一般单独封装为独立的类型,类型一般包含一组私有字段以及提供公开这组字段的公共只读属性或者方法。事实上,按照约定,所有的事件的附加信息都应该从EventArgs派生,且派生类应该用EventArgs结尾,因为我们希望一看就知道这是个事件附加信息参数的类型,而不是其它的类型。EventArgs的定义如下:

public class EventArgs {
    public static readonly EventArgs Empty = new EventArgs();
    public EventArgs() {}
}

  该类有一个静态只读字段Empty,这是一个单例;与String.Empty一样,当我们需要一个空的EventArgs时,应该使EventArgs.Empty,而不是重新去派生一个类型,而该类型实际上什么都不做。
  在此处我们派生一个附加信息的类型,该类型描述了新邮件到来时,我们需要传递附加信息:

class NewMailEventArgs : EventArgs
{
    private readonly string m_From; 		//附加信息  发件人
    private readonly string m_To;	 		//附加信息  收件人
    private readonly string m_Subject; 	//附加信息  主题
 
 	//定义只读属性
    public string From { get { return m_From; } } 
    public string To { get { return m_To; } }
    public string Content { get { return m_Subject; } }
 
    public NewMailEventArgs(string From,string To,string Subject)
    {
        this.m_From = From;
        this.m_To = To;
        this.m_Subject = Subject;
    }
}

2.2 定义事件成员

  C# 使用 event 关键字定义事件,事件类型的可访问性一般都是public,以下在MailManager类中定义了一个NewMail事件:

internal class MailManager{
	public event EventHandler<NewMailEventArgs> NewMail;
	//...省略邮件管理类的其它相关代码
}

  NewMail是一个EventHandler委托(委托又是引用类型),只不过用了event关键字进行了修饰。
  委托是用来包装回调函数的,它的本质就是一个class,回调函数的签名必须与委托的签名一致。一个事件可以有多个处理函数,一个函数就会被包装成一个委托对象,所有的委托对象都保存在NewMail的委托链当中。所以,触发NewMail事件,其实就是遍历其指向的委托对象的委托链,执行每个委托对象所包装的方法。
  关于委托的更多信息请点击此处查看
  EventHandler 是个泛型委托,他的定义如下:

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

  所以实际上回调函数的原型如下:

public void FuncName(object sender,NewMailEventArgs e);

  对于参数sender使用object而不是使用对应的具体类型的原因如下:
  ① 主要原因:继承,假如有SmtpMailManager继承了MailManager,那么回调方法的参数应该是SmtpMailManager,而不是MailManager,但事实上SmtpMailManager时继承了实际NewMail的,如果需要由SmtpMailManager引发事件,那么就需要将SmtpMailManager转换为MailManager,由于这一层关系,反正最后都要进行转换,所以直接将类型定义为object。
  ② 次要原因:灵活性,假如有一个类不是从MailManager派生,也可以使用这个委托。

2.3 定义负责引发事件的方法来通知事件的登记对象

2.3.1 基本实现

  代码定义如下:

internal class MailManager
    {
        //第二步 定义事件消息
        public event EventHandler<NewMailEventArgs> NewMail;

        //第三步 定义负责引发事件的方法来通知事件的登记对象
        protected virtual void OnNewMail(NewMailEventArgs e)
        {
            EventHandler<NewMailEventArgs> temp = Volatile.Read(ref NewMail);
            if (temp != null)
            {
                temp(this, e);
            }
        }
        //...省略邮件管理类的其它相关代码
    }
	EventHandler<NewMailEventArgs> temp = Volatile.Read(ref NewMail);

  之所以这样实现代码 ,主要有以下两个原因:
  ① 如果不使用temp局部变量接收NewMail的引用复制,可能会出现竞态问题,竞态问题在这里的体现是在一个线程中检查完temp != null后,另一个线程可能把该委托移出委托链,这样执行到temp(this, e);时会抛出NullReferenceException异常。
  ② 如果仅使用 EventHandler temp = NewMail;也会出现问题,这个问题可能会由编译器的优化引起,编译器会通过移出局部变量来优化上述代码,此时就和原因①中描述的场景一样了。
  所以最终的用法是 EventHandler temp = Volatile.Read(ref NewMail); Volatile.Read的调用强迫NewMail在语句执行时去读取,不允许编译器进行优化(Ps:作者成书的时间是2012年,发展到今天,编译器已经足够智能,即使用原因2中的写法,编译器也不会去进行优化,不过最稳妥的还是代码示例的写法。)。

2.3.2 扩展方法封装

internal class MailManager
{
	//第二步 定义事件消息
	public event EventHandler<NewMailEventArgs> NewMail;
	
	//第三步 定义负责引发事件的方法来通知事件的登记对象
	protected virtual void OnNewMail(NewMailEventArgs e)
	{
		e.Raise(this, ref NewMail); //第四版  此处写的是m_NewMail
	}
	//...省略邮件管理类的其它相关代码
}

public static class EventArgExtensions
{
    public static void Raise<TEventArgs> (this TEventArgs e,object sender,ref EventHandler<TEventArgs> evevtDelegate)
    {
        // 出于线程安全考虑
        EventHandler<TEventArgs> temp = Volatile.Read(ref evevtDelegate);

        //任何事件定义了对事件的关注就通知他们
        if (temp != null)
        {
            temp(sender, e);
        }
    }
}

2.4 定义方法将输入转化为期望事件

internal class MailManager
{
    //第二步 定义事件消息
    public event EventHandler<NewMailEventArgs> NewMail;

    //第三步 定义负责引发事件的方法来通知事件的登记对象
    protected virtual void OnNewMail(NewMailEventArgs e)
    {
        e.Raise(this, ref NewMail); //第四版  此处写的是m_NewMail
    }

    //第四步 定义方法将输入转化为期望事件
    public void SimulateNewMail(string From,string to,string subject)
    {
        // 构造一个事件消息对象来存储需要通知接受者的信息
        NewMailEventArgs e = new NewMailEventArgs(From, to, subject);
        
        //调用虚方法通知对象事件已发生
        //如果没有重写,那么该方法将通知事件的所有已登记对象
        OnNewMail(e);
    }

    //...省略邮件管理类的其它相关代码
}

3 编译器事件实现浅析

public event EventHandler<NewMailEventArgs> NewMail;

  C#编译器在编译时会进行如下转换:

//1  定义一个私有委托字段并初始化为null
private EventHandler<NewMailEventArgs> NewMail = null;

//2 一个公共add_Xxx方法  Xxx是事件名
public void add_NewMail(EventHandler<NewMailEventArgs> value)
{
	EventHandler<NewMailEventArgs> preHandler;
	EventHandler<NewMailEventArgs> newMail = this.NewMail;
	do{
		preHandler = newMail;
		EventHandler<NewMailEventArgs> newHandler = (EventHandler<NewMailEventArgs>)Delegate.Combine(preHandler,value);
		newMail = Interlocked.CompareExchange<EventHandler<NewMailEventArgs>>(ref this.NewMail,newHandler,preHandler);
	}while(newMail != preHandler);
}

//3 一个公共remove_Xxx方法  Xxx是事件名
public void remove_NewMail(EventHandler<NewMailEventArgs> value)
{
	EventHandler<NewMailEventArgs> preHandler;
	EventHandler<NewMailEventArgs> newMail = this.NewMail;
	do{
		preHandler = newMail;
		EventHandler<NewMailEventArgs> newHandler = (EventHandler<NewMailEventArgs>)Delegate.Remove(preHandler,value);
		newMail = Interlocked.CompareExchange<EventHandler<NewMailEventArgs>>(ref this.NewMail,newHandler,preHandler);
	}while(newMail != preHandler);
}

  第一步中,构造具有恰当委托类型的字段,该字段是对一个委托头部列表的引用,事件发生时会通知列表的委托,初始化为null,表示开始并无侦听者登记对该事件的关注。侦听者对事件进行登记时,其实是将委托类型的一个实例添加到列表中,反之,注销登记事件就是从列表中移除相关委托实例。
  第二步是调用System.Delegate的Combine方法,它将委托实例添加到委托列表中,返回新的列表头,并存回字段中。
  第三步是调用System.Delegate的Remove方法,它将委托实例从委托列表中删除,返回新的列表头,并存回字段中。

4 设计侦听事件的类型

  第2节中说明的是事件定义类的实现,在第四节是说明对事件进行使用的类型,也就是侦听类型的实现。

internal sealed class Fax
{
	//登记对事件的关注
    public Fax(MailManager mm)
    {
        mm.NewMail += FaxMsg;
    }

	//消息处理
    private void FaxMsg(object sender,NewMailEventArgs e)
    {
        Console.WriteLine("Faxing mail massage:");
        Console.WriteLine(" From={0},To={1},subject={2}",e.From,e.To,e.Content);
    }
	
	//撤销对事件的关注
    public void Unregister(MailManager mm)
    {
        mm.NewMail -= FaxMsg;
    }
}

  以上内容为对《NET CLR via C#(第四版)》第十一章内容的阅读笔记,只记录其中核心部分内容,书中对以上主题还进行详细的代码演示说明,书中还讨论了如何显示实现事件以便于如何减少内存损耗,如有需要,请详细阅读本书第十一章内容,感谢您的阅读。

《CLR via C# 第四版》配套示例源码深入分析 NET类型系统允许开发者使用两种类型的对象:引用类型和值类型。引用类型存储在堆上,而值类型存储在栈上或作为结构体的成员存储在堆上。引用类型包括类、接口、委托、数组等;值类型包括基本数据类型、枚举以及结构体。.NET允许开发者创建自己的异常类型,以便更加具体地表示应用程序中可能发生的特定错误。自定义异常通常继承自类或其子类。创建自定义异常时,推荐在构造函数中使用来调用基类的构造函数,以便提供有用的错误信息。 阅读详情

相关推荐

CLR via C#: 4th Edition with Full Table of Contents

CLR是.NET平台的运行时引擎,它负责管理代码的执行,提供了诸如内存管理、线程同步、异常处理等运行时服务。CLR使得.NET支持的编程语言可以在相同的虚拟环境中运行,而与底层操作系统和硬件平台无关。这种特性使得.NET应用程序具有良好的可移植性。.NET类型系统是建立在值类型和引用类型这两个概念上的。值类型直接存储数据,而引用类型存储对数据(对象)的引用。理解这两种类型的区别及其转换是管理内存和编写高效代码的关键。.NET 允许开发者创建自定义异常类,这些类通常继承自类。

weixin_35257663的博客 925

《CLR via C# 最完整中文版》电子书下载种子

本文还有配套的精品资源,点击获取 简介:《CLR via C#》是Jeffrey Richter撰写的深入介绍.NET CLR内部机制的经典书籍。中文版为中文读者提供了学习.NET开发核心技术的良机。书中详细讲解了.NET类型系统、内存管理、JIT编译、异常处理、多线程编程、反射、元数据、安全模型等关键知识点,并结合案例理论与实践,帮助开发者编写出更高效、可靠的.NET程序...

weixin_35433448的博客 1328

CLR via C#.pdf

下载地址:网盘下载内容简介······本书针对CLR和.NET Framework 4.0进行深入、全面的探讨,并结合实例介绍了如何利用它们进行设计、开发和调试。全书5部分29章。第Ⅰ部分介绍CLR基础,第Ⅱ部分解释如何设计类型,第Ⅲ部分介绍基本类型,第Ⅳ部分以实用特性为主题,第Ⅴ部分花大量篇幅重点介绍线程处理。通过本书的阅读,读者可以掌握CLR...

weixin_30873847的博客 760

CLR via C#(第3版)中英文双语带书签及源码完整版

CLR(Common Language Runtime)是.NET程序的执行引擎,负责管理代码的加载、编译、执行与资源回收。其核心组件包括JIT编译器、垃圾回收器(GC)、类型系统、异常处理机制和安全引擎,共同构成托管执行环境。// 示例:一个简单的托管程序入口");该代码在运行时由CLR完成程序集加载 → JIT编译 → 托管执行 → 内存自动管理的全生命周期控制,体现其对开发者透明但底层高度可控的特性。场景推荐做法频繁创建大数组改用复用缓冲区。

weixin_33608403的博客 914

.NET CLR via C#(第4版) 最新完整版 高清文字版

是第4版 正式版 不是prepress版。 本书是全球享有盛誉的技术作家Jeffrey Richter的经典书籍CLR via C#最新版第四版。 本书针对clr、C#5.0和.net framework 4.5进行深入、全面的探讨,并结合实例介绍了如何利用它们进行设计、开发和调试。 本书深入、全面探讨.NET Framework、CRL和多核编程,广泛讨论FrameworkClassLibrary(FCL)核心类型,对泛型和线程处理等深奥 难懂的开发概念提供权威、实用的指导。

《CLR via C#》CLR基础

CLR是公共语言运行库(Common Language Runtime),又叫公共语言运行时。CLR和Java虚拟机一样也是一个运行时环境,是一个可由多种编程语言使用的运行环境,可由面向CLR的所有语言使用。它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。 .NET框架是一种以CLR为基础、支持多种语言(C#、F#、VB.NET、C++、Python等)的开发的软件...

陈云佳的专栏 3758

CLR via C#, Third Edition

CLR via C#, Third Edition 清晰版PDF

CLR基础之一---认识CLR [《CLR via C#》读书笔记]

《CLR via C#》读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runtime,简称CLR)是微软为他们的.Net虚拟机所选用的名称。这是通用语言架构(简称CLI)的微软实现版本,它定义了一个代码运行的环境。CLR运行一种称为“通用中间语言”的字节码,这个是微软的通用中间语言实现版本。 CLR运行在微软的视窗操作系统上...

weixin_30872499的博客 2241

CLR via C# 第4版 英文PDF

CLR via C# 第4版 英文PDFKristin, words cannot express how /feel about our life together. cherish our family and all our adventures. I'm filled each day with love for Aidan (age 9)and Grant (age 5), you both have been an inspira- tion to me and have taught me to play and have fun Watching the two of you grow up has been so rewarding and enjoyable for me. am lucky to be able to partake in your lives. love and ap preciate you more than you could ever know Contents at a glance Introduction PART I CLR BASICS CHAPTER 1 The clr's execution model CHAPTER 2 Building, Packaging, Deploying, and Administering Applications and Types 33 chaPTeR 3 Shared Assemblies and Strongly Named Assemblies 65 PART I DESIGNING TYPES CHAPTER 4 Type Fundamentals 91 CHAPTER 5 Primitive, Reference, and Value Types 111 CHAPTER 6 Type and Member Basics 151 CHAPTER 7 Constants and fields 175 chaPTer 8 Methods 181 chaPTer 9 Parameters 209 CHAPTER 10 Properties 227 CHAPTER 11 Events 249 CHAPTER 12 Generics 265 CHAPTER 13 Interfaces 295 PARTⅢ ESSENTIAL TYPES CHAPTER 14 Chars, Strings, and Working with Text 317 CHAPTER 15 Enumerated Types and Bit Flags 361 CHAPTER 16 Arrays 373 CHAPTER 17 Delegates 391 CHAPTER 18 Custom Attributes 421 CHAPTER 19 Nullable value Types 441 PART IV CORE FACILITIES CHAPTER 20 Exceptions and state management 451 CHAPTER 21 The Managed Heap and Garbage Collection 505 CHAPTER 22 CLR Hosting and AppDomains 553 CHAPTER 23 Assembly Loading and reflection 583 CHAPTER 24 Runtime serialization 611 CHAPTER 25 Interoperating with WinRT Components 643 PAR V THREADING ChaPTEr 26 Thread basics 669 CHAPTER 27 Compute-Bound Asynchronous Operations 691 CHAPTER 28 IyO-Bound Asynchronous Operations 727 CHAPTER 29 Primitive thread Synchronization Constructs 757 CHAPTER 30 Hybrid Thread Synchronization Constructs 789 Index 823 Contents at a glance Contents Introduction XX PART CLR BASICS Chapter 1 The Clrs Execution Model 3 Compiling Source Code into Managed Modules Combining managed modules into assemblies Loading the Common Language Runtime 8 Executing Your Assembly's Code 11 IL and∨ erification 16 Unsafe Code The Native Code generator tool: ngen. exe 19 The Framework Class Library 22 The Common Type System The Common Language Specification Interoperability with Unmanaged Code 30 Chapter 2 Building, Packaging, Deploying, and Administering Applications and Types 33 NET Framework Deployment Goals 34 Building Types into a Module 35 Response Fil 36 A Brief Look at metadata 38 What do you think of this book We want to hear from you Microsoft is interested in hearing your feedback so we can continually improve our books and learning resources for you. To participate in a brief online survey, please visit microsoft. com/learning/booksurvey Combining Modules to Form an Assembly 45 Adding Assemblies to a Project by Using the Visual Studio IDE.51 Using the assembly Linker Adding Resource Files to an Assembly 53 Assembly Version Resource Information .54 Version numbers ..58 Culture Simple Application Deployment(Privately deployed Assemblies)...60 Simple Administrative Control(Configuration) 62 Chapter 3 Shared Assemblies and Strongly Named Assemblies 65 Two Kinds of Assemblies, Two Kinds of Deployment 66 Giving an Assembly a Strong Name 67 The global Assembly Cache 72 Building an Assembly That References a Strongly Named Assembly..74 Strongly named assemblies are tamper-Resistant 75 Delayed Signing Privately Deploying Strongly Named Assemblies How the Runtime Resolves Type References 80 Advanced Administrative Control( Configuration) 83 Publisher Policy control 86 PART I DESIGNING TYPES Chapter 4 Type Fundamentals 91 All Types Are Derived from System Object .91 Casting Between Types 93 Casting with the C# is and as Operators Namespaces and assemblies 97 How Things relate at Run time .101 Chapter 5 Primitive, Reference, and Value Types 111 Programming Language Primitive Types 111 Checked and Unchecked Primitive Type Operations 115 Reference Types and value Types 118 Boxing and Unboxing Value Types 124 Changing Fields in a Boxed Value Type by Using Interfaces and Why You Shouldnt Do This) 136 Object Equality and Identity 139 Object hash Codes .142 The dynamic Primitive Type ......144 Chapter 6 Type and member Basics 151 The Different Kinds of Type Members .151 Type visibilit 154 Friend assemblies 154 Member accessibility .156 Static Classes ...158 Partial Classes, Structures, and Interfaces .159 Components, Polymorphism, and Versioning 160 How the CLR Calls Virtual Methods, Properties, and Events 162 Using Type Visibility and Member Accessibility Intelligently...166 Dealing with Virtual Methods When Versioning Types 16 Chapter 7 Constants and Fields 175 Constants 175 Fⅰe|ds ...177 Chapter 8 Methods 181 Instance Constructors and Classes(Reference Types) 181 Instance Constructors and Structures(Value Types) 184 Type Constructors 187 Contents x Operator Overload Methods 191 Operators and Programming Language Interoperability 193 Conversion Operator Methods 195 Extension method 198 Rules and guidelines ....,200 Extending Various Types with Extension Methods 201 The Extension Attribute 203 Partial Methods 204 Rules and guidelines 207 Chapter 9 Parameters 209 Optional and Named Parameters 209 Rules and guidelines 210 The defaultParameter value and optional Attributes 212 Implicitly Typed Local Variabl 212 Passing parameters by reference to a Method 214 Passing a variable Number of arguments to a Method 220 Parameter and Return Type Guidelines 223 Const-nes 224 Chapter 10 Properties 227 Parameterless Properties 227 Automatically Implemented Properties 231 Defining Properties Intelligently 232 Object and collection Initializers 235 Anonymous Type .237 The System. Tuple type 240 Parameterful Properties 242 The performance of calling property accessor Methods 247 Property Accessor Accessibility 248 Generic prop A roperty Access 248

CLR via C# 第四版.pdf

一本著名的C#深入学习的书籍,书籍很新,想要深入学习的C#人士,你懂的,第四版,刚出来,国内没得卖

【亲测免费】 深入探索.NET CLR:《CLR via C》第4版资源推荐

深入探索.NET CLR:《CLR via C#》第4版资源推荐 【下载地址】CLRviaC第4版中英文版资源下载 - **书名**: CLR via C# 第4版- **语言**: 中文版 & 英文版- **格式**: PDF- **特点**: 高清无水印 ...

gitblog_09724的博客 786

《CLR via C#》_高清版_jeffrey richter 著_第四版.zip

内容简介 本朽针对 CLR 和. NE 丁 F ? , 0 唯 4 _ 5 进行浑入、全面的探讨,设计、开发和调试.全书 5 部分共 29 章。第 l 部分介绍 CLR 基础.分介 tlI 从本类贬.第 I ' V 部分以核心机制为毛脱,并结合实例介绍了如何利用它们进行第 【 I 部分解释如何设计类型,第 m 部第 V 部分吸点介绍线程处理。通过木书的阅读.读者. 11 以掌娜 CLR 和. NET Fralllew 侧南的梢仙.轻松、岛效地创建商性能应用程序。

《CLR Via C#》第一章

大致介绍了CLR执行应用程序的流程,编译代码流程,介绍了IL、元数据和程序集的关系。

weixin_51374560的博客 964

新手也能懂的Simulink汽车二自由度建模:从公式推导到模型搭建全流程

本文为新手提供了在Simulink中搭建汽车二自由度模型的完整实战指南。文章从模型核心概念讲起,详细讲解了如何将车辆动力学方程转化为状态空间模型,并逐步指导在Simulink中实现从参数设置、模块搭建到仿真验证的全过程。通过阶跃转向测试和参数影响分析,帮助读者直观理解车辆转向特性,并提供了实用的模型扩展思路与常见问题排查技巧。

weixin_29047919的博客 213

【5G全网建设】Option3X和Option2模式建安市、兴城市和四水市核心网、承载网网络设计与部署

拓扑规划: Option 3X网络拓扑图规划 Option 2网络拓扑图规划 设备部署: 建安市核心网 建安市承载中心机房 建安市骨干汇聚机房 建安市3区汇聚机房 建安市C站点无线机房 兴城市核心网 兴城市承载中心机房 兴城市骨干汇聚机房 兴城市2区汇聚机房 兴城市B站点无线机房 数据配置: 建安市核心网 建安市承载中心机房 建安市骨干汇聚机房 建安市3区汇聚机房 建安市C站点无线机房 兴城市核心网 兴城市承载中心机房 兴城市骨干汇聚机房 兴城市2区汇聚机房 兴城市B站点无线机房 业务调试

weixin_67183034的博客 8854

NET CLR via C#读书笔记 - 第一章 CLR执行模型

NET CLR via C#读书笔记 - CLR执行模型CLR执行模型1.1 CLR简介1.2 CLR执行模型1.2.1 将源代码编译成托管模块 CLR执行模型 1.1 CLR简介 CLR(Common Language Runtime(公共语言运行时))可以简单理解为是一个支持多种编程语言及多语言互操作,完整的高级虚拟机。   程序在运行的时候有着惊人数量的运行时依赖。每个有用的程序都需要某些运行时函数库,以便其能跟电脑的其它资源(如用户输入设备,磁盘文件,网络通信等)交互,同时程序也需要转换成计算机硬

CreateNewWorld的博客 471

到底什么是电源的斜波补偿,电源芯片CS引脚作用,一文讲清楚!

上文有提到电流环,其实电流环再细分也有很多模式,用的最多的是峰值电流模式峰值电流模式调节工作原理如下:(1)当输出负载增大时,输出电压降低,因此,Vc 增大,线性增加的电感电流只有升高到更大的值才能使 PWM 电流比较器翻转,开关管导通的时间增长,占空比增加,输入功率增加,因此输出电压增加,当输出电压增加到调节的范围内时,系统保持平衡。

jwgdhuwdhg的博客 1万+

CLR via C 第四版示例源码

CLR via C# 第四版示例源码 【下载地址】CLRviaC第四版示例源码 探索.NET底层奥秘,深入理解C#与CLR的交互机制!《CLR via C# 第四版》示例源码为您提供了书中所有关键概念的实践代码,帮助您将理论知识转化为实际技能。源码按章节组织,涵盖公共类库和解决方案文件,方便您快速上手。只需配置好.NET...

gitblog_06773的博客 379

MacOS下Mixly 2.0安装避坑指南:从Java环境到终端权限全解析

本文详细解析了在MacOS系统上安装Mixly 2.0时可能遇到的核心问题与解决方案。针对Java环境版本不兼容、MacOS Gatekeeper安全机制拦截以及终端权限不足三大常见障碍,提供了从检查并配置正确Java版本、安全设置绕过到彻底解决应用内部工具链权限的完整避坑指南,帮助用户顺利完成安装并正常使用。

weixin_29231725的博客 503

C语言中errno与perror()函数

宏errno和perror()函数都是在stdlib.h中定义的。 1 stdlib.h头文件 stdlib.h头文件即standard library标准库函数头文件,包含了C、C++语言的最常用的系统函数,该文件中还包含了C语言标准库函数的定义。 2 errno宏 errno宏在stdlib.h中的定义为 #define errno (*_errno()) errno宏用于保存程...

hou09tian的博客 1万+

NET CLR via C#读书笔记 - 第七章 常量和字段

NET CLR via C#读书笔记 - 第七章 常量和字段1 常量1.1 常量定义1.2 常量的特点和限制2 字段2.1 字段定义2.2 字段修饰符 1 常量 1.1 常量定义   常量是从值不变化的符号,定义常量符号时,值必须在编译阶段就确认,编译后常量将保存在程序集的元数据中。 1.2 常量的特点和限制   ① 只能定义编译器支持的基元类型的常量,定义非基元类型的常量,必须要将值设置为null(意义不大)。   ② 常量值永不改变,通常被视为类型的一部分(被视为静态成员,而不是实例成员)。   ③ 定

CreateNewWorld的博客 219

ubuntu22.04下对使用linuxdeployqt发布的qt程序进行deb打包操作

【代码】ubuntu22.04下对使用linuxdeployqt发布的qt程序进行deb打包操作。

十三阿哥的博客 1402
上一篇: NET CLR via C#读书笔记 - 第十章 属性
下一篇: NET CLR via C#读书笔记 - 第十二章 泛型
藏海花鸣
博客等级 码龄8年 40粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值