<<展现C#>> 第七章 异常处理(修订)

Agent集群如何重构内容生产:从单点执行到任务架构 Agent集群代表了AI内容生成的范式升级,其核心在于将模糊创作需求分解为可调度、可验证、可协作的智能体任务流。不同于传统大模型依赖长上下文的单线程生成,Agent集群通过任务拓扑结构化、角色-工具强绑定与状态隔离通信,实现跨章节术语一致性、多版本代码兼容性验证、逐行注释认知适配等工程级保障。这种架构天然适配教材编写、技术文档、教育课件等高可靠性内容场景,尤其在Python教程生成、SDK文档自动化、自适应学习资源构建中展现出模块复用、质量门禁前置、人类反馈闭环等关键价值。 阅读详情

     第七章   异常处理

 

    通用语言运行时(CLR)具有的一个很大的优势为异常处理是跨语言被标准化的。一个在C#中所引发的异常可以在Visual Basic客户中得到处理。不再有 HRESULTs  或者 ISupportErrorInfo 接口。

    尽管跨语言异常处理的覆盖面很广,但这一章完全集中讨论C#异常处理。你稍为改变编译器的溢出处理行为,接着有趣的事情就开始了:你处理了该异常。要增加更多的手段,随后引发你所创建的异常。

 

7.1  检查和非检查语句(checked and unchecked statements)

    当你执行运算时,有可能会发生计算结果超出结果变量数据类型的有效范围。这种情况被称为溢出,依据不同的编程语言,你将被以某种方式通知——或者根本就没有被通知。(C++程序员听起来熟悉吗?)

     那么,C#如何处理溢出的呢? 要找出其默认行为,请看我在这本书前面提到的阶乘的例子。(为了方便其见,前面的例子再次在清单 7.1 中给出)

 

清单 7.1     计算一个数的阶乘

 

 1: using System;

 2:

 3: class Factorial

 4: {

 5:  public static void Main(string[] args)

 6:  {

 7:   long nFactorial = 1;

 8:   long nComputeTo = Int64.Parse(args[0]);

 9:

10:   long nCurDig = 1;

11:   for (nCurDig=1;nCurDig <= nComputeTo; nCurDig++)

12:    nFactorial *= nCurDig;

13:

14:   Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);

15:  }

16: }

 

    当你象这样使用命令行执行程序时

    factorial 2000

 

    结果为0,什么也没有发生。因此,假定C#默默地处理溢出情况而不明确地警告你是安全的。

     通过对整个应用程序(经编译器开关)或在语句级允许溢出检查,你就可以改变这种行为。以下两节分别解决一种方案。

7.1.1溢出检查的编译器设置

    如果你想控制整个应用程序的溢出检查,C#编译器设置选项正是你所要找的。默认地,溢出检查是禁用的。要明确地请求它,运行以下编译器命令:

csc factorial.cs /checked+

 

    现在当你用2000参数执行应用程序时,CLR通知你溢出异常(见图 7.1)。

 

图 7.1 允许了溢出异常,阶乘代码产生了一个异常。

 

 

 

  按确定键离开对话框出现了异常信息:

Exception occurred: System.OverflowException

  at Factorial.Main(System.String[])

 

  现在你了解了溢出条件引发了一个 System.OverflowException异常。下一节,在我们完成语法检查之后,如何捕获并处理所出现的异常?

7.1.2 语法溢出检查

  如果你不想对整个应用程序进行溢出检查,那么只允许对某些代码段进行检查便可,这样可能会很顺畅。在这种场合下,你可能象清单7.2中显示的那样使用检查语句。

 

清单 7.2  阶乘计算中的溢出检查

 

 1: using System;

 2:

 3: class Factorial

 4: {

 5:  public static void Main(string[] args)

 6:  {

 7:   long nFactorial = 1;

 8:   long nComputeTo = Int64.Parse(args[0]);

 9:

10:   long nCurDig = 1;

11:

12:   for (nCurDig=1;nCurDig <= nComputeTo; nCurDig++)

13:    checked { nFactorial *= nCurDig; }

14:

15:   Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);

16:  }

