C#装箱和拆箱是C#中的一个重要概念,它是指将值类型转换为引用类型,或者将引用类型转换为值类型。装箱是将一个值类型的变量转换成一个对象,而拆箱则是将一个对象转换成一个值类型的变量。
装箱是在运行时执行的,它会创建一个新的对象,并将原始变量的内容复制到新对象中。这样就可以使用引用来引用原始变量。装箱有助于在不同数据结构之间传递数据,例如从数字列表传递数字到字典中。
而拆箱则是相反的过程:它将引用对象中保存的内容复制回原始变量中。这样就可以使用原始变量来引用该对象。此外,如果要在不向上转型的情况下使用特定方法或字段(例如int.Parse()方法),也需要使用此过程。
// 装箱 int i = 123; object o = i; // 拆箱 int j = (int)o;
object
或 System.Object
是所有类型的最终基类。
任何类型都可以upcast到对象。
以下代码创建一个类Stack以提供First-In-Last_Out数据结构。
public class Stack { int position; object[] data = new object[10]; public void Push (object obj) { data[position++] = obj; } public object Pop() { return data[--position]; } }
因为Stack使用对象类型,我们可以推送和弹出任何类型到和从堆栈。
Stack stack = new Stack(); stack.Push ("CSS"); string s = (string) stack.Pop(); // Downcast, so explicit cast is needed Console.WriteLine (s);
在值类型和对象之间进行转换时,CLR必须执行装箱和取消装箱的过程。
装箱是将值类型实例转换为引用类型实例。
引用类型可以是对象类或接口。
int x = 1; object obj = x; // Box the int
拆装箱会将操作转换为原始值类型,从而反转操作:
int y = (int)obj; // Unbox the int
拆箱需要显式强制转换。
例如,以下引发异常,因为long不完全匹配int:
object obj = 1; // 1 is inferred to be of type int long x = (long) obj; // InvalidCastException
以下代码执行取消装箱和强制转换:
object obj = 9; long x = (int) obj;
C#枚举枚举是一种特殊的值类型,是指定的数字常量组。例子例如:public enum Direction { Left, Right, Top, Bottom } 我们可以...
C#条件运算符和||运算符测试与和或条件。!运算符表示不。以下代码使用and,not和or运算符创建布尔表达式。!cloudy(WeekDay || ...
C# if switchif语句语法对于使用过程语言进行任何编程的任何人都应该是非常直观的:if (condition)statement(s) elsestatement(s...