现在的位置: 首页 > 综合 > 正文

简单介绍操作符typeof和sizeof

2013年06月07日 ⁄ 综合 ⁄ 共 2758字 ⁄ 字号 评论关闭

1.typeof

请看代码:

using System;
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

using System;

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

那么我们想要测试自己定义的值类型(比如说结构)呢?

请看如下代码:

using System;

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#  技术解密》

 

 

抱歉!评论已关闭.