类和结构的区别

类是引用类型,结构是值类型,下面的例子中 大量使用结构类型

namespace CSharpTest
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct LOGFONTW
    {
        public int lfHeight;
        public int lfWidth;
        public int lfEscapement;
        public int lfOrientation;
        public int lfWeight;
        public byte lfItalic;
        public byte lfUnderline;
        public byte lfStrikeOut;
        public byte lfCharSet;
        public byte lfOutPrecision;
        public byte lfClipPrecision;
        public byte lfQuality;
        public byte lfPitchAndFamily;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string lfFaceName;
    }
    public struct SYSTEMTIME
    {
        public ushort wYear;
        public ushort wMonth;
        public ushort wDayOfWeek;
        public ushort wDay;
        public ushort wHour;
        public ushort wMinute;
        public ushort wSecond;
        public ushort wMilliseconds;
    }
    /// <summary>
    /// Point
    /// </summary>
    public struct NP_POINT
    {
        /// <summary>
        /// //水平起始位置
        /// </summary>
        public int X;
        /// <summary>
        /// 垂直起始位置
        /// </summary>
        public int Y;
    }
    //Size
    public struct NP_SIZE
    {
        //宽度
        public int Width;
        //高度
        public int Height;
    };
    //Rectangle
    public struct NP_RECTANGLE
    {
        //x
        public int X;
        //y
        public int Y;
        //宽度
        public int Width;
        //高度
        public int Height;
    };
}

下述代码中两个都使用

 public struct TTimeStamp
    {
        public Int32 time;
        public Int32 date;
    }
    public struct TRoad
    {
        public uint name;
        public uint speed;
    }

    class CLEDSender
    {
        //通讯设备类型
        public readonly ushort DEVICE_TYPE_COM = 0;  //串口通讯
        public readonly ushort DEVICE_TYPE_UDP = 1;  //网络通讯
        public readonly ushort DEVICE_TYPE_485 = 2;  //485通讯

        //串口或者485通讯使用得通讯速度(波特率)
        public readonly ushort SBR_57600 = 0;
        public readonly ushort SBR_38400 = 1;
        public readonly ushort SBR_19200 = 2;
        public readonly ushort SBR_9600  = 3;
        //道路选择
        public readonly ushort ROAD_1 = 0;
         public readonly ushort ROAD_2 = 1;
        public readonly ushort ROAD_3 = 2;
        //速度选择
        public readonly ushort GREEN = 0;
        public readonly ushort RED = 1;
        public readonly ushort YELLOW = 2;

        //是否等待下位机应答,直接发送所有数据
        public readonly UInt32 NOTIFY_NONE  = 1;
        //是否阻塞方式;是则等到发送完成或者超时,才返回;否则立即返回
        public readonly UInt32 NOTIFY_BLOCK = 2;
        //是否将发送结果以Windows窗体消息方式送到调用得应用
        public readonly UInt32 NOTIFY_EVENT = 4;

        public readonly Int32 R_DEVICE_READY    = 0;
        public readonly Int32 R_DEVICE_INVALID  = -1;
        public readonly Int32 R_DEVICE_BUSY     = -2;
        public readonly Int32 R_FONTSET_INVALID = -3;
        public readonly Int32 R_DLL_INIT_IVALID = -4;
        public readonly Int32 R_IGNORE_RESPOND  = -5;

        //下位机应答标识
        public readonly ushort LM_RX_COMPLETE = 1;
        public readonly ushort LM_TX_COMPLETE = 2;
        public readonly ushort LM_RESPOND     = 3;
        public readonly ushort LM_TIMEOUT     = 4;
        public readonly ushort LM_NOTIFY      = 5;
        public readonly ushort LM_PARAM       = 6;
        public readonly ushort LM_TX_PROGRESS = 7;
        public readonly ushort LM_RX_PROGRESS = 8;
        public readonly ushort RESULT_FLASH = 0xff;

下面看下两者的区别

namespace Ch09Ex03
{
class MyClass
{
public int val;
}
struct myStruct
{
public int val;
}
class Program
{
static void Main(string[] args)
{
MyClass objectA = new MyClass();
MyClass objectB = objectA;
objectA.val = 10;
objectB.val = 20;
myStruct structA = new myStruct();
myStruct structB = structA;
structA.val = 30;
structB.val = 40;
Console.WriteLine("objectA.val = {0}", objectA.val);
Console.WriteLine("objectB.val = {0}", objectB.val);
Console.WriteLine("structA.val = {0}", structA.val);
Console.WriteLine("structB.val = {0}", structB.val);
Console.ReadKey();
}
}
}

运行类是引用类型也就是带有指针的,我们所引用的是指针,也就是地址,MyClass objectB = objectA;也即是两个引用类型共用了一个指针(地址相同),你可以这么试下

  static void Main(string[] args)
        {
            MyClass objectA = new MyClass();
            MyClass objectB = objectA;
            objectA.val = 10;
            //objectB.val = 20;
            myStruct structA = new myStruct();
            myStruct structB = structA;
            structA.val = 30;
            structB.val = 40;
            Console.WriteLine("objectA.val = {0}", objectA.val);
            Console.WriteLine("objectB.val = {0}", objectB.val);
            Console.WriteLine("structA.val = {0}", structA.val);
            Console.WriteLine("structB.val = {0}", structB.val);
            Console.ReadKey();
        }
    }

