class和struct

  • 什么是class?

class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段、属性、方法、属性、构造函数、索引器、操作符等。因为是基本的概念,所以不必在此详细描述,读者可以查询相关概念了解。我们重点强调的是.NET中,所有的类都最终继承自System.Object类,因此是一种引用类型,也就是说,new一个类的实例时,对象保存了该实例实际数据的引用地址,而对象的值保存在托管堆(managed heap)中。 

  • 什么是struct?

struct(结构)是一种值类型,用于将一组相关的信息变量组织为一个单一的变量实体 。所有的结构都继承自System.ValueType类,因此是一种值类型,也就是说,struct实例分配在线程的堆栈(stack)上,它本身存储了值,而不包含指向该值的指针。所以在使用struct时,我们可以将其当作int、char这样的基本类型类对待。

  • 相同点,不同点
  1. 相同点:语法类似。
  2. 不同点:
  • class是引用类型,继承自System.Object类;struct是值类型,继承自System.ValueType类,因此不具多态性。但是注意,System.ValueType是个引用类型。
  • 从职能观点来看,class表现为行为;而struct常用于存储数据。
  • class支持继承,可以继承自类和接口;而struct没有继承性,struct不能从class继承,也不能作为class的基类,但struct支持接口继承class可以声明无参构造函数,可以声明析构函数;而struct只能声明带参数构造函数,且不能声明析构函数。因此,struct没有自定义的默认无参构造函数,默认无参构造器只是简单地把所有值初始化为它们的0等价值
  • 实例化时,class要使用new关键字;而struct可以不使用new关键字,如果不以new来实例化struct,则其所有的字段将处于未分配状态,直到所有字段完成初始化,否则引用未赋值的字段会导致编译错误。
  • class可以实抽象类(abstract),可以声明抽象函数;而struct为抽象,也不能声明抽象函数。
  • class可以声明protected成员、virtual成员、sealed成员和override成员;而struct不可以,但是值得注意的是,struct可以重载System.Object的3个虚方法,Equals()、ToString()和GetHashTable()。
  • class的对象复制分为浅拷贝和深拷贝,必须经过特别的方法来完成复制;而struct创建的对象复制简单,可以直接以等号连接即可。
  • class实例由垃圾回收机制来保证内存的回收处理;而struct变量使用完后立即自动解除内存分配。
  • 作为参数传递时,class变量是以按址方式传递;而struct变量是以按值方式传递的。

     3. 在以下情况下,鉴于性能上的考虑,我们应该考虑使用struct来代替class:

  • 实现一个主要用于存储数据的结构时,可以考虑struct。
  • struct变量占有堆栈的空间,因此只适用于数据量相对小的场合。
  • 结构数组具有更高的效率。
  • 提供某些和非托管代码通信的兼容性。

 

  • 代码
    class Program
    {
    static void Main(string[] args)
    {
    Family family;
    family.name
    = "vrlilym";
    family.sex
    = true;
    Console.WriteLine(family.name);

    Family myfamily
    = new Family("vrliym", 28, true, "中国", new Person("vrliymbf", 26));
    Person person
    = new Person();
    person.Name
    = "vrliymbf";
    ShowFamily(myfamily);
    ShowPerson(person);
    myfamily.GetSex();
    myfamily.ShowPerson();
    //结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。
    Console.WriteLine("i'm " + myfamily.name);
    //类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存
    Console.WriteLine("i'm " + person.Name);
    Console.WriteLine(myfamily.ToString());
    Console.ReadLine();
    }

    public static void ShowPerson(Person person)
    {
    person.Name
    ="1111";
    Console.WriteLine(
    "this is "+person.Name);
    }

    public static void ShowFamily(Family family)
    {
    family.name
    = "2222";
    Console.WriteLine(
    "this is " + family.name);
    }
    }

    interface IPerson
    {
    void GetSex();
    }

    public class Person
    {
    public Person() { }
    public Person(string name, int age)
    {
    _name
    = name;
    _age
    = age;
    }

    private string _name;
    public string Name
    {
    get { return _name; }
    set { _name = value; }
    }

    private int _age;
    public int Age
    {
    get { return _age; }
    set { _age = value; }
    }
    }

    struct Family : IPerson
    {
    public string name;
    public int age;
    public bool sex;
    public string country;
    public Person person;
    public Family(string name, int age, bool sex, string country, Person person)
    {
    this.name = name;
    this.age = age;
    this.sex = sex;
    this.country = country;
    this.person = person;
    }

    #region IPerson 成员

    public void GetSex()
    {
    if (sex)
    Console.WriteLine(person.Name
    + " is a boy.");
    else
    Console.WriteLine(person.Name
    + " is a girl.");
    }

    #endregion

    public void ShowPerson()
    {
    Console.WriteLine(
    "This is {0} from {1}", new Person(name, 22).Name, country);
    }

    public override string ToString()
    {
    return String.Format("{0} is {1}, {2} from {3}", person.Name, age, sex ? "Boy" : "Girl", country);
    }
    }

     

    参考文档

posted on 2010-10-13 00:18  tLEE  阅读(289)  评论(0)    收藏  举报

导航