17: }

 

  纵使你运用标志 checked- 编译了该代码,在第13行中,溢出检查仍然会对乘法实施检查,因为checked 语句已经括住了它。将会出现相同的错误信息。

  显示相反行为的语句是unchecked 。甚至如果允许了溢出检查(给编译器加上checked+标志),被unchecked 语句所括住的代码也将不会引发溢出异常:

 

unchecked

{

 nFactorial *= nCurDig;

}

 

7.2  异常处理语句

  既然你知道了如何产生一个异常(你会发现更多的方法,相信我),仍然存在如何处理它的问题。如果你是一个 C++ WIN32 程序员,肯定熟悉SEH(结构异常处理)。令人感到欣慰的是,C#中的命令几乎是相同的,而且它们也以相似的方式运作。

 

以下三节介绍了C#的异常处理语句:

。用 try-catch 捕获异常

。用try-finally 清除异常

。用try-catch-finally 处理所有的异常

 

7.2.1  使用 try 和 catch捕获异常

  你肯定会对一件事非常感兴趣——不要给用户提示那些令人讨厌的异常消息,以便你的应用程序继续执行。要这样,你必须捕获(处理)该异常。

要用到的语句是try 和 catch。try包含可能会产生异常的语句,而catch处理一个异常,如果有异常存在的话。清单7.3 用try 和 catch为OverflowException 实现异常处理。

 

清单7.3  捕获由   Factorial Calculation引发的OverflowException 异常

 

 1: using System;

 2:

 3: class Factorial

 4: {

 5:  public static void Main(string[] args)

 6:  {

 7:   long nFactorial = 1, nCurDig=1;

 8:   long nComputeTo = Int64.Parse(args[0]);

 9:

10:   try

11:   {

12:    checked

13:    {

14:     for (;nCurDig <= nComputeTo; nCurDig++)

15:      nFactorial *= nCurDig;

16:    }

17:   }

18:   catch (OverflowException oe)

19:   {

20:    Console.WriteLine("Computing {0} caused an overflow exception", nComputeTo);

21:    return;

22:   }

23:

24:   Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);

25:  }

26: }

 

为了说明清楚,我扩展了某些代码段,而且我也保证异常是由checked 语句产生的,甚至当你忘记了编译器设置时。

正如你所见,异常处理并不麻烦。你所有要做的是:在try语句中包含容易产生异常的代码,接着捕获异常,该异常在这个例子中是OverflowException类型。无论一个异常什么时候被引发,在catch段里的代码会注意进行适当的处理。

如果你不事先知道哪一种异常会被预期,而仍然想处于安全状态,简单地忽略异常的类型。

 

try

{

...

}

catch

{

...

}

 

但是,通过这个途径,你不能获得对异常对象的访问,而该对象含有重要的出错信息。一般化异常处理代码象这样:

 

try

{

...

}

catch(System.Exception e)

{

...

}

 

注意,你不能用 ref  或 out 修饰符传递 e 对象给一个方法,也不能赋于它一个不同的值。

 

7.2.2  使用 try 和 finally 清除异常

如果你更关心清除而不是错误处理, try  和 finally 会获得你的喜欢。尽管它并没有抑制出错信息,但包含在 finally 块中的代码在异常被引发后仍然会被执行。

尽管程序不正常终止,但你还可以给用户提供一条消息,如清单 7.4 所示。

 

清单 7.4  在finally 语句中处理异常

 

 1: using System;

 2:

 3: class Factorial

 4: {

 5:  public static void Main(string[] args)

 6:  {

 7:   long nFactorial = 1, nCurDig=1;

 8:   long nComputeTo = Int64.Parse(args[0]);

 9:   bool bAllFine = false;

10:

11:   try

12:   {

13:    checked

14:    {

15:     for (;nCurDig <= nComputeTo; nCurDig++)

16:      nFactorial *= nCurDig;

17:    }

18:    bAllFine = true;

19:   }

20:   finally

21:   {

22:    if (!bAllFine)

23:     Console.WriteLine("Computing {0} caused an overflow exception", nComputeTo);

24:    else

25:     Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);

26:   }

27:  }

