C#学习之结构

==========================================================================

结构是使用 struct 关键字定义的,例如:C# 

public struct PostalAddress { //Fields, properties, methods and events go here... }

结构与类共享大多数相同的语法,但结构比类受到的限制更多:

1.在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。

2.结构不能声明默认构造函数(没有参数的构造函数)或析构函数。

3.结构可以声明带参数的构造函数。

4.结构不能从类或其他结构继承。

5.结构在赋值时进行复制。将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。

6.结构是值类型,而类是引用类型。

7.与类不同,结构的实例化可以不使用 new 运算符。

8.一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自System.ValueType,后者继承自 System.Object。

9.结构可以实现接口。

===============================================================

类和结构是 .NETFramework 中的通用类型系统的两种基本构造。两者在本质上都属于数据结构,封装着一组整体作为一个逻辑单位的数据和行为。数据和行为是该类或结构的“成员”,它们包含各自的方法、属性和事件等(本主题后面列出了这些内容)。

类或结构的声明类似于蓝图,用于在运行时创建实例或对象。如果定义一个名为Person的类或结构,则 Person为类型名称。如果声明并初始化 Person类型的变量 p,则 p 称为Person的对象或实例。可以创建同一 Person类型的多个实例,每个实例在其属性和字段中具有不同的值。

类是一种引用类型。创建类的对象时,对象赋值到的变量只保存对该内存的引用。将对象引用赋给新变量时,新变量引用的是原始对象。通过一个变量做出的更改将反映在另一个变量中,因为两者引用同一数据。

结构是一种值类型。创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构。因此,新变量和原始变量包含同一数据的两个不同的副本。对一个副本的更改不影响另一个副本。

类通常用于对较为复杂的行为建模,或对要在创建类对象后进行修改的数据建模。结构最适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主。

值类型:

基本数据类型 + 枚举、结构

引用类型:

类、接口、委托、string、数组

=============================结构、类的相同点与不同点===========================================================

类的优点在于它可以作为引用类型:与将结构变量与它的所有数据一起传递相比,传递引用更有效。但是,结构不要求在全局堆中分配内存。

因为不能从结构继承,结构只应当用于不需要扩展的对象。当希望创建的对象实例较小时使用结构,并要考虑类与结构之间性能特点的对比。

相同点

结构和类在以下方面相同:

1.两者都属于“容器”类型,这意味着它们包含其他以成员形式存在的类型。

2.两者都具有成员,成员可以包括构造函数、方法、属性、字段、常数、枚举、事件和事件处理程序。但是,不要将这些成员与结构的声明“元素”混淆。

3.两者的成员可以分别有不同的访问级别。例如,一个成员可以声明为Public,而另一个可以声明为 Private。

4.都可实现接口。

5.都有共享的构造函数,有或没有参数。

6.两者都可以公开“默认属性”,前提是该属性至少带有一个参数。

7.两者都可以声明和引发事件,而且两者都可以声明委托。

不同点

1.结构和类在以下方面有所不同:

2.结构是“值类型”,而类是“引用类型”。结构类型的变量包含此结构的数据,而不是像类类型那样包含对数据的引用。

3.结构使用堆栈分配,类使用堆分配。

4.所有的结构元素都默认为Public;类变量和常数默认为 Private,而其他的类成员默认为 Public。类成员的这一行为提供与 VisualBasic 6.0 默认值系统的兼容。

5.结构必须至少具有一个非共享变量或非共享的非自定义事件元素;而类可以完全是空的。

6.结构元素不可声明为Protected;类成员可以。

7.只有 Shared(Visual Basic)Sub结构过程才能处理事件,并且只能使用 AddHandler语句语句;而任何类过程都可以处理事件,并且可以使用Handles 关键字或AddHandler 语句。有关更多信息,请参见事件和事件处理程序。

8.结构变量声明不能指定初始值设定项或数组初始大小,而类变量声明可以。

9.结构从System..::.ValueType 类隐式继承,不能从任何其他类型继承;而类可以从 System..::.ValueType 以外的其他任何类继承。

10.结构是不可继承的;而类可以继承。

11.结构从不终止,所以公共语言运行库(CLR)从不对任何结构调用 Finalize方法;而类可由垃圾回收器 (GC) 终止,当检测到没有剩余的活动引用时,垃圾回收器将对类调用 Finalize。

12.结构不需要构造函数;而类需要。

13.结构仅当没有参数时可以有非共享的构造函数;类无论有没有参数都可以。

14.每一个结构都有不带参数的隐式公共构造函数。这个构造函数将结构的所有数据元素都初始化为默认值。不能重定义此行为。


一个具体简单的示例:

新建控制台应用程序,源码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _05结构
{
    class Program
    {
        //在没有面向对象、在没有类的情况下如何组织一些相关的数据?
        //一种值类型,不具有面向对象的特征,通常用来封装小型相关变结构体是一个值类型。(非常像类的量组 )
        //System.Drawing.Point、Size、Color,可以再winform中查看

        static void Main(string[] args)
        {
            //结构与类的最大区别是:
            //结构是值类型,类是引用类型
            //结构不能继承,但可以实现接口。
            Student s = new Student();
            s.Email = "ddddd";
            s.name = "ddd";
            s.age = 10;
            s.SayHi();
            s.Flay();
            Console.WriteLine(s.Email);
            Console.ReadKey();           
        }
    }

    //如果需要面向对象的特征,如果存储的数据量比较大则使用类
    //如果存储的数据量比较小,不需要面向对象特性则使用结构。
    struct Student : IFlayble
    {
        public string name;

        public int age;

        public string Email
        {
            get;
            set;
        }

        public void SayHi()
        {
            Console.WriteLine("Hi.....");
        }

        public void Flay()
        {
            Console.WriteLine("飞.....");
        }
    }

    public interface IFlayble
    {
        void Flay();
    }
}
输出结果如下:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值