类库探源——System.ValueType
一、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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 去掉标题栏、状态栏、横屏
- 下一篇: [转] 最近点对距离问题