[疑问] 关于C#值类型,不是都是继承的object吗,怎么继承下来成了值类型,object是引用类型啊。或者问 object是一个类,值类型和引用类型是从object类派生出来的。object类属于引用类型,为什么可以派生出来值类型?

C#学习笔记:类型的派生关系

一些解答:[转载于]进修的stone

引用类型和值类型都继承自System.Object类。不同的是,几乎所有的引用类型都直接从System.Object继承,而值类型则继承其子类,即 直接继承System.ValueType。System.ValueType直接派生于System.Object。即System.ValueType本身是一个类类型,而不是值类型。其关键在于ValueType重写了Equals()方法,从而对值类型按照实例的值来比较,而不是引用地址来比较。

C#有以下一些引用类型
数组(派生于System.Array)
用户用定义的以下类型:
类:class(派生于System.Object);
接口:interface(接口不是一个“东西”,所以不存在派生于何处的问题。Anders在《C# Programming Language》中说,接口只是表示一种约定[contract]);
委托:delegate(派生于System.Delegate)。
object(System.Object的别名);
字符串:string(System.String的别名)。
可以看出
引用类型与值类型相同的是,结构体也可以实现接口;
引用类型可以派生出新的类型,而值类型不能;
引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型);
引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
对于最后一条,经常混淆的是string。我曾经在一本书的一个早期版本上看到String变量比string变量效率高;我还经常听说String是引用类型,string是值类型,等等。例如:
string s1 = "Hello, ";
string s2 = “world!”;
string s3 = s1 + s2;//s3 is “Hello, world!”
这确实看起来像一个值类型的赋值。再如:
string s1 = “a”;
string s2 = s1;
s1 = “b”;//s2 is still “a”
改变s1的值对s2没有影响。这更使string看起来像值类型。实际上,这是运算符重载的结果,当s1被改变时,.NET在托管堆上为s1重新分配了内存。这样的目的,是为了将做为引用类型的string实现为通常语义下的字符串。

关于 string,还有一些词,比如 string 与 享元模式 的联系。

类型定义截图

bool、int、double等,是结构体。

  • object类型
    C#学习笔记:类型的派生关系
  • bool
    C#学习笔记:类型的派生关系
  • int
    C#学习笔记:类型的派生关系
  • doubleC#学习笔记:类型的派生关系
  • struct
    C#学习笔记:类型的派生关系
  • enum
    C#学习笔记:类型的派生关系
  • string
    C#学习笔记:类型的派生关系

相关文章:

  • 2021-11-27
  • 2021-07-16
  • 2022-12-23
  • 2021-06-04
  • 2022-02-23
  • 2021-12-10
  • 2022-12-23
  • 2021-07-31
猜你喜欢
  • 2022-12-23
  • 2021-05-24
  • 2021-12-13
  • 2021-04-04
  • 2021-10-23
  • 2022-02-11
  • 2021-05-31
相关资源
相似解决方案