结构和类很相似,也可以包含数据成员和函数成员,但是与类不同,结构是一种值类型,(我们可以理解为一种特殊的值类型所以不存在继承的问题)为其分配数据不需要从托管堆中分配存储器。结构类型的变量直接包含了该结构的数据,而类类型的变量所包含的只是对相应对象的一个引用。
下面总结一下结构和类的不同:
1.结构是值类型,对结构类型的变量赋值将创建所赋值的一个副本。
2.结构实例的默认值不是null,而是具有默认值的初始值。
3.在结构和类中this的意义不一样。
4.结构不支持继承(所以结构成员的声明可访问性不能是protected,protected internal,结构中的函数成员不能是abstract 或者virtual,所以在结构中override修饰符只适用于重写从System.ValueType继承的方法)但是可以实现接口。
5.在结构中实例字段声明中不能含有变量的初始值设定项
6.在结构中不能声明无参数的实例构造函数。
7.在结构中不能声明析构函数。
测试区别特性代码:
using System; namespace StructAndClass { struct SPoint { public int x, y; public SPoint(int x, int y) { this.x = x; this.y = y; } } class CPoint { public int x, y; public CPoint(int x, int y) { this.x = x; this.y = y; } } class Test { public static void Main() { SPoint sp1 = new SPoint(2, 5); Console.WriteLine("结构/sp1初始值:"); Console.WriteLine("sp1.x={0}", sp1.x); SPoint sp2 = sp1; Console.WriteLine("sp1=sp2后:"); Console.WriteLine("sp1.x={0}"); Console.WriteLine("sp1.x={0}", sp1.x); Console.WriteLine("sp2.x={0}", sp2.x); sp1.x = 5; Console.WriteLine("再次改变sp1的值后:"); Console.WriteLine("sp1.x={0}", sp1.x); Console.WriteLine("sp2.x={0}", sp2.x); Console.WriteLine("============================"); CPoint cp1 = new CPoint(2,5); Console.WriteLine("类/cp1初始值:"); Console.WriteLine("cp1.x={0}", cp1.x); CPoint cp2 = cp1; Console.WriteLine("cp1=cp2后:"); Console.WriteLine("cp1.x={0}", cp1.x); Console.WriteLine("cp2.x={0}", cp2.x); cp1.x = 5; Console.WriteLine("再次改变cp1的值后:"); Console.WriteLine("cp1.x={0}", cp1.x); Console.WriteLine("cp2.x={0}", cp2.x); Console.ReadKey(); } } }
对于结构,即使没有new运算符声明的结构变量也是有效的,结构虽然不能声明无参数的实力构造函数,但是它其实隐式的包含了一个无参数的构造函数:而且在结构的所有字段没有明确赋值之前,不能调用结构的实例函数成员。在结构的构造函数中应该给所有的字段赋值。例如:
struct DC { public int x, y; public int X { set { x = value; } get { return x; } } public int Y { set { y = value; } get { return y; } } public DC(int x,int y) { this.x = x; this.y = y; } } struct RDC { public int x, y; public int X { set { x = value; } get { return x; } } public int Y { set { y = value; } get { return y; } } public RDC(int x, int y) { this.x = x; this.y = y; } } class Test { public static void Main() { DC dc=new DC(); dc.x = 3; dc.y = 5; Console.WriteLine("已经对x,y初始化后:"); Console.WriteLine("此时可以访问和修改dc.X={0}的值",dc.X); Console.WriteLine("我在这里创建了一个DC的复制结构RDC/n并且不对x,y初始化就会报错"); RDC rdc; rdc.y = 5;//可以编译通过 rdc.X = 3;//这里就会出错,不能编译通过 Console.WriteLine("=======test over================"); } }
在结构的实例构造函数内,this 相当于一个结构类型的 out 参数,(必须在内部对它明确赋值)而在结构的实例函数成员内,this 相当于一个结构类型的 ref 参数。在这两种情况下,this 本身相当于一个变量,因而有可能对该函数成员调用所涉及的整个结构进行修改(如对 this 赋值,或者将 this 作为 ref 或 out 参数传递)。例如:(引用上面的例子)
struct DC { public int x, y; public int X { set { x = value; } get { return x; } } public int Y { set { y = value; } get { return y; } } public DC(int x,int y) { X= x;//这里就是错的 Y = y;//会提示没有给this对象的所有字段赋值 } }
在 C# 中,结构体是一种值数据类型。包含数据成员和方法成员。 struct 关键字是用于创建一个结构体。 结构体是用来代表一个记录。假设你想追踪一个图书馆的书。你可能想追踪每本书的属性如下: 标题 作者 类别 书号 定义一个结构体 定义一个结构体,你必须要声明这个结构体。结构体声明定义了一种新的数据类型,这个数据类型为你的程序包含了一个以上的成员变量。 例如,你可以声明一个书的结构如下: str
在我们学习 C# 编程语言的基础构件块之前,让我们先看一下 C# 的最小的程序结构, 以便作为接下来章节的参考。 创建 Hello World 实例 一个 C# 程序主要包括以下部分: 命名空间声明 一个类 类方法 类属性 一个 Main 方法 语句和表达式 注释 让我们看一个可以打印出 “Hello World” 的简单的代码: using System; namespace HelloWorl
C# 是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种相互作用的对象组成。一个对象采取的动作称为方法。 相同种类的对象通常具有相同的属性,或者说,是在相同的类中。 例如,以 Rectangle(矩形)对象为例。它具有 length 和 width 属性。 根据设计,它可能需要接受这些属性值、计算面积和显示细节的方法。 让我们来看看一个 Rectangle(矩形)类的实现,并借此讨论
本文向大家介绍详解mybatis #{}和${}的区别、传参、基本语法,包括了详解mybatis #{}和${}的区别、传参、基本语法的使用技巧和注意事项,需要的朋友参考一下 1 #{}和${}的区别、及注入问题 2 mybatis几种传参方式 2 choose when otherwise 3 判断字符串相等 4 CONCAT函数实现 模糊匹配 5 大于等于、小于等于 到此这篇关于mybatis
本文向大家介绍C#中的类和结构之间的区别,包括了C#中的类和结构之间的区别的使用技巧和注意事项,需要的朋友参考一下 为了区分类和结构,我们首先必须了解,在保存和定义数据的上下文中,结构和类似乎是等效的。这两个都可以定义并在其数据成员中保留一些默认值。但是,如果我们在此上下文之外考虑它们,则与结构相比,类将提供更多的灵活性以及功能。 以下是类和结构之间的重要区别。 序号 键 类 结构体 1 数据类型
本文向大家介绍C语言中fgets和fscanf区别详解,包括了C语言中fgets和fscanf区别详解的使用技巧和注意事项,需要的朋友参考一下 C语言中fgets和fscanf区别详解 一、作用上的大概区别: 二、举个例子:把a.txt文件中的内容复制到b.txt。 a.txt中的内容(第一行中“我爱你小白”和“开玩笑”中间有个空格,每行的最后都有回车): 1、使用fgets读取a.txt文件并写