28: }

 

通过测试该代码,你可能会猜到,即使没有引发异常处理,finally也会被执行。这是真的——在finally中的代码总是会被执行的,不管是否具有异常条件。为了举例说明如何在两种情况下提供一些有意义的信息给用户, 我引进了新变量bAllFine。bAllFine告诉finally 语块,它是否因为一个异常或者仅是因为计算的顺利完成而被调用。

作为一个习惯了SEH程序员,你可能会想,是否有一个与C++中很管用的__leave 语句等价的语句。如果你还不了解,这里说明一下:在C++中的__leave 语句是用来提前终止 try  语段中的执行代码,并立即跳转到finally 语段 。

坏消息! C# 中并没有__leave 语句。但是,在清单 7.5 中的代码演示了一个你可以实现的方案。

 

清单 7.5  从 try语句 跳转到finally 语句

 

 1: using System;

 2:

 3: class JumpTest

 4: {

 5:  public static void Main()

 6:  {

 7:   try

 8:   {

 9:    Console.WriteLine("try");

10:    goto __leave;

11:   }

12:   finally

13:   {

14:    Console.WriteLine("finally");

15:   }

16:

17:   __leave:

18:   Console.WriteLine("__leave");

19:  }

20: }

 

 

当这个应用程序运行时,输出结果为

 

try

finally

__leave

 

一个 goto 语句不能退出 一个finally 语块。甚至把 goto 语句放在 try 语句块中,还是会立即返回控制到 finally 语块。因此,goto 只是离开了 try 语块并跳转到finally 语块。直到 finally 中的代码完成运行后,才能到达__leave 标签。按这种方式,你可以模仿在SEH中使用的的__leave 语句。

顺便地,你可能怀疑goto 语句被忽略了,因为它是try 语句中的最后一条语句,并且控制自动地转移到了 finally 。为了证明不是这样,试把goto 语句放到Console.WriteLine 方法调用之前。尽管由于存在着不可到达代码,使你得到了编译器的警告,但是你将看到goto语句实际上被执行了,而没有产生“try”字符串的输出。

 

7.2.3  使用try-catch-finally处理所有异常

应用程序最有可能的途径是合并前面两种错误处理技术——捕获错误、清除并继续执行应用程序。所有你要做的是在出错处理代码中使用 try 、catch 和 finally语句。清单 7.6 显示了处理零除错误的途径。

 

清单 7.6  实现多个catch 语句

 

 1: using System;

 2:

 3: class CatchIT

 4: {

 5:  public static void Main()

 6:  {

 7:   try

 8:   {

 9:    int nTheZero = 0;

10:    int nResult = 10 / nTheZero;

11:   }

12:   catch(DivideByZeroException divEx)

13:   {

14:    Console.WriteLine("divide by zero occurred!");

15:   }

16:   catch(Exception Ex)

17:   {

18:    Console.WriteLine("some other exception");

19:   }

20:   finally

21:   {

22:   }

23:  }

24: }

 

这个例子的技巧为,它包含了多个catch 语句。第一个捕获了更可能出现的DivideByZeroException异常,而第二个catch语句通过捕获普通异常处理了所有剩下来的异常。

你肯定总是首先捕获特定的异常,接着是普通的异常。如果你不按这个顺序捕获异常,会发生什么事呢?清单7.7中的代码有说明。

 

清单7.7   顺序不适当的 catch 语句

 

 1:   try

 2:   {

 3:    int nTheZero = 0;

 4:    int nResult = 10 / nTheZero;

 5:   }

 6:   catch(Exception Ex)

 7:   {

 8:    Console.WriteLine("exception " + Ex.ToString());

 9:   }

10:   catch(DivideByZeroException divEx)

11:   {

12:    Console.WriteLine("never going to see that");

13:   }

 

 

    编译器将捕获到一个小错误,并类似这样报告该错误:

wrongcatch.cs(10,9): error CS0160: A previous catch clause already

