读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(二)

【基元类型推荐】

推荐直接使用 FCL 类型。

【理由】

  • 编码时不至于困惑string与String的使用。由于C#的stirng(一个关键字)直接映射到System.String(一个 FCL 类型),所以两者没有区别,都可以使用。不至于困惑int在32位操系统和64位操作系统上代表的整数不同。 有的开发人员认为int在32位操作系统上运行时,代表32位整数;而在64位操作系统上运行时,代表64位整数,这个观点完全错误。在C# 中,int 始终映射到System.Int32,所以不管在什么操作系统上运行,代表的都是32位整数。如果程序员习惯了再代码中使用Int32,像这 样的无解就不会产生了。
  • C#中的关键字代表的意义在其他的语言中不一定成立。在C#中,long映 射到System.Int64,但在其他编程语言中,long可能就映射到Int16或Int32.例如,C++/CLI 就将long视为一个 Int32.习惯于用一种语言写程序的人在看到用另一种语言写的源代码时,很容易错误地理解代码的意图。事实上,大多数语言甚至不将long看作是一个关 键字,根本不会编译使用了它的代码。
  • 代码一目了然,含义清晰。 FCL 的许多方法都将类型名称作为方法名的一部分。例如:BinaryReader类型提供的方法包括 ReadBoolean,ReadInt32,ReadSingle等;而System.Convert类型提供的方法包括 ToBoolean,ToInt32,ToSingle等。以下代码虽然语法没有问题,但包含float的那一行显得颇不自然,无法一下子判断该行的正确性:

    BinaryReader br = ner BinaryReader(...);
    float var0 = br.ReadSingle();//正确,但不自然
    Single var1 = br.ReadSingle();//正确,而且一目了然
  • 了解其他语言也可以面向CLR。 平时只用C#的许多程序员逐渐忘了还可以用其他语言写面向CLR的代码。因此,“C#主义”逐渐入侵类库代码。例如,Microsoft的FCL几乎是完 全用C#写的,FCL团队的开发人员现在向库中引入了像Array的GetLongLength这样的方法。该方法返回一个Int64值。这种值在C#中 是long,但在其他语言中不是(C++/CLI)。另一个例子是System.Linq.Enumerable的LongCount方法。
时间: 2024-10-09 11:08:02

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(二)的相关文章

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型

[概念] 编译器直接支持的数据类型 [C#基元类型与对应的 FCL 类型] C#基元类型 FCL 类型 说明 sbyte System.Sbyte 有符号8位值 byte System.Byte 无符号8号位值 short System.Int16 有符号16位值 ushort System.UInt16 无符号16位值 int System.Int32 有符号32位值 uint System.UInt32 无符号32位值 long System.Int64 有符号64位值 ulong Syst

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(三)

[checked 和 unchecked 基元类型操作] 1.第一种使用方式 UInt32 invalid = unchecked((UInt32) (-1)); //OK,不会抛异常 Byte b = 100; b = checked((Byte) (b + 200));//抛出OverflowException异常 2.第二种使用方式 checked {//开始一个checked块 Byte b = 100; b = (Byte) (b + 200);//该表达式会进行溢出检查 }//结束一

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_dynamic基元类型

1.代码使用 dynamic 表达式/变量来调用一个成员时,编译器会生成特殊的 IL 代码来描述所需的操作.这种特殊的代码称为 payload(有效载荷).在运行时,payload 代码根据当前由 dynamic 表达式/变量引用的对象的实际类型来决定具体执行的操作. [例子] private static dynamic Plus(dynamic arg) { return arg + arg;} [分析] 这个方法的参数类型声明为了 dynamic.在方法内部,实参被作为二元+操作符的两个操

CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段

编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32();  // a = 0 a = 1; 等价于: int a = 1; 这种语法不仅增强了代码的可读性,其生成的IL代码与使用System.Int32时生成的IL代码是完全一致的. 编译器直接支持的数据类型称为基元类型(primitive type).基元类型直接映射到Framework类库(FCL)中存在的类型.如C#中,int直接映射

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_运行时解析类型引用

public sealed class Program{ public static void Main() { System.Console.WriteLine("Hi"); } } 程序运行时,CLR会加载并初始化它.CLR读取程序集的CLR头,查找标识了应用程序入口方法(Main)的MethodDefToken.然后,CLR会检索MethodDef元数据表,找到该方法的IL代码在文件中的偏移量,把这些IL代码JIT(just-in-time)编译成本地(native)代码.编译时

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_高级管理控制(配置)

一个应用程序的XML配置文件示例: <?xml version="1.0"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="AuxFiles;bin\subdir" /> <dependentAssembly>

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_通过ILDasm.exe查看编译器如何将类型及其成员编译成元数据

[实例代码] using System; public sealed class SomeType //-------------1 { //嵌套类 private class SomeNestedType{} //-------------2 //常量.只读字段和静态可读/可写字段 private const Int32 SomeConstant = 1; //-------------3 private readonly Int32 SomeReadOnlyField = 2; //----

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_命名空间和程序集的关系

命名空间和程序集不一定相关 1. 同一个命名空间中的各个类型可能是在不同的程序集中实现的.(System.IO.FileStream在MSCorLib.dll程序集中,而System.IO.FileSystemWatcher在System.dll程序集中) 2. 同一个程序集中,也可能包含不同命名空间中的类.(System.Int32和System.Text.StringBuilder类型都在MSCorLib.dll程序集中)

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_类型转换(一)

1. C# 不要求任何特殊语法即可将一个对象转换为它的任何基类型,因为向基类型的转换被认为是一种安全的隐式转换: 2. 然而,将对象转换为它的某个派生类型时,C#要求开发人员只能进行显示转换,因为这样的转换可能在运行时失败: 例子: internal class Employee{ ... } public sealed class Program { public static void Main() { //不需要转型,因为new返回一个Employee对象, //而Object是Emplo