给任意一个值赋值,两个就有相同的值,明白否?

时间: 2024-12-05 11:57:29

类和结构的区别的相关文章

C#:类和结构的区别

第一.引用类型和值类型 类属于引用类型,而结构属于值类型. 结构在赋值时进行复制. 将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据. 第二.继承性 类可以继承类或者实现接口,而结构只能实现接口,不能继承结构. 第三.实例化 类的实例化需要使用new关键字,但是结构的实例化则可以不使用new关键字. 第四.构造函数 类可以显式地包含无参的构造函数,但是结构却不可以显式地包含无参构造函数,只可以定义带有参数的构造函数. 第五.初始化实例字段 类可以在类的定义中

2017年11月4日 vs类和结构的区别&amp;哈希表&amp;队列集合&amp;栈集合&amp;函数

类和结构的区别 类: 类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存 类有构造和析构函数 类可以继承和被继承 结构: 结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象. 结构没有构造函数,但可以添加.结构没有析构函数 结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口 //哈希表 //不规定长度 不规定类型 不规定建类型 //Hashtable j = new Hashtable(); //

类的声明 , 类和结构体的区别 , 内联函数

#include<iostream> using namespace std; class A;//类的声明 class B { private: A *a;//必须是指针 ,不能为 A a; }; class  A { private: B b; }; int main() {} 类和结构体区别: 结构体默认public 类默认是private 在继承方式:结构体默认公有继承 类默认私有继承 inline 调用内联函数并没有执行函数的调用过程,只是把函数的代码嵌入到了程序的调用点 , 减少了

swift 类和结构体

1:类和结构体定义 类和结构体分别通过关键字class 和struct定义. swift的编码风格是类class和结构体struct名字使用大写字母开头的匈牙利表示法,相反的.类的方法和属性则用小写字母开头的匈牙利表示法. 结构体总是通过被复制而进行代码传递的. struct SForm{ var iXX:Int = 99 var strHello:String = "dsf" func testFunc(iXX:Int)->Int{ return iXX+1 } } class

类和结构(二)

二.匿名类型 var关键字用于表示隐式类型化得变量.var和new关键字一起使用时,可以创建匿名类型. 匿名类型只是一个继承自Object且没有名称的类. var caption = new {FirstName = "John",LastName="Doe"}; 这会生成一个包含FirstName,LastName属性的对象. 创建另一个对象: var doctor = new {FirstName = "James",LastName=&qu

C#基础 类、结构、抽象类、接口的相关概念

先来简单说一下他们各自的含义是什么: 类(class):类类型是由字段数据(成员变量)和操作字段数据的成员(属性.方法.构造函数.事件等)所构成的自定义类型.其中字段数据表示类实例(对象)的 状态.2.结构(struct):C#中结构类型和类类型在语法上非常相似,他们都是一种数据结构,都可以 包括数据成员和方法成员. 3.抽象类:①:抽象类是特殊的类,只是不能被实例化:②:除此以外,具有类的其他特性:③:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何

3/类与结构区别

  C#结构和类的六点区别   引言··· 1 区别一:存储类型··· 3 堆和栈:··· 3 结构和类的存储类型:··· 3 区别二:继承性··· 4 区别三:初始化··· 5 区别四:构造函数··· 5 区别五:析构函数··· 7 区别六:关键字··· 7 类和结构的使用选择:··· 7 参考:··· 8 1.一览表:··· 8 2.结构和类的区别:··· 8 3.结构和类的异同:··· 8 4.源代码:··· 8 Struct,cs· 8 Class.cs· 10 Program.cs·

类,抽象基类,接口类三者间的区别与联系(C++)

联系很明显,三个都是‘类’,如果读者对类的概念不清楚,可以参照wid的博文http://www.cnblogs.com/mr-wid/archive/2013/02/18/2916309.html. 下面着重解释一下区别,但此文仅是个人理解,如果觉得我说的不对的地方,还请赐教. (1)结构上的区别: 普通类:数据+方法+实现 抽象类:数据+方法(一定包含虚方法n>=1)+部分方法的实现 接口类:方法(纯虚方法) (2)概念上的区别: 普通的类和另外两个的区别很明显,普通类就是猫狗之类的,而抽象类

OpenCV中图像的结构和区别

在OpenCV中,现在有很多种结构类型可以用来表示图像,它们之间有区别又有联系,现在记录一下它们之间的区别和相似之处,以便后面查看. 其中类型有: 1. Iplimage,2. Mat,3.CvMat, 4.CVArr: 其中: 1. IplImage: 较老版本的图像存储类型,在2.0之前使用: 2. CvArr: 也是较老的一种存储结构,是一种抽象的基类. 3. CvMat: 矩阵结构. 4. Mat:  新版本中使用的,推荐使用,是一个图像容器,基本上讲 Mat 是一个类,由两个数据部分组