catches all exceptions of this or a super type ('System.Exception')

 

意思为:

wrongcatch.cs(10,9): 错误代码 CS0160: 前面的catch语句早已捕获了这个或高级类型('System.Exception')的所有异常。

 

最后,我必须报导CLR异常与SEH相比时的一个缺点(或差别):没有在SEH异常过滤器中很有用的EXCEPTION_CONTINUE_EXECUTION标识符的等价物。基本上,EXCEPTION_CONTINUE_EXECUTION 允许你重新执行负责异常的代码片段。在重新执行之前,你有机会更改变量等。我个人特别喜欢的技术为:通过使用存取违例异常,按需要实施内存分配。

  

7.3  引发异常

当你不得不捕获异常时,其他人首先必须首先能够引发异常。而且,不仅其他人能够引发,你也可以负责引发。其相当简单:

throw new ArgumentException("Argument can't be 5");

你所需要的是throw 语句和一个适合的异常类。我已经从表7.1提供的清单中为这个例子选出一个异常。

 

表 7.1      Runtime提供的标准异常

异常类型  

描述

Exception

所有异常对象的基类

SystemException

运行时产生的所有错误的基类

IndexOutOfRangeException

当一个数组的下标超出范围时在运行时被引发

NullReferenceException

当一个空对象被引用时在运行时被引发

InvalidOperationException

当对方法的调用对对象的当前状态无效时,由某些方法引发

ArgumentException

所有参数异常的基类

ArgumentNullException

在参数为空(不允许)的情况下,由方法引发。

ArgumentOutOfRangeException

当参数不在一个给定范围之内时,由方法引发

InteropException

目标在或发生在CLR外面的异常的基类

ComException

包含COM 类的HRESULT信息的异常

SEHException

封装win32 结构异常处理信息的异常

 

然而,在catch语句的内部,你已经有了随意处置的异常,就不必创建一个新异常。可能在表7.1 中的异常没有一个符合你特殊的要求——为什么不创建一个新的异常?在即将要学到小节中,都涉及到这两个话题。

 

7.3.1 重新引发异常

    当处于一个catch 语句的内部时,你可能决定引发一个目前正在再度处理的异常,进一步的处理留给一些外部的try-catch 语句。该方法的例子如 清单7.8所示。

 

清单 7.8  重新引发一个异常

 

 1:   try

 2:   {

 3:    checked

 4:    {

 5:     for (;nCurDig <= nComputeTo; nCurDig++)

 6:      nFactorial *= nCurDig;

 7:    }

 8:   }

 9:   catch (OverflowException oe)

10:   {

11:    Console.WriteLine("Computing {0} caused an overflow exception", nComputeTo);

12:    throw;

13:   }

 

注意,我不必规定所声明的异常变量。尽管它是可选的,但你也可以这样写:

throw oe;

现在我们还必须留意这个异常。

 

7.3.2  创建自己的异常类

尽管建议使用预定义的异常类,但在实际场合,创建自己的异常类可能会很方便。创建自己的异常类,允许你的异常类的使用者根据该异常类采取不同的手段。

在清单 7.9 中出现的异常类 MyImportantException遵循两个规则:第一,它用Exception结束类名。第二,它实现了所有三个被推荐的通用结构。你也应该遵守这些规则。

清单  7.9   实现自己的异常类  MyImportantException

 

 1: using System;

 2:

 3: public class MyImportantException:Exception

 4: {

 5:  public MyImportantException()

 6:   :base() {}

 7:

 8:  public MyImportantException(string message)

 9:   :base(message) {}

10:

11:  public MyImportantException(string message, Exception inner)

12:   :base(message,inner) {}

13: }

14:

15: public class ExceptionTestApp

16: {

17:  public static void TestThrow()

18:  {

19:   throw new MyImportantException("something bad has happened.");

20:  }

21:

22:  public static void Main()

23:  {

24:   try

25:   {

26:    ExceptionTestApp.TestThrow();

27:   }

28:   catch (Exception e)

29:   {

30:    Console.WriteLine(e);

31:   }

32:  }

33: }

 

