一、MSDN描述

ValueType 类:提供值类型的基类

命名空间: System

程序集:   mscorlib.dll

继承关系:

值类型包括:字符、整数、浮点、布尔、枚举、结构(其实字符、整数、浮点、布尔是结构,下面会说明)

二、值类型花名册

1. 字符

Char 结构: 表示一个 Unicode 字符。

命名空间:   System

程序集   : mscorlib.dll

原型定义:

[SerializableAttribute]
[ComVisibleAttribute(true)]
public struct Char : IComparable, IConvertible, IComparable<char>, IEquatable<char>

在C# 中 char 是 System.Char 的别名

System.Char 继承 System.ValueType

using System;class App
{static void Main(){var charType1 = typeof(Char);var charType2 = typeof(char);    // char 是 Char 在C#中的别名
        Console.WriteLine(charType1);Console.WriteLine(charType1.BaseType);        Console.WriteLine(charType2);}
}

常用属性和方法:

IsDigit(Char)           是否是数字

IsLetter(Char)          是否是字母

IsLetterOrDigit(Char)   是否是数字或字母

2. 整数

分为有符号整数和无符号整数

有符号整数

SByte <--> sbyte      8位

Int16 <--> short       16位

Int32 <--> int          32位

Int64 <--> long        64位

无符号

Byte  <--> byte

UInt16 <--> ushort

UInt32 <--> uint

UInt64 <--> ulong

3. 浮点

单精度

Single  <--> float

双精度

Double <--> double

4. 布尔

Boolean  <--> bool

5. 枚举

Enum 类:为枚举提供基类

命名空间:   System

程序集 :   mscorlib.dll

原型定义:

