1.typeof
请看代码:
using System.Reflection;
class Person
{
private string name;
public string Name
{
set
{
name= value;
}
get
{
return name;
}
}
public void hello()
{
Console.WriteLine("Hello");
}
}
class Test
{
static void Main()
{
Type t = typeof(Person);
Console.WriteLine(t.ToString());
Console.WriteLine("------------------------");
MethodInfo[] m = t.GetMethods();
foreach(MethodInfo me in m)
{
Console.WriteLine(me.ToString());
}
Console.WriteLine("------------------------");
foreach(MemberInfo mem in t.GetMembers())
{
Console.WriteLine(mem);
}
Console.ReadLine();
}
}
typeof一般用在反射里,这里例子使用反射分别获得一个自定义类型的名字,方法和所有成员。比较简单,就不多解释了。
2.sizeof
class SomeClass
{
//注意:使用sizeof操作符必须把代码标记为unsafe
static unsafe public void ShowSizes()
{
Console.WriteLine("\n一些基本类型的大小");
Console.WriteLine("sizeof short = {0}",sizeof(short));
Console.WriteLine("sizeof int = {0}",sizeof(int));
Console.WriteLine("sizeof long = {0}",sizeof(long));
Console.WriteLine("sizeof bool = {0}",sizeof(bool));
}
}
class SizeTest
{
unsafe public static void Main()
{
SomeClass.ShowSizes();
Console.ReadLine();
}
}
要使用sizeof操作符,就必须把代码标记为unsafe,编译的时候,开启unsafe开关。
程序结果为:
一些基本类型的大小
sizeof short = 2
sizeof int = 4
sizeof long = 8
sizeof bool = 1
那么我们想要测试自己定义的值类型(比如说结构)呢?
请看如下代码:
struct StructWithNoMembers
{
}
struct StructWithMembers
{
short s;
int i;
long l;
bool b;
}
struct CompositeStruct
{
StructWithNoMembers a;
StructWithMembers b;
}
class SizeOfMyStruct
{
unsafe public static void Main(string[] args)
{
Console.WriteLine("sizeof StructWithNoMembers structure = {0}",sizeof(StructWithNoMembers));
Console.WriteLine("sizeof StructWithMembers structure = {0}",sizeof(StructWithMembers));
Console.WriteLine("sizeof CompositeStruct structure = {0}",sizeof(CompositeStruct));
Console.ReadLine();
}
}
如果不编译,你会认为输出什么?你大概会认为,第一个结构没有成员,那就是0,第二个结构是15(你可以看上一个例子里输出的数值),第三个结构是0+15=15。
很可惜,你错了。
输出结果为:
sizeof StructWithNoMembers structure = 1
sizeof StructWithMembers structure = 16
sizeof CompositeStruct structure = 20
为什么会这样呢?这是由填充和结构对齐造成的,这与编译器在输出文件的映像中如何布置结构有关。例如,如果一个结构有3个字节长,而字节对齐会被设置成4字节,那么编译器自动填充一个额外的字节,sizeof报告这个结构有4字节。
/* 说明:原书《Inside C# 2rd》在说明的时候有误,因为它的例子里是这样的:
struct CompositeStruct
{
StructWithNoMembers a;
StructWithMembers b;
StructWithNoMembers c;
}
而在后面的说明中却以
struct CompositeStruct
{
StructWithNoMembers a;
StructWithMembers b;
}
说明的。而输出结果却又是
struct CompositeStruct
{
StructWithNoMembers a;
StructWithMembers b;
StructWithNoMembers c;
}
的结果。不过没有大碍,大家看书的时候注意一下吧。
此文参考:《C# 技术解密》