正如你所看到的,MyImportantException 异常类不能实现任何特殊的功能,但它完全基于System.Exception类。使用一条catch 语句于System.Exception 类,程序的剩余部分测试新的异常类。

如果没有特殊的实现而只是给MyImportantException定义了三个构造函数,创建它又有什么意义呢?它是一个重要的类型——你可以在catch语句中使用它,代替更为普通的异常类。可能引发你的新异常的客户代码可以按规定的catch代码起作用。

当使用自己的名字空间编写一个类库时,也要把异常放到该名字空间中。尽管它并没有出现在这个例子中,你还是应该使用适当的属性,为扩展了的错误信息扩充你的异常类。

 

7.4  异常处理的“要”和“不要”

  作为最后的忠告之语,这里是对异常引发和处理所要做和不要做的清单:

。要提供有意义的文本,当引发异常时。

。要引发异常,仅当条件是真正异常,也就是当一个正常的返回值不满足时。

。要引发一个ArgumentException异常, 如果你的方法或属性被传递一个坏参数时。

。要引发一个 InvalidOperationException异常,当调用操作不适合对象的当前状态时。

。要引发最适合的异常。

。要使用链表异常,它们允许你跟踪异常树。

。不要为正常或预期的错误使用异常。

。不要为流程的正常控制使用异常。

。不要在方法中引发 NullReferenceException或IndexOutOfRangeException异常。

 

   7.5  小结

这一章由介绍溢出检查开始。你可以使用编译器开关(默认是关),使整个应用程序允许或禁止溢出检查。如果需要微调控制,你可以使用检查和非检查语句,它允许你用或不用溢出检查来执行一段代码,尽管没有设置应用程序开关。

当发生溢出时,一个异常就被引发了。如何处理异常取决于你。我提到了各种途径,包括你最有可能贯穿整个应用程序中使用的:try、catch 和finally 语句。在伴随的多个例子中,你学到了它与WIN32结构异常处理(SEH)的差别。

    异常处理供类的用户使用; 然而,如果你负责创建新的类,就可以引发异常。有多种选择:引发早已捕获的异常,引发存在的框架异常,或者按规定的实际目标创建新的异常类。

最后,你需要阅读引发和处理异常的每一条“要”和“不要”。

 

 

 

实时网页RAG(Web-RAG)(⭐)—— 接入搜索引擎API,实时抓取最新网页并生成摘要回答。技术栈:SerpAPI、BeautifulSoup、Tavily 2026年8月,距离GPT-4首发已过去三年,距离Claude 3.5发布也已逾一年。知识的时效性断层。一个训练于2025年1月的模型,无法知晓2026年巴黎奥运会的最新奖牌榜;一个参数冻结在2024年的系统,对2025年诺奖得主、2026年地缘政治突变、最新发布的《生成式人工智能服务管理办法(修订稿)》一无所知。更微妙的是,即便模型训练数据覆盖了某个时间段,它也只能“背诵”当时的信息,而无法追踪事件的后续发展——比如一场飓风的路径更新、一家上市公司的季度财报修正、一项科研论文的撤稿或争议。 阅读详情

相关推荐

【企业管理】【管理科学】企业全岗位综合运营与组织知识矩阵体系01

岗位类别核心职责工作内容(详细)协作模式协商焦点博弈策略信任建立机制序列化工作流程关键绩效指标研发类​技术创新与产品开发1.需求分析:R=f(U,M,T) 2.概念设计:C=D(S,B) 3.原型开发 4.测试验证 5.文档编写敏捷团队、跨功能协作技术方案、资源分配、优先级纳什均衡:ui​(si​,s−i​)≥ui​(si′​,s−i​)代码审查、技术分享、结果透明瀑布模型/敏捷迭代1.专利数量P 2.技术就绪度TRL 3.缺陷密度D<0.1/KLOC其中:U=用户需求,

weixin_49199313的博客 744

System.ArgumentException: 已添加了具有相同键的项

