1, 什么是转换?
答:转换是接受一个类型的值并使用它作为另一个类型的等价值的过程。
2, 隐式转换?
语言(C#)会自动做这些转换,并且转换不会丢失数据或精度,这叫隐式转换。
例如,将8位的值转换为16位的值。
3, 显式转换(或称强制转换)?
对于语言不提供自动转换的,如果仍要将源类型转换为目标类型的,就叫显式转换。
隐式转换时丢失数据或精度由程序负责,显式转换时丢失数据或精度由程序员负责。
例如:
class Program
{
static voidMain(string[] args)
{
ushort sh = 10;
byte sb = (byte)sh; //顯式轉換
Console.WriteLine("sb={0},此時數據沒有丟失。",sb);
sh = 1365;
sb = (byte)sh;//顯式轉換
Console.WriteLine("sb={0},此時數據丟失了。",sb);
Console.ReadKey();
}
}
程序输出结果为:
4, 转换的类型?
如下图所示:
5, 数字的转换?
1> 隐式数字转换:
占据较少位的数字类型可以隐式转换为占据较多位的数字类型。
2> 显示数字转换:
例如:
class Program
{
static voidMain(string[] args)
{
ushort sh = 2000;
byte sb;
sb = unchecked((byte)sh); //unchecked運算符,不檢測溢出,大多數重要的位丟失了。
Console.WriteLine("sb={0}",sb);
Console.ReadKey();
sb = checked((byte)sh); //checked運算符,檢測溢出,拋出OverflowException異常。
Console.WriteLine("sb={0}", sb);
Console.ReadKey();
}
}
6, 引用转换?
引用转换接受源引用并返回一个指向堆中同一位置的引用,但是把引用“标记”为其它类型。
例如:
class A { public int Field1;}
class B : A { public int Field2; }
class Program
{
static voidMain(string[] args)
{
B myVar1 = new B();
A myVar2 = (A)myVar1; //強制轉換,作業A類的引用返回myVar1的引用。
Console.WriteLine("{0}",myVar2.Field1); //正確
Console.ReadKey();
Console.WriteLine("{0}",myVar2.Field2); //編譯錯誤,因為Field2對于myVar2不可見。
}
}
7, 装箱(Boxing)?
定义:装箱是一种接受值类型的值,根据这个值在堆上创建一个完整的引用类型对象 并返回对象引用的隐式转换。
例如:
class Program
{
static voidMain(string[] args)
{
int i = 10; //創建并初始化值類型。
object oi = i; //創建并初始化引用類型(使用裝箱后變量i的副本進行初始化)。
Console.WriteLine("i={0},oi={1}",i,oi);
//演示了i和oi是如何被獨立操作的。
i = 12;
oi = 15;
Console.WriteLine("i={0},oi={1}", i, oi);
Console.ReadKey();
}
}
程序输出结果为:
程序在内存中的布局如下图所示:
8, 拆箱(unboxing)?
定义:拆箱就是把装箱后的对象转换回值类型的过程。
需要注意的有以下几点:
1> 拆箱是显式转换。
2> 尝试拆箱一个值为非原始类型时会抛出一个InvalidCastException异常。
例如:
class Program
{
static voidMain(string[] args)
{
int i = 10; //创建并初始化值类型。
object oi = i; //装箱i并把引用赋值给oi.
int j = (int)oi; //拆箱并把值赋值给j.
Console.WriteLine("i={0},oi={1},j={2}",i,oi,j);
Console.ReadKey();
}
}
程序输出结果为:
9, 用户自定义转换?
除了标准转换外,我们还可以为类或结构定义隐式和显式转换,这叫用户自定义转换。
需要注意以下几点:
1> 除了implicit和explicit关键词之外,隐式和显式转换的声明语法是一样的。
2> 需要public和static修饰符。
例如:
class Program
{
static voidMain(string[] args)
{
Person bill = new Person("bill",25); //实例化对象。
int age = bill; //将Person对象转换为int。
Console.WriteLine("Person Info:{0},{1}",bill.Name,age);
Person anon = 35; //将int转换为Person对象。
Console.WriteLine("Person Info:{0},{1}", anon.Name, anon.Age);
Console.ReadKey();
}
}
class Person
{
public string Name; //声明变量。
public int Age;
public Person(string name, int age) //构造函数,初始化变量。
{
Name = name;
Age = age;
}
public static implicit operator int(Person p)//将Person转换为int。
{
return p.Age;
}
public static implicit operator Person(int i)//将int转换为Person。
{
return new Person("Nemo",i);
}
}
程序输出结果为:
关于转换,今天先写到这儿了,欢迎各位园友拍砖,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架