[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible

可以看出 Enum 是class

在C# 中 System.Enum 的别名为 enum

常见属性和方法:

Parse(Type, String)        解析枚举值

TryParse<TEnum>(String, TEnum)

6. 一些常见的结构 struct

1. Char、Int16、Int32、Int64、Single 、Double 以及无符号版本

2. IntPtr 结构:用于表示指针或句柄的平台特定类型

常用构造器:

IntPtr(Int32)

IntPtr(Int64)

var intPtr1 = new  IntPtr(23222);
var intPtrZero = IntPtr.Zero; // 代表已初始化为零的指针或句柄

3. Guid 结构: 表示全局唯一标识符 (GUID)

常用构造器:

Guid(String)

常用属性和方法:

Guid.Empty        Guid 类的只读实例,其值保证均为零

Guid.NewGuid()  产生一个新Guid

Guid.Parse

Guid.TryParse

ToString

4. DateTime结构 : 表示时间上的一刻,通常以日期和当天的时间表示

System.DateTime 实例所表示的日期范围是在这两个日期之间:0001年1月1日午夜(一天开始之时)和9999年12月31日午夜

常用构造器

DateTime(int year,int month,int day)

DateTime(int year,int month,int day,int hour,int minute,int second)

常用静态属性

static DateTime Now {get;}

static DateTime Today{get;}     // 返回日期实例,时间部分设为零

static DateTime UtcNow{get;}

常用实例属性

DateTime Date{get;}             // 返回日期,时间部分设为0

DayOfWeek DoyWeek{get:}         // 返回 System.DayOfWeek 枚举值

int DayOfYear{get;}

int Year{get:}

int Month{get:}

int Day{get;}

int Hour{get;}

int Minute{get:}

日期运算

AddYears(int year)  // year 可为负 下面month day 之类类似

AddMonths(int month)

AddDays(int day)

AddHours(int hour)

AddMinutes(int minute)

AddSeconds(int second)

ToString 格式

常用格式 yyyy-MM-dd HH:mm:ss 其他格式参考MSDN

Parse方法与TryParse方法

代码如下  demo.cs

using System;class App
{static void Main(){      // 属性Console.WriteLine("当前时间是 {0}",DateTime.Now);Console.WriteLine("当前是 {0}",DateTime.Today);DateTime now = DateTime.Now;Console.WriteLine("Date {0}",now.Date);Console.WriteLine("Year {0}",now.Year);Console.WriteLine("Month {0}",now.Month);Console.WriteLine("Day {0}",now.Day);Console.WriteLine("Hour {0}",now.Hour);Console.WriteLine("Minute {0}",now.Minute);Console.WriteLine("Second {0}",now.Second);        Console.WriteLine("Day of Year {0}",now.DayOfYear);   Console.WriteLine("Day of Week {0}",now.DayOfWeek);  // 运算操作now = now.AddHours(2);// AddYears AddMonths AddDays AddMinutes AddSecondsConsole.WriteLine("Date {0}",now.ToString("yyyy-MM-dd HH:mm:ss"));// ParseDateTime dt1 = DateTime.Parse("2016-7-1 9:00");Console.WriteLine("Date {0}",dt1.ToString("yyyy-MM-dd HH:mm:ss"));// TryParseDateTime dt2 = DateTime.Now;DateTime.TryParse("2016-7-1 9:30",out dt2);Console.WriteLine("Date {0}",dt2.ToString("yyyy-MM-dd HH:mm:ss"));}
}

编译 csc demo.cs

运行

5. TimeSpan结构:表示一个时间间隔

6. Nullable<T> 结构:表示基础类型为值类型的对象,值类型与引用类型一样也可以分配 null

==2014-12-22 编辑==

新增一副 System 命名空间下的继承关系图

(这幅图有个不好的地方,简单类型的也是 Struct 类型,这图没画出来)

==2015-1-3 编辑==

1、新增枚举类型的基本操作

2、类型转换

3、运行时候值类型与引用类型的内存分布

4、值类型的装箱(boxed)和拆箱(unboxed)


枚举类型基本操作

using System;class App
{static void Main(){var e1 = (Person)1;    // 值强转枚举类型        Console.WriteLine("The Type of Person: {0}",typeof(Person));    // 原始枚举类型Console.WriteLine("Type :{0}\nItem :{1}\nValue:{2}",e1.GetType(),e1,(int)e1);        Console.WriteLine();var e2 = (Person)Enum.Parse(typeof(Person),"刘备");    // 从枚举项到枚举类型Console.WriteLine("Type :{0}\nItem :{1}\nValue:{2}",e2.GetType(),e2,(int)e2);        }enum Person{刘备=0,关羽=1,张飞=2}
}

效果:

类型转换

1、隐式转换(值类型、引用类型)

值类型:如整型 --> 浮点
引用类型: 子类替换父类

2、显式强转(值类型和引用类型均可)
(Type)Instance

3、as 和 is

as 仅用于引用类型以及可空类型,返回转换后的实例,如转换失败返回 null
对于可空类型 var instance = 1 as int?;
is 判断两个类型是否兼容(就是本类型,以及子类是父类等情况)

运行时候值类型与引用类型的内存分布

在程序运行的时候,值类型内存分布执行这段代码的线程的线程栈上引用类型内存分布在托管堆上

看一个 《CLR Via C# 》的例子

class App
{static void Main(){RefType r1 = new  RefType{X = 8};ValType v1 = new  ValType{X = 9};RefType r2 = r1;    // 传递的是引入也就是内存指针,如下图                r2.X = 5;    // r1的X也会变为5
        System.Console.WriteLine(r1.X);ValType v2 = v1;    // 拷贝的值,占用线程栈的空间v2.X = 5;System.Console.WriteLine(v1.X);    // v1 的值不会改变    仍然是9
    }
}// 值类型
struct ValType{public int X{get;set;}}// 引用类型
class RefType{public int X{get;set;}}

引用类型除了封装需要的值外,还有两个地方需要关注(类型对象指针和同步块索引)这是比引用类型多得地方

值类型的装箱(boxed)和拆箱(unboxed)

上面讲了值类型和引用类型在运行时的内存分布(值类型分布在线程栈上、引用类型分布在托管堆上)。

值类型到引用类型的过程叫装箱(boxed),这个过程是有编译器做的,它完成了以下工作:首先取出值类型(如上例说的结构ValType)中真正需要的字段和方法(上例中就是 public int X{get;set;}),然后建一个类把这些真正需要的东西塞到这个由编译器建立的类中,最后返回这个类的类型对象指针,以便你能访问到这块托管堆内存。

被装箱后的值类型类型到原本值类型的过程叫拆箱(unboxed),这个过程也是编译器完成的,过程和上面的过程大致相反:首先取出引用类型中真正需要的字段和方法,然后在线程栈上建立一个结构把这些真正需要的字段和方法塞到这个结构中,最后返回这个结构的名字,以便你能访问这个结构。

装箱和拆箱需要分配内存(这个过程比较耗时),频繁的装箱拆箱会降低程序的运行效率。

==2015-3-14 编辑==

现实中的值和引用 来之 C# In Depth

假定你在读一份非常棒的东西,希望一个朋友也去读它。为了避免被人投诉支持盗版,进一步假定它是公共领域中的一份文档。那么,需要为朋友提供什么才能让他读到文档呢?这完全取决于阅读的内容。

先假设你正在读的是一份真正的报纸。为了给你朋友一份,需要影印报纸的全部内容并交给他。届时,他将获得属于他自己的一份完整的报纸。在这种情况下,我们处理的是 值类型 的行为。所有信息都在你的手上,不需要从其他任何地方获得。制作了副本直呼,你的这份信息和朋友的那份都是各自独立的。可以在自己的报纸上添加一些注解,他的报纸根本不会改变。

再假设你正在读的是一个网页。与前一次相比,这一次,唯一的需要给你朋友的就是网页的URL。这是 引用类型 行为,URL代替引用。为了读到真正的文档,必须在浏览器中输入URL,并要求浏览器加载网页。另一方面,假如网页由某种原因发生了变化(如一个维基页面,你在上面添加了自己的注释),你和你的朋友再次通过浏览器载入页面时,都会看到这个变化。

未完

转载于:https://www.cnblogs.com/Aphasia/p/4156683.html

类库探源——System.ValueType相关推荐

  1. 类库探源——System.Exception

    一.MSDN描述 Exception 类: 表示在应用程序执行期间发生的错误 命名空间 : System 程序集:   mscorlib.dll 继承关系: 常用属性(含字段)和方法: 1. 属性 M ...

  2. 类库探源——System.String

    一.MSDN描述 String 类: 表示文本,即一系列的 Unicode 字符 命名空间 : System 程序集 : mscorlib.dll 继承关系: 备注: 1. 字符串是 Unicode ...

  3. 【类库】私房干货.Net数据层方法的封装

    [类库]私房干货.Net数据层方法的封装 作者:白宁超 时间:2016年3月5日22:51:47 摘要:继上篇<Oracle手边常用70则脚本知识汇总>文章的发表,引起很多朋友关注.便促使 ...

  4. ArcGIS Engine开发之旅02--ArcGIS Engine中的类库

    原文 ArcGIS Engine开发之旅02--ArcGIS Engine中的类库 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他 ...

  5. System.Int32是个啥?

    话说有一天你要用反射来对Target类进行操作,调用Foo函数. public class Target ...{ public void Foo(int x, int y, int z) ...{ ...

  6. 根据自己平时的经验写的针对SQLSERVER操作的通用类库

    根据自己平时的经验写的针对SQLSERVER操作的通用类库   1using System;   2using System.Data;   3using System.Data.SqlClient; ...

  7. C#-概念-基础类库:基础类库

    ylbtech-C#-概念-基础类库:基础类库 基础类库 (BCL) 是微软所提出的一组标准库可提供.NET Framework所有语言使用. 随着 Windows 以及 .NET Framework ...

  8. C#/.NET BCL:基础类库

    基础类库(BCL)是微软所提出的一组标准库,可提供给 .NET Framework 所有语言使用. 随着 Windows 以及 .NET Framework 的成长,BCL 已近乎成为在 .NET 上 ...

  9. C#中object的使用

    转自:http://www.hackvip.com/article/sort0129/sort0143/Hackvip_233655.html C#中system.object的函数方法功能介绍 在C ...

最新文章

  1. git gui fetch不到文件_Git内部原理剖析,有比这还详细的吗?
  2. Centos下源码安装golang
  3. idea 设置java内存_java相关:IntelliJ IDEA设置显示内存指示器和设置内存大小的方法...
  4. 电脑打字手指正确姿势_正确的投篮姿势教学,许多人都忽略的细节,学会变投篮神射手...
  5. BZOJ-1036 [ZJOI2008]树的统计
  6. sim7020c功耗_SIM7020C物联网NB-IOT模块 simcom代理
  7. 编写模块时的声明(含MODULE_LICENSE等)
  8. 帆软报表(FineReport) 的初步学习和使用
  9. 闭合导线计算软件excel_测量坐标计算程序 V6
  10. Acer 4750 安装黑苹果_10代酷睿手把手安装黑苹果
  11. OPNsense用户手册-Netflow导出和分析
  12. 关于pip下载很慢很慢
  13. 如何使TOOLBOX变成中文名称
  14. Excel中最精确的计算年龄的公式
  15. hmc如何进入aix系统_hmc操作手册.doc
  16. Linux系统无法启动问题及解决方案(/etc/fstab文件损坏,GRUB文件损坏)
  17. iOS 动态改变应用图标
  18. 中兴通讯三位元老级副总裁辞职 或与违规有关
  19. ac3165 linux驱动_为什么Linux系统没有类似Windows上的还原精灵和影子系统?
  20. 小米手环能不能用计算机,DIY变废为宝 小米手环变身能刷公交卡的手环 (全文)...

热门文章

  1. mysql查看是否开启定时器_Mysql 查看定时器 打开定时器 设置定时器时间
  2. mysql主主 主键冲突_mysql主从复制原理,主主复制时主键冲突解决
  3. lottie动画_Lottie内存泄漏问题的定位与分析
  4. 字符串相乘Python解法
  5. java写soap客户端_Java:简单的SOAP客户端
  6. hadoop 部分问题
  7. linux通过字符串查看,linux命令strings有什么用?查找二进制文件可打印字符串。...
  8. 多设备同步表数据_利用Excel数据透视表解决两份报表数据不同步问题
  9. linux部署项目文档,Linux上部署综合项目专业资料.doc
  10. mysql navicat 函数_Navicat for MySQL 函数高级属性讲解