黑马程序员技术交流社区

标题: 结构和类的区别 [打印本页]

作者: 杭州-杨    时间: 2013-4-18 10:22
标题: 结构和类的区别
遇到个问题,不是太理解,求解决
  static void Main(string[] args)
        {
            cs[] person=new cs[5];
            person[0].name = "aaa";
            person[1].name = "111";
            c1[] pr = new c1[2];
            pr[0].name = "bbb";
        }
        public struct cs
        {
            public string name;
        }
        public class c1
        {
            public string name;
        }
问题好像在 pr[0].name = "bbb";这句有问题,同样用类和结构来搞数组,2个区别是什么?

作者: wlt    时间: 2013-4-18 10:26
本帖最后由 wlt 于 2013-4-18 10:27 编辑

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

两者都属于“容器”类型,表示它们可以包含其他类型作为成员。
两者都具有成员,成员可以包括构造函数、方法、属性、字段、常数、枚举、事件和事件处理程序。
两者的成员都具有单独的可访问性。例如,一个成员可以声明为 Public,而另一个可以声明为 Private。
都可实现接口。
都有共享的构造函数,有或没有参数。
两者都可以公开默认属性,只要该属性至少带有一个参数。
两者都可以声明和引发事件,而且两者都可以声明委托。
不同点
结构和类在以下方面有所不同:

结构是值类型,而类是引用类型。
结构使用堆栈分配,类使用堆分配。
所有的结构成员都默认为 Public;类变量和常量默认为 Private,而其他的类成员默认为 Public。类成员的这一行为提供与 Visual Basic 6.0 默认值系统的兼容。
结构必须至少具有一个非共享变量或事件成员;而类可以完全是空的。
结构成员不能声明为 Protected,类成员可以。
只有 Shared Sub结构过程才能处理事件,并且只能使用 AddHandler语句;而任何类过程都可以处理事件,并且可以使用 Handles关键字或 AddHandler语句。
结构变量声明不能指定初始值、New关键字或数组初始大小,类变量声明可以。
结构从 ValueType类隐式继承,不能从其他类型继承,类可以从除 ValueType 之外的其他任何类继承。
结构是不可继承的;而类可以继承。
结构从不终止,所以公共语言运行库 (CLR) 从不在任何结构上调用 Finalize方法,类可由垃圾回收器终止,当检测到没有剩下的活动引用时,垃圾回收器将在类上调用 Finalize。
结构不需要构造函数;而类需要。
结构仅当没有参数时可以有非共享的构造函数;类无论有没有参数都可以。
每一个结构都有不带参数的隐式公共构造函数。此构造函数将结构的所有数据成员初始化为默认值。不能重定义此行为。


作者: 杭州-杨    时间: 2013-4-18 10:34
太文字了,难以理解,请直接举例说明
作者: wlt    时间: 2013-4-18 10:41
你上面代码 好多错误  我在修改代码
作者: wlt    时间: 2013-4-18 10:44
把你完整代码发过来

作者: 杭州-杨    时间: 2013-4-18 10:48
我就是不明白,为什么用类的时候,不能像结构一样,通过数组来存储
作者: wlt    时间: 2013-4-18 11:10
杭州-杨 发表于 2013-4-18 10:48
我就是不明白,为什么用类的时候,不能像结构一样,通过数组来存储

先看看类的储存方式吧
作者: 陈帅    时间: 2013-4-18 12:33
类是一种“引用类型”。 创建类的对象时,对象赋值到的变量只保存对该内存的引用。 将对象引用赋给新变量时,新变量引用的是原始对象。 通过一个变量做出的更改将反映在另一个变量中,因为两者引用同一数据。
结构是一种值类型。 创建结构时,结构赋值到的变量保存该结构的实际数据。 将结构赋给新变量时,将复制该结构。 因此,新变量和原始变量包含同一数据的两个不同的副本。 对一个副本的更改不影响另一个副本。
类通常用于对较为复杂的行为,或对要在创建类对象后进行修改的数据。 结构最适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主。
并且类可以继承,结构不可以继承。
作者: 张伟86    时间: 2013-5-1 14:36
实践了下,再查了点资料,本例中struct结构数组与class结构数组的区别应该在于,struct数组不需要我们显示实例化,它在定义时候已经被初始化了;而class数组需要我们自己实例化。
代码可以修改如下:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace ConsoleApplication4
  6. {  
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             cs[] person = new cs[5];
  12.             person[0].name = "aaa";
  13.             person[1].name = "111";
  14.             c1[] pr = new c1[2];
  15.             pr[0] = new c1(); //实例化
  16.             pr[0].name = "bbb";
  17.         }
  18.         public struct cs
  19.         {
  20.             public string name;
  21.         }
  22.         public class c1
  23.         {
  24.             public string name;
  25.         }
  26.     }
  27. }
复制代码

作者: 闫常国    时间: 2013-5-1 21:15
结构和类:
不同点:类是引用类型,结构是值类型;
         类可以被继承,结构不能被继承;
         类有默认的无参构造函数,结构必须显式地定义构造函数且必须是有参的构造函数;
         类创建对象必须使用new,结构创建对象可以不用使用new。
相同点:类和结构都可以有构造函数,且都可以重载;
         类和结构都可以包含字段和方法;
         类和结构都可以实现接口。
作者: 刘赛    时间: 2013-5-1 22:39
关于这个我是这么想的 cs[] person = new cs[5];//person[0]指向第一个cs   person[1]指向第二个cs......
c1[] pr = new c1[2];//pr[0]指向第一个c1,c1指向第一个类值. pr[1]指向第二个c1,c1指向第二个类值.....

作者: 贡宗新    时间: 2013-5-2 09:02
挺不错的,来学习了一下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2