A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高林 中级黑马   /  2014-3-19 15:36  /  1100 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高林 于 2014-3-19 21:27 编辑

结构和类的联系与区别  始终搞不懂,它们功能啥的不差不多嘛。。。

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

2 个回复

倒序浏览
C#类:类是C# 中功能最为强大的数据类型,类也定义了数据类型的数据和行为。然后,程序员可以创建作为此类的实例的对象。

C#结构体:结构体是轻量型的类,使用开销相对于类较小。

C#类和C#结构体两者的关系:

1.数据类型:类和结构体都是数据类型,类是引用类型,结构体是值类型。

2.继承性:类可以继承和被继承,而结构体隐式继承于object,不可以继承(除接口以外)和被继承

3.构造函数:类和结构体都有默认(无参)构造函数,只不过结构体不能显示声明默认(无参)构造函数,

4.字段初始化:类可以对字段声明时赋值初始化,而结构体不可以(除const和static之外),结构体的字段必须在构造函数中进行初始化。

5.实例化:结构体实例化时可以不使用new,,如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。而类必须使用new进行实例化。

如何选择C#结构体还是C#类   

讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:  

1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些  

2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有   1000   个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。  

3.在表现抽象和多级别的对象层次时,类是最好的选择

4.大多数情况下该类型只是一些数据时,结构时最佳的选择 ,struct 类型是一种值类型,通常用来封装小型相关变量组,例如,矩形的坐标或库存商品的特征。

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
类:
类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存
类有构造和析构函数
类可以继承和被继承

结构:
结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。
结构没有构造函数,但可以添加。结构没有析构函数
结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口
示例:

根据以上比较,我们可以得出一些轻量级的对象最好使用结构,但数据量大或有复杂处理逻辑对象最好使用类。

如:Geoemtry(GIS 里的一个概论,在 OGC 标准里有定义) 最好使用类,而 Geometry 中点的成员最好使用结构

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

namespace Example16
{
    interface IPoint
     {
        double X
         {
             get;
             set;
         }
        double Y
         {
             get;
             set;
         }
        double Z
         {
             get;
             set;
         }
     }
    //结构也可以从接口继承
    struct Point: IPoint
     {
        private double x, y, z;
        //结构也可以增加构造函数
        public Point(double X, double Y, double Z)
         {
            this.x = X;
            this.y = Y;
            this.z = Z;
         }
        public double X
         {
             get { return x; }
             set { x = value; }
         }
        public double Y
         {
             get { return x; }
             set { x = value; }
         }
        public double Z
         {
             get { return x; }
             set { x = value; }
         }
     }
    //在此简化了点状Geometry的设计,实际产品中还包含Project(坐标变换)等复杂操作
    class PointGeometry
     {
        private Point value;
        
        public PointGeometry(double X, double Y, double Z)
         {
            value = new Point(X, Y, Z);
         }
        public PointGeometry(Point value)
         {
            //结构的赋值将分配新的内存
            this.value = value;
         }
        public double X
         {
             get { return value.X; }
             set { this.value.X = value; }
         }
        public double Y
         {
             get { return value.Y; }
             set { this.value.Y = value; }
         }
        public double Z
        {
             get { return value.Z; }
             set { this.value.Z = value; }
         }
        public static PointGeometry operator +(PointGeometry Left, PointGeometry Rigth)
         {
            return new PointGeometry(Left.X + Rigth.X, Left.Y + Rigth.Y, Left.Z + Rigth.Z);
         }
        public override string ToString()
         {
            return string.Format("X: {0}, Y: {1}, Z: {2}", value.X, value.Y, value.Z);
         }
     }
    class Program
     {
        static void Main(string[] args)
         {
             Point tmpPoint = new Point(1, 2, 3);

             PointGeometry tmpPG1 = new PointGeometry(tmpPoint);
             PointGeometry tmpPG2 = new PointGeometry(tmpPoint);
             tmpPG2.X = 4;
             tmpPG2.Y = 5;
             tmpPG2.Z = 6;

            //由于结构是值类型,tmpPG1 和 tmpPG2 的坐标并不一样
             Console.WriteLine(tmpPG1);
             Console.WriteLine(tmpPG2);

            //由于类是引用类型,对tmpPG1坐标修改后影响到了tmpPG3
             PointGeometry tmpPG3 = tmpPG1;
             tmpPG1.X = 7;
             tmpPG1.Y = 8;
             tmpPG1.Z = 9;
             Console.WriteLine(tmpPG1);
             Console.WriteLine(tmpPG3);

             Console.ReadLine();
         }
     }
}

结果:
X: 1, Y: 2, Z: 3
X: 4, Y: 5, Z: 6
X: 7, Y: 8, Z: 9
X: 7, Y: 8, Z: 9

:)网上找的,希望对你能有所帮助

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马