学习笔记二-----数据类型
来源:互联网 发布:部落冲突 知乎 编辑:程序博客网 时间:2024/05/01 09:03
学习笔记二---数据类型:来自微软msdn
1.数据类型(C# 编程指南)
C# 是强类型语言;因此每个变量和对象都必须具有声明类型。
数据类型概述
数据类型可描述为:
· 内置数据类型,如 int 或 char,
· 用户定义数据类型,如 class 或 interface。
· 数据类型还可以定义为:
· 值类型(C# 参考)(用于存储值),
· 引用类型(C# 参考)(用于存储对实际数据的引用)。
2.强制转换(C# 编程指南)
数据类型之间的转换可以使用强制转换显式进行,但在某些情况下,也允许隐式转换。
C#
static void TestCasting()
{
int i = 10;
float f = 0;
f = i; // An implicit conversion, no data will be lost.
f =
i = (int)f; // An explicit conversion. Information will be lost.
}
显式强制转换调用转换运算符,从一种类型转换为另一种类型。如果未定义相应的转换运算符,则强制转换会失败。可以编写自定义转换运算符,在用户定义类型之间进行转换。有关定义转换运算符的更多信息,请参见 explicit(C# 参考)和 implicit(C# 参考)。
示例
下面的程序将 double 强制转换为 int。如不强制转换则该程序不会进行编译。
C#
class Test
{
static void
{
double x = 1234.7;
int a;
a = (int)x; // cast double to int
System.Console.WriteLine(a);
}
}
输出
1234
3装箱和取消装箱(C# 编程指南)
装箱和取消装箱使值类型能够被视为对象。对值类型装箱将把该值类型打包到 Object 引用类型的一个实例中。这使得值类型可以存储于垃圾回收堆中。取消装箱将从对象中提取值类型。
在此示例中,整型变量 i 被“装箱”并赋值给对象 o。
C#
int i = 123;
object o = (object)i; // boxing
然后,可以对对象 o 取消装箱并将其赋值给整型变量 i:
C#
o = 123;
i = (int)o; // unboxing
性能
相对于简单的赋值而言,装箱和取消装箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个全新的对象。次之,取消装箱所需的强制转换也需要进行大量的计算。
4.装箱转换(C# 编程指南)
装箱用于在垃圾回收堆中存储值类型。装箱是值类型(C# 参考)到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。
请看以下值类型变量的声明:
C#
int i = 123;
以下语句对变量 i 隐式应用装箱操作:
C#
object o = i; // implicit boxing
此语句的结果是在堆栈上创建对象引用 o,而在堆上则引用 int 类型的值。该值是赋给变量 i 的值类型值的一个副本。下图说明了两个变量 i 和 o 之间的差异。
装箱转换
还可以像下面的示例一样显式执行装箱,不过显式装箱从来不是必需的:
C#
int i = 123;
object o = (object)i; // explicit boxing
示例
此示例通过装箱将整数变量 i 转换为对象 o。这样,存储在变量 i 中的值就从 123 更改为 456。该示例表明原始值类型和装箱的对象使用不同的内存位置,因此能够存储不同的值。
C#
class TestBoxing
{
static void
{
int i = 123;
object o = i; // implicit boxing
i = 456; // change the contents of i
System.Console.WriteLine("The value-type value = {0}", i);
System.Console.WriteLine("The object-type value = {0}", o);
}
}
输出
The value-type value = 456
The object-type value = 123
5取消装箱转换(C# 编程指南)
取消装箱是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。
取消装箱操作包括:
· 检查对象实例,确保它是给定值类型的一个装箱值。
· 将该值从实例复制到值类型变量中。
以下语句同时说明了装箱和取消装箱操作:
C#
int i = 123; // a value type
object o = i; // boxing
int j = (int)o; // unboxing
下图显示了以上语句的结果。
取消装箱转换
要在运行时成功取消装箱值类型,被取消装箱的项必须是对一个对象的引用,该对象是先前通过装箱该值类型的实例创建的。尝试对 null 或对不兼容值类型的引用进行取消装箱操作,将导致 InvalidCastException。
示例
下面的示例演示无效的取消装箱及引发的 InvalidCastException。使用 try 和 catch,在发生错误时显示错误信息。
C#
class TestUnboxing
{
static void
{
int i = 123;
object o = i; // implicit boxing
try
{
int j = (short)o; // attempt to unbox
System.Console.WriteLine("Unboxing OK.");
}
catch (System.InvalidCastException e)
{
System.Console.WriteLine("{0} Error: Incorrect unboxing.", e.Message);
}
}
}
输出
Specified cast is not valid. Error: Incorrect unboxing.
如果将下列语句:
int j = (short) o;
更改为:
int j = (int) o;
将执行转换,并将得到以下输出:
Unboxing OK.
- 学习笔记二-----数据类型
- python学习笔记二数据类型
- c++学习笔记(二):数据类型
- Kotlin学习笔记二(数据类型)
- java学习笔记(二) ----基本数据类型应用
- java学习笔记(二) ----基本数据类型应用
- 二 redis学习笔记之数据类型
- Delphi学习笔记二——数据类型
- Delphi学习笔记二——数据类型
- redis学习笔记二之数据类型
- redis学习笔记二之数据类型
- 二 redis学习笔记之数据类型
- java学习笔记(二)--java数据类型
- JavaScript学习笔记之二基本数据类型
- 【python学习笔记二】基本数据类型
- Redis学习笔记(二)--数据类型
- Redis学习笔记二、String数据类型
- JAVA学习笔记二之(4)数据类型
- 回答Visual Studio 2005 无法更新Access的问题
- 美国强悍女子近距离抓拍撼人巨型龙卷风(图)
- C#操作Excel(导入导出)
- 关于Struts上传文件的验证
- 各种主流开源ESB产品简介
- 学习笔记二-----数据类型
- Passing by reference or by value? it is a question
- Top Ten Errors Java Programmers Make
- 网站创业项目商业计划书的写法
- (转)一个完美网站的SEO潜规则
- 英国百头绵羊围成“麦田怪圈” 持续10分钟
- LFS 6.2碰到解决的几个小问题
- IE与FireFox应用javascript的区别
- [转]大道至简-java之23种模式一点就通