黑马程序员技术交流社区
标题:
结构和类的区别
[打印本页]
作者:
杭州-杨
时间:
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数组需要我们自己实例化。
代码可以修改如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication4
{
class Program
{
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] = new c1(); //实例化
pr[0].name = "bbb";
}
public struct cs
{
public string name;
}
public class c1
{
public string name;
}
}
}
复制代码
作者:
闫常国
时间:
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