在ajaxSubmit提交表单数据到控制器时 出了这样一个错 这项错误是使用实体类接收值时,实体类中有两个相同键的项。 public dateTime DateOfBirth {get;set;} public string dateOfBirth {get;set;} 为什么会犯这个错呢,是页面数据回填时用到了这个类,为了回填时间类型的数据,在类中添加了...

weixin_44541467的博客 1万+

配电网故障重构/孤岛划分/故障恢复

程序主要复现《基于GA_BFGS算法的配电网故障恢复性重构研究_郑海广》,采用matlab编程软件实现,依据网络结构和DG供电方式对配电网进行孤岛划分,将含有 DG 的配电网拓扑结构看成一个树,搭建成连通图模型,使得将孤岛的划分变成了求取最小生成树,以网损和开关开断次数作为目标,采用 IEEE33 节点配电网为算例,通过遗传算法寻优计算,从而得到最佳的重构方案。

zhangxd212489的博客 2500

C#中的异常捕获机制(try catch finally)

C#中的异常捕获机制(try catch finally) //转自:http://blog.youkuaiyun.com/zevin/article/details/6901489 一、C#的异常处理所用到关键字   try 用于检查发生的异常,并帮助发送任何可能的异常。   catch 以控制权更大的方式处理错误,可以有多个catch子句。   finally 无论是否引发了异常,fi

call_from_dream的专栏 1555

海思SD3403/SS928开发(二)环境搭建:从零到一构建高效开发环境的实战指南

本文详细介绍了海思SD3403/SS928开发板环境搭建的全流程,包括Ubuntu系统选择、基础配置、开发环境依赖安装、SDK工具链配置等关键步骤。通过实战经验分享,帮助开发者避免常见问题,快速构建高效开发环境,提升开发效率。

weixin_28717683的博客 284

zemax显微镜设计

光学显微镜(Optical Microscope,简写OM)是利用光学原理,把人眼所不能分辨的微小物体放大成像,以供人们提取微细结构信息的。我这里是插入进来之后才反转,如果之前已经在目镜的单独文件夹反转过了就不用了。将目镜的焦距设定为25mm,通过缩放,然后将镜头调转过来。镜头数据中的曲率半径、物距像距都设置为变量。将镜头的焦距整体变为16.25mm。将孔径类型设置为按照光阑尺寸浮动。打开物镜的文件,选择插入镜头。由英国物理学家虎克制作。2、像空间孔径0.25。3、像面大小-0.9。

fendoudecheng的博客 8546

C#异常处理

通用语言运行时(CLR)具有的一个很大的优势为,异常处理是跨语言被标准化的。一个在C#中所引发的异常可以在Visual Basic客户中得到处理。不再有 HRESULTs 或者 ISupportErrorInfo 接口。 尽管跨语言异常处理的覆盖面很广,但这一章完全集中讨论C#异常处理。你稍为改变编译器的溢出处理行为,接着有趣的事情就开始了:你处理了该异常。要增加更多的手段,随后引发你所

不再想当菜鸟了 5162

地平线RDKX3初始配置与USB无线网卡

地平线X3无线网卡配置

Richard_Mei的博客 4077

ATL-Style类 (模板基类) 定义的一种AV错误

下面是一个典型ATL风格的类定义: #include "stdafx.h" #include "iostream.h" template class B1 { public: void SayHi() { T* pT = static_cast(this); pT->PrintClassName(); } protected:

btwsmile's blog 1164

Java开发者必看:Apache PDFBox实现PDF数字签名完整指南(附源码)

本文为Java开发者提供了使用Apache PDFBox实现PDF数字签名的完整指南。详细介绍了从环境配置、核心原理到完整代码实现的全过程,涵盖证书管理、签名位置计算、性能优化及实际应用案例,并附有可直接复用的源码,帮助开发者高效集成PDF数字签名功能。

o1p2q3r的博客 339

从零构建:如何用MATLAB和SDR硬件搭建你的第一个OFDM卫星通信原型系统

