C#的类型系统

简介:
一.C#的统一类型系统
1.C#的类型系统是统一的,java的类型系统分为:基本类型(原生类型)和类类型,而C#的所有类型直接或间接地从object类类型派生而来,从类型系统上来看比java更OO。
2.C#的类型分为三类:
(1)值类型, 一个值类型或是结构类型 或是枚举类型
(2)引用类型
(3)指针类型
值类型与
引用类型的不同在于: 值类型的变量直接包含其数据 而引用类型的变量存储对其数据的引用 (reference) 后者称为对象 (object) 。对于引用类型 两个变量可能引用同一个对象 因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有自己的数据副本,对一个变量的操作不可能影响另一个变量。
二。值类型
1.所有值类型从类 System.ValueType 隐式继承 后者又从类 object 继承。任何类型都不可能从值类型派生。

2.
所有值类型都隐式声明一个称为默认构造函数 (default constructor) 的公共无参数实例构造函数。默认构造函数返回一个零初始化实例 它就是该值类型的默认值 (default value)

·         对于所有simple-types默认值是将其所有位都置零的位模式所形成的值

o        对于sbytebyteshortushortintuintlongulong默认值为0

o        对于char默认值为'\x0000'

o        对于float默认值为0.0f

o        对于double默认值为0.0d

o        对于decimal默认值为0.0m

o        对于bool默认值为false

·         对于enum-typeE默认值为0

·         对于struct-type默认值是通过将所有值类型字段设置为它们的默认值、将所有引用类型字段设置为null而产生的值。

3.C#中有所谓的简单类型概念(simple type),类似于java的基本类型,但又不同,C#的简单类型本质上都是结构类型(预定义集合的结构类型),所以还是值类型,从 System.ValueType 继承而来。C#的简单类型包括:

保留字

化名的类型

sbyte

System.SByte

byte

System.Byte

short

System.Int16

ushort

System.UInt16

int

System.Int32

uint

System.UInt32

long

System.Int64

ulong

System.UInt64

char

System.Char

float

System.Single

double

System.Double

bool

System.Boolean

decimal

System.Decimal

这些简单类型都是System命名空间中预定义结构类型的别名(ruby的别名实在贴心)

4.枚举类型, 枚举类型是具有命名常量的独特的类型。每个枚举类型都有一个基础类型,该基础类型必须为 byte sbyte short ushort int uint long ulong 。如果没有为枚举类型中的元素指定基础值,默认是从0开始逐一递增。

三。引用类型

1.引用类型是类类型、接口类型、数组类型或委托类型。

2.类类型:包括预定义的类类型和用户通过class关键字的自定义类类型

3.对象类型:

object类类型是所有其他类型的最终基类。C#  中的每种类型都是直接或间接从object类类型派生的。

关键字object只是预定义类System.Object的别名。

4.string类型:
string 类型是直接从 object 继承的密封类类型。 关键字 string 只是预定义类 System.String 的别名.
5.接口类型:
与java中的接口概念基本一致,可以变相实现多重继承。

类类型

说明

System.Object

所有其他类型的最终基类。

System.String

C#  语言的字符串类型。

System.ValueType

所有值类型的基类。

System.Enum

所有枚举类型的基类。

System.Array

所有数组类型的基类。

System.Delegate

所有委托类型的基类。

System.Exception

所有异常类型的基类。


四。装箱、拆箱概念
1.装箱和拆箱的概念是 C#  的类型系统的核心。它在 value-type reference-type 之间的架起了一座桥梁,使得任何 value-type 的值都可以转换为 object 类型的值,反过来转换也可以。
2.装箱:
装箱转换允许将 value-type 隐式转换为 reference-type
装箱的行为可以用下面的过程描述:

sealed class T_Box: System.ValueType
{
T value;

public T_Box(T t) {
     value = t;
}
}

分配一个对象实例 然后将 value-type 的值复制到该实例中
3.拆箱:
拆箱转换允许将 reference-type 显式转换为 value-type
从对象 box value-type T 的拆箱转换相当于执行表达式 ((T_Box)box).value
文章转自庄周梦蝶  ,原文发布时间5.17
目录
相关文章
|
4月前
|
存储 监控 算法
基于 C# 的局域网计算机监控系统文件变更实时监测算法设计与实现研究
本文介绍了一种基于C#语言的局域网文件变更监控算法,通过事件驱动与批处理机制结合,实现高效、低负载的文件系统实时监控。核心内容涵盖监控机制选择(如事件触发机制)、数据结构设计(如监控文件列表、事件队列)及批处理优化策略。文章详细解析了C#实现的核心代码,并提出性能优化与可靠性保障措施,包括批量处理、事件过滤和异步处理等技术。最后,探讨了该算法在企业数据安全监控、文件同步备份等场景的应用潜力,以及未来向智能化扩展的方向,如文件内容分析、智能告警机制和分布式监控架构。
110 3
|
5月前
|
SQL 数据库 数据安全/隐私保护
C#wpf学习卡后台管理系统
C#wpf学习卡后台管理系统
118 32
|
8月前
|
JSON C# 数据格式
【Azure Function】C#独立工作模式下参数类型 ServiceBusReceivedMessage 无法正常工作
Cannot convert input parameter 'message' to type 'Azure.Messaging.ServiceBus.ServiceBusReceivedMessage' from type 'System.String'.
162 73
|
5月前
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
168 0
|
9月前
|
存储 监控 算法
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
10月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
113 3
|
10月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
207 2
|
11月前
|
C#
C# 可空类型(Nullable)
C# 单问号 ? 与 双问号 ??
170 12
|
11月前
|
存储 开发框架 .NET
C#语言如何搭建分布式文件存储系统
C#语言如何搭建分布式文件存储系统
246 2
|
10月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
85 0

热门文章

最新文章