读经典——《CLR via C#》(Jeffrey Richter著) 笔记_引用类型和值类型(二)

【引用类型和值类型的区别】

//引用类型(由于使用了‘class’)
class SomeRef  { public Int32 x; }

//值类型(由于使用了‘struct’)
struct SomeVal { public Int32 x; }

static void ValueTypeDemo() {
    SomeRef r1 = new SomeRef(); //在堆上分配
    SomeVal v1 = new SomeVal(); //在栈上分配
    r1.x = 5; //提另指针
    v1x = 5; //在栈上修改
    Console.WriteLine(r1.x); //显示”5“
    Console.WriteLine(v1.x);//显示”5“

    SomeRef r2 = r1; //只复制引用(指针)
    SomeVal v2 = v1;//在栈中分配并复制成员
    r1.x = 8;//r1.x和r2.x都会改变
    v1.x = 9;//v1.x 会更改,但v2.x不变

    Console.WriteLine(r1.x);//显示"8"
    Console.WriteLine(r2.x);//显示"8"
    Console.WriteLine(v1.x);//显示"9"
    Console.WriteLine(v2.x);//显示"5"
}

【图解】

时间: 2024-10-09 18:13:15

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

读经典——《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著) 笔记_基元类型

[概念] 编译器直接支持的数据类型 [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著) 笔记_基元类型(二)

[基元类型推荐] 推荐直接使用 FCL 类型. [理由] 编码时不至于困惑string与String的使用.由于C#的stirng(一个关键字)直接映射到System.String(一个 FCL 类型),所以两者没有区别,都可以使用.不至于困惑int在32位操系统和64位操作系统上代表的整数不同. 有的开发人员认为int在32位操作系统上运行时,代表32位整数:而在64位操作系统上运行时,代表64位整数,这个观点完全错误.在C# 中,int 始终映射到System.Int32,所以不管在什么操作

读经典——《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

读经典——《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著) 笔记_类型的各种成员

[Class中,可能包含的成员] 常量, 字段, 实例构造器, 类型构造器, 方法, 操作符重载, 转换操作符, 属性, 事件, 类型(Class)