本文详细介绍了如何利用MATLAB和SDR硬件从零构建OFDM卫星通信原型系统。通过核心组件选型、开发环境配置、OFDM算法实现到系统集成与优化的完整流程,帮助通信工程学生和DIY爱好者快速掌握软件无线电技术在卫星通信中的应用。特别推荐使用HackRF One和MATLAB工具箱实现高性价比的OFDM系统验证。

pz890123456的博客 378

<<展现C#>> 前言(补充) 和第三章 第一个C#程序(修订)

 前言0.1  提要    欢迎阅读《展现 C#》(Presenting C#)。这本书是你提高企业编程语言的一条捷径。这种企业编程语言带有下一代编程语言服务运行时(NGWS Runtime):C#(发音"C sharp")。    NGWS Runtime 是一个不仅管理执行代码、同时也提供使编程更加容易的动态环境。编译器产生受管代码以指向这种受管理执行环境。你获得跨平台语言集成、跨平台语言

rainbow的专栏 1465

<工控><PLC>汇川Easy521系列PLC与汇川SV630N伺服进行EtherCat通讯的相关配置及指令编写

本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如果有值得记录的内容,也会添加进来。

用沸腾的热血,支付我们的人生吧! 2万+

<<展现C#>> 第五章 类(修订)

 第五章  类      前一章讨论了数据类型和它们的用法。现在我们转移到C#中至关重要的结构——类。没有了类,就连简单的C#程序都不能编译。这一章假定你知道了一个类的基本组成部分:方法、属性、构造函数和析构函数。 C#在其中增加了索引和事件。      在这一章中,你学到下列有关类的话题。      。 使用构造函数和析构函数      。给类写方法      。给一个类增加属性存取标志   

rainbow的专栏 1504

人工智能训练师三级考试大纲深度解读|理论+实操分值分布+六大模块占比

三级人工智能训练师考试分为理论和实操两大模块(各100分,合格线60分)。理论考试包含AI基础(30%)、数据标注(25%)、模型训练(20%)、测试(15%)和系统运维(10%),题型为客观题;实操考核侧重数据标注(40%)、模型测试(35%)和系统运维(25%),采用现场操作形式。复习应优先关注AI基础和数据标注等高分值模块,实操需重点掌握标准流程和结果准确性(占评分70%)。考试要求两模块均达标,理论侧重概念理解,实操强调规范执行与文档完整。

白话机器学习 1093

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

经典技术书籍分享(4):《CLR Via C#》第三版 新增内容(Jeffrey Richter博文翻译)

Posted on 2010-06-06 20:32 Frank Xu Lei 阅读(395) 评论(6)  编辑收藏 所属分类: 经典技术书籍分享<br />Jeffrey Richter《CLR Via C#》第三版已经于2010年2月出版,关于这本书的下载地址,可以参考之前的文章。里面有英文版的介绍信息以及下载链接:经典技术书籍分享(3):《CLR Via C#》 3 目录和下载。这本书最明显的部分就是增加了第5部分:线程。<br />独立的5章内容。另外就是对于.NET3.0、4.0都做

微软特邀讲师 老徐FrankXuLei 的专栏 2699

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

大数据平台数据入湖规范

大数据平台数据入湖规范第一章 总则1.1 目的为规范大数据平台数据入湖全流程,实现数据“统一标准、统一管控、安全合规、高效可用”,规避数据混乱、质量低下、存储冗余、安全泄露等问题,保障数据湖资产的完整性、一致性和可追溯性,支撑下游数据分析、业务决策及数据应用落地,特制定本规范。本规范适用于所有接入大数据平台数据湖的数据源、数据处理、数据存储、数据管控及相关技术人员、业务人员。1.2 适用范围。

weixin_43864993的博客 428

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Python 面向对象编程第四版(一)

Python 编程语言非常流行,用于各种应用。Python 语言设计得相对容易创建小型程序。为了创建更复杂的软件,我们需要掌握一些重要的编程和软件开发技能。本书描述了在 Python 中创建程序的面向对象方法。它介绍了面向对象编程的术语,通过逐步示例展示软件设计和 Python 编程。它描述了如何利用继承和组合从单个元素构建软件。它展示了如何使用 Python 的内置异常和数据结构,以及 Python 标准库中的元素。本书用详细示例描述了多种常见设计模式。

