`
raozhiyong11
  • 浏览: 139035 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论

浅谈C#中数据类型转换

    博客分类:
  • C#
阅读更多
类型转换
显示转换
隐式转换
用户自定义转换

(1)
隐式转换:一般是低类型向高类型转化,能够保证值不发生变化。
隐式数值转换:
sbyte 到 short、int、long、float、double 或 decimal。
byte 到 short、ushort、int、uint、long、ulong、float double 或 decimal。
short 到 int、long、float、double 或 decimal。
ushort 到 int、uint、long、ulong、float、double 或 decimal。
int 到 long、float、double 或 decimal。
uint 到 long、ulong、float、double 或 decimal。
long 到 float、double 或 decimal。
ulong 到 float、double 或 decimal。
char 到 ushort、int、uint、long、ulong、float、double 或 decimal。
float 到 double。
不存在向 char 类型的隐式转换,因此其它整型的值不会自动转换为 char 类型。
浮点型不能隐式地转化为decimal型

隐式枚举转换
隐式枚举转换允许将十进制整数 0 转换为任何枚举类型。

隐式引用转换
派生类向基类转换
隐式引用转换是指一类引用类型之间的转换,这种转换总是可以成功,因此不需要在运行时进行任何检查。

装箱转换
装箱转换允许将值类型隐式转换为引用类型。

(2) 显示转换:也称强制类型转换。不能保证数据的正确性。
(type)(表达式)

(3) 用户自定义转换
所有的用户自定义转换都是静态的,要使用static关键字
用户自定义转换分显示和隐示,它们用implicit(隐式转换)或 explicit(显示转换)关键字声明。
static 访问修辞符 转换修辞符 operator 转换类型(参数)

示例:

using System;
struct Number
{
private int value;
public Number(int value)
{
this.value = value;
}
//用户自定义整型到Number型的隐式转换
static public implicit operator Number(int value)
{
return new Number(value);
}
// 用户自定义从Number型到整型的显示转换
static public explicit operator int(Number n)
{
return n.value;
}
//用户自定义从Number类型到string类型的隐式转换
static public implicit operator string(Number n)
{
return n.ToString();
}
}

class Test
{
static public void <?xml:namespace prefix = st1 /><place><span lang="EN-US">Main</span></place>()
{
Number n;
n= 10;
Console.WriteLine((int)n);
//隐式转换到string
Console.WriteLine(n);
}
}

使用System.Convert

将一个基本数据类型转换为另一个基本数据类型。

使用Parse方法

大部份预定义值类型都有这个静态方法,用来将相应的文本转化为相应的值类型。

装箱和取消装箱

装箱取消装箱使值类型能够与 object 类型相互转换。

装箱转换允许将值类型隐式转换为引用类型。将值类型的值装箱的操作包括:分配一个对象实例值类型的值复制到该实例中

示例:

此例将整数变量 i 通过装箱转换为对象 o。此例显示对象保留了内容的原始副本,即 123

using System;
class TestBoxing
{
public static void <place><span lang="EN-US">Main</span></place>()
{
int i = 123;
object o = i; // 隐式的装箱
i = 456; // 改变变量i的值
Console.WriteLine("The value-type value = {0}", i); //456
Console.WriteLine("The object-type value = {0}", o); //123 i的复制值
}
}
取消装箱转换:取消装箱转换允许将引用类型显式转换为值类型。

取消装箱操作包括以下两个步骤:首先检查该对象实例是否是某个给定的值类型的装了箱的值,然后将值从实例中复制出来。
示例:

下面的示例阐释无效取消装箱的情况,即错误的取消装箱如何导致 InvalidCastException。通过使用 try catch,发生错误时会显示错误信息。
using System;
public class UnboxingTest
{
public static void <place><span lang="EN-US">Main</span></place>()
{
int intI = 123;
object o = intI; //装箱
try
{
int intJ = (short) o; //取消装箱无效,short不是装了箱的值类型. 检查该对象实例是否是某个给定的值类型的装了箱的值
Console.WriteLine("Unboxing OK.");
}
catch (InvalidCastException e)
{
Console.WriteLine("{0} Error: Incorrect unboxing.",e);
}
}
}

其它转换用运算符
as

as 运算符用于执行引用类型的显式类型转换。 如果要转换的类型与指定类型兼容,转换就会成功;如果类型不兼容,则返回null
表达式as 类型
as 运算符类似于类型转换,所不同的是,当转换失败时,as 运算符将返回null,而不是引发异常。
示例:
object o1=”SomeString”;
object o2=5;
string s1=o1 as string; //类型兼容 s1=”SomeString”
string s2=o2 as string; //s2=null

is

is 运算符用于检查对象的类型是否与给定类型兼容(对象是该类型,或是派生于该类型)
表达式 is 类型
示例:
int i=10;
if ( i is object) //true
{}

sizeof

sizeof 运算符用于获得值类型的大小(以字节为单位)。
sizeof(type)
sizeof 运算符仅适用于值类型,而不适用于引用类型。
sizeof 运算符仅可用于 unsafe 模式。
示例:
unsafe
{
Console.WriteLine(“{0}”,sizeof(int));
}

分享到:
评论

相关推荐

    浅谈c# 泛型类的应用

    C#中的泛型类是编程中的一个重要概念,它允许我们创建可以处理多种数据类型的类,提高了代码的重用性和效率。下面将详细讲解泛型类的各个方面。 1. **泛型类的基本应用** 泛型类的核心在于类型参数,这使得类能够...

    浅谈C#中的值类型和引用类型

    在C#编程语言中,值类型和引用类型是两种主要的数据类型,它们在内存管理和操作方式上有显著区别。值类型包括简单类型(如int、bool、char等)、枚举和结构(struct),它们的变量直接存储实际数据。当对值类型进行...

    浅谈西门子Prodave6.0在C#中的应用

    **注意**:在使用`DllImport`时,需要注意C++的数据类型与C#之间的对应关系,选择正确的类型进行转换。例如,C++中的`char*`类型可以用C#中的`string`来代替,而指针类型可以用`ref`或数组的形式在C#中表示。 #### ...

    浅谈C#各种数组直接的数据复制/转换

    之前做Opengl程序,用的的C#的SharpGL这个库,里面有...然后我就被逼着学习了各种float[] 转 int[] 的方法,比较他们的效率(其实我还是感觉c++比较快,一个指针类型转换,欧啦) 下面是我写的各种数组赋值转换的方法

    浅谈C#中ToString()和Convert.ToString()的区别

    在C#编程中,`ToString()`和`Convert.ToString()`都是将非字符串类型转换为字符串的常见方法,但它们之间存在一些关键的区别。首先,我们来详细了解这两种方法。 `ToString()`方法是C#中的一个基础方法,它继承自`...

    浅谈C#中List&lt;T&gt;对象的深度拷贝问题

    在C#编程中,深度拷贝是一个重要的概念,尤其是在处理复杂数据结构时。深度拷贝是指创建一个新对象,不仅复制原始对象的属性,还复制了嵌套对象的引用,确保新旧对象之间的独立性。本文将探讨C#中List对象的深度拷贝...

    浅谈C# 序列化与反序列化几种格式的转换

    在C#编程中,序列化和反序列化是两个重要的概念,它们主要用于数据持久化和网络传输。序列化是将对象的状态转化为可存储或可传输的格式,而反序列化则是将这种格式恢复为原来的对象状态。在C#中,有多种格式可以用于...

    浅谈C#泛型的用处与特点

    在传统的非泛型编程中,例如上面提到的`Stack`类,如果需要处理不同的数据类型,通常会为每种类型创建一个单独的类,或者使用`object`类型作为通用容器。使用`object`类型虽然提供了灵活性,但存在装箱和拆箱操作,...

    C#编程知识点总结11-20C#编程知识点总结

    在C#编程中,掌握各种核心概念和技术...以上就是从给定的文件名中提取出的C#编程相关知识点,涵盖了常量、字符串操作、数据类型转换、文件处理、参数传递等多个方面。理解和掌握这些知识点对于提升C#编程能力至关重要。

    浅谈C#.NET、JavaScript和JSON

    JSON支持的数据类型包括: - 数字(整数或浮点数) - 字符串(在双引号内) - 布尔值(True或False) - 数组(在方括号内) - 对象(在大括号内) - NULL JSON数据的表现形式多样,可以是单一对象、对象集合(数组...

    C# 中的??操作符浅谈

    可空类型是C#特有的一种数据类型,允许变量的值为null,比如`int?`就是一个可空的整型变量。以下是一个典型的使用场景: ```csharp int? i = null; int j = i ?? 0; // 如果 i 不是 null,初始化 j 为 i 的值;否则...

    JSON浅谈-2

    以上提到的数据结构和数据类型使得JSON成为一种非常灵活和强大的数据交换格式。它支持嵌套数据结构,允许复杂的数据表示和简单的文本序列化。因其简洁性和易用性,JSON在Web开发、移动应用开发、后端服务以及其他...

    浅谈byte和长度为8的boolean数组互相转换

    在Java编程语言中,`byte`类型是一种基本的数据类型,它占用8位,可以表示-128到127之间的整数值。另一方面,`boolean`类型用于存储布尔值,即`true`或`false`,它不占任何固定位数,但在实际内存分配时通常与一个...

    dxf文件转化成G代码

    通过对这些数据进行转换处理,系统能够将其转化为符合数控系统要求的加工指令,进而生成计算机自动传输所需的G代码格式。 #### 自动编程系统架构 该系统主要包括五个模块:图形数据输入、加工工艺设计、NC加工代码...

    C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    然而,需要注意的是,`ICloneable`接口并未规定返回值类型,因此在使用时需要显式类型转换。此外,`Clone()`方法默认执行的是浅拷贝,即只复制对象的引用,如果对象中包含复杂的数据结构(如数组或其它对象),则...

    浅谈Visual C#进行图像处理(读取、保存以及对像素的访问)

    在Visual C#中进行图像处理是一项常见的任务,涵盖了读取、保存图像以及对像素的访问。这篇文章主要针对初学者,简单介绍了如何使用C#完成这些基本操作。 首先,读取图像。在C#中,我们可以利用`PictureBox`控件...

    浅谈基于Microsoft SQL Server2005 ASP.NET 3.5动态网站数据存储与管理的研究.pdf

    文件流读取部分,演示了如何从上传的文件中读取数据,并将其转换成字节数组。这个过程涉及到.NET框架中的System.IO命名空间下的Stream类,通过调用file.PostedFile.InputStream读取上传的文件流,然后再通过Read方法...

    C#面向对象设计模式纵横谈(5)

    然而,`ICloneable`接口的`Clone`方法返回的是`object`类型,因此在实际使用时,我们需要进行类型转换,这可能会导致类型安全问题。为了解决这个问题,我们通常会自定义一个更具体的克隆方法,返回类的实例。 原型...

    浅谈LISP的二次开发在CAD中的应用.pdf

    LISP语言具有弱类型、动态推断的特点,其代码由各种列表组成,每个表项可以存储不同类型的数据,例如数字、函数、符号或子列表等。LISP的核心操作符很少,只有quote、atom、eq、car、cdr、cons、cond这七个操作符,...

Global site tag (gtag.js) - Google Analytics