C#中的结构与类

本文详细对比了C#中的结构(struct)与类(class)之间的关键差异,包括它们的存储方式、可继承性、初始化特点及多态实现等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C# Corner今天发表了Bechir Bejaoui的一篇文章《What really make difference between structures and classes?》。关于结构和类的区别其实是老生常谈,不过本文总结得较为全面,所以翻译过来给大家共享。

  总结起来,两者共有如下区别:

  1、结构是值类型,类则是引用类型。因此前者是放在栈(Stack)里,后者则仅仅是将引用地址存放在栈里,而具体的值则存放在堆(heap)里。如下图所示:

  2、据第1点可以得出结论,那就是类对象通常用来传递大数据,而结构对象则用来传递小数据。

  3、类可以被继承,而结构则不支持。

  4、结构对象不能像类对象一样赋值为null。

  5、结构不能像类一样定义析构器。

  6、结构不能像类一样定义为抽象的。

  7、在结构中不能重写方法,除非是object类型的如下方法:

  Equals()

  GetHashCode()

  GetType()

  ToString()

  若要让结构具有多态特性,可以让其实现接口。

  8、在类中定义的事件是线程安全的,而结构则不是。

  9、结构总是具有一个默认的公共无参构造函数,但却不能像类一样定义私有的无参构造函数(结构也不能再定义公共的无参构造函数,这与类不相同):

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct Me
 
{
 
    private Me() // compile-time error
 
    {
 
    }
 
}
 
  
 
class Me
 
{
 
    private Me() // runs Ok{
 
}

 

  10、类中的静态构造函数会被调用,而结构却不能。因此在结构中定义的静态构造函数,虽然可以编译通过,但却没有价值:

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
struct myStructure
 
{
 
    static myStructure()
 
    {
 
        Console.WriteLine( "This is me a structure" );
 
     }
 
}
 
class myClass
 
    static myClass()
 
    {
 
        Console.WriteLine( "This is me a class" );
 
    }
 
}
class Program
 
{
 
    static void Main( string [] args)
 
    {
 
       myStructure s = new myStructure(); //Nothing happen
 
       myClass c = new myClass(); //Will out put This is me a class
 
       Console.Read();
 
    }
 
}

 

  11、结构不能像类一样定义volatile字段。volatile字段主要用于并发,它相当于方法体的lock。

  12、可以对结构类型使用sizeof,对类则不行。

  13、类的字段会被自动初始化为0/false/null,而结构则不能。

  14、在结构中不能直接对字段初始化,而类则可以。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct myStructure
 
{
 
    public string x = 2; //Not allowed
 
}
 
class myClass
 
{
 
    public string x = 2; //Allowed
 
}

 

  15、结构和类对于System.Object.Equals()方法的体现是不相同的。例如定义这样的结构和类:

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct StructurePerson
 
{
 
     public string FirstName;
 
    public string LastName;
 
}
 
class ClassPerson
 
{
 
    public string FirstName;
 
    public string LastName;
 
}

 

  如果运行如下的代码:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class Program
 
{
 
    static void Main( string [] args)
 
    {
 
        StructurePerson strX = new StructurePerson();
 
        strX.LastName = "Bejaoui" ;
 
        strX.FirstName = "Bechir" ;
 
        StructurePerson strY = new StructurePerson();
 
        strY.LastName = "Bejaoui" ;
 
        strY.FirstName = "Bechir" ;
 
        if (strX.Equals(strY))
 
        {
 
            Console.WriteLine( "strX = strY" );
 
        }
 
        else
 
        {
 
            Console.WriteLine( "strX != strY" );
 
        } //This code displays strX = strY
 
        ClassPerson clsX = new ClassPerson();
 
        clsX.LastName = "Bejaoui" ;
 
        clsX.FirstName = "Bechir" ;
 
        ClassPerson clsY = new ClassPerson();
 
        clsY.LastName = "Bejaoui" ;
 
        clsY.FirstName = "Bechir" ;
 
        if (clsX.Equals(clsY))
 
        {
 
            Console.WriteLine( "clsX = clsY" );
 
        }
 
        else
 
        {
 
            Console.WriteLine( "clsX != clsY" );
 
        } //This code displays clsX != clsY
 
        Console.Read();
 
    }
 
}

转载于:https://www.cnblogs.com/nearby/archive/2012/03/15/2398070.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值