龙哥盟 456

msdn 访谈录之C#编程二

程序员天地Robert Hess和Jeffrey Richter(著名的编程作家、专栏作家和咨询专家)的谈话。ROBERT HESS: 欢迎回来。我们正要涉及到有关C#编程方面的问题。为了有助于我们理解这些问题,我邀请我的好朋友Jeffery Richter到这里来。Jeffery恰好是一名撰写了很多编程书籍的程序员,他最新的一本书为Programming Server Side Ap

rainbow的专栏 2970

<<展现C#>> 第二章 NGWS Runtime 技术基础(修订)

                   第二章  NGWS  runtime 技术基础     既然你已经具有了C#全面的印象,我也想让你领略NGWS runtime的全貌。C#依靠由NGWS提供的运行时;因此,有必要知道运行时如何工作,以及它背后所蕴含的概念。    所以,这一章分为两部分——它们是所有的概念和应用的基础。两部分的内容虽然有些重叠,但有助于加深理解正在学习的

rainbow的专栏 2131

“扫雷”游戏的幕后

    介绍    曾想了解“扫雷”游戏在幕后所发生的一切吗?嗯,我想过,还由此决定对其进行了研究。本文是我的研究结果,现公之于众。 主要概念1. 使用 P/Invoke 调用 Win32 API。2. 直接读取另一个进程的内存。注1:本文的第一部分包括一些汇编代码,如果你不是很明白,无关要紧,这不是本文的目的,你尽可以跳过不管。然而,如果你想问我有

rainbow的专栏 1935

<展现 C#> 第一章 C#简介(修订)

                            第一章  C#简介     欢迎你加入C#(念C sharp)的世界! 这一章将让你了解C#,并回答一些相关的问题,如:你为什么要使用C#,C++和C#主要有什么不同的地方,以及为什么C#使软件开发更容易而且还更有趣。1.1 为什么是另外一种编程语言?    你必须回答的一个问题:当已经使用C++或VB从事企业开发时,为

rainbow的专栏 1829

MSDN 访谈录之C#编程一

MSDN 访谈录(MSDN Show)  C#编程C#是一种令人耳目一新且为之一振的编程语言,它设计给C++程序员带来快速的开发能力,而又不牺牲C和 C++所特有的功能和控制。    在今天的这一期里,我们将要和Anders Hejlsberg交谈,他是微软一位资深的工程师,一直帮助设计、开发和实现该语言,并发挥其在未来.NET平台中的作用。我们还要和Jeffrey Richter(著名的编程

rainbow的专栏 1742

<<展现C#>> 第八章 用C#写组件(修订)

第八章    用C#写组件 这一章关于用C#写组件。你学到如何写一个组件,如何编译它,且如何在一个客户程序中使用它。更深入一步是运用名字空间来组织你的应用程序。这章由两个主要大节构成:。你的第一个组件。使用名字空间工作 8.1  你的第一个组件 到目前为止,在本书中提到的例子都是在同一个应用程序中直接使用一个类。类和它的使用者被包含在同一个执行文件中。现在我们

rainbow的专栏 1632

<<展现C#>>第四章 C#类型(修订)

 第四章        C#类型     既然你已经知道如何创建一个简单的C#程序,那么我将会给你介绍C#的类型系统。在这一章中,你学到如何使用不同的值和引用类型,加框和消框机制能为你作些什么。尽管这一章的并不侧重于例子,但你还可以学到很多重要的、关于如何使用现成类型创建程序的知识。4.1 值类型 各种值类型总是含有相应该类型的一个值。C#迫使你初始化变量才能使用它们进行

rainbow的专栏 1585
上一篇: <<展现C#>>第六章 控制语句(修订)
下一篇: <<展现C#>> 第八章 用C#写组件(修订)
rainbow
博客等级 码龄27年 3粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值