当前位置:
首页 > Python基础教程 >
-
深入探讨C#中的结构struct
一、结构和类的区别
1、结构的级别和类一致,写在命名空间下面,可以定义字段、属性、方法、构造方法也可以通过关键字new创建对象。
2、结构中的字段不能赋初始值。
3、无参数的构造函数无论如何C#编译器都会自动生成,所以不能为结构定义一个无参构造函数。
4、在构造函数中,必须给结构体的所有字段赋值。
5、在构造函数中,为属性赋值,不认为是对字段赋值,因为属性不一定是去操作字段。
6、结构是值类型,在传递结构变量的时候,会将结构对象里的每一个字段复制一份拷贝到新的结构变量的字段中。
7、不能定义自动属性,因为字段属性会生成一个字段,而这个字段必须要求在构造函数中,但我们不知道这个字段叫什么名字。
8、声明结构体对象,可以不使用new关键字,但是这个时候,结构体对象的字段没有初始值,因为没有调用构造函数,构造函数中必须为字段赋值,所以,通过new关键字创建结构体对象,这个对象的字段就有默认值。
9、栈的访问速度快,但空间小,堆的访问速度慢,但空间大,当我们要表示一个轻量级的对象的时候,就定义为结构,以提高速度,根据传至的影响来选择,希望传引用,则定义为类,传拷贝,则定义为结构。
二、Demo
复制代码代码如下:
struct Point
{
public Program p;
private int x;
public int X
{
get { return x; }
set { x = value; }
}
private int y;
public int Y
{
get { return y; }
set { y = value; }
}
public void Show()
{
Console.Write("X={0},Y={1}", this.X, this.Y);
}
public Point(int x,int y)
{
this.x = x;
this.y = y;
this.p = null;
}
public Point(int x)
{
this.x = x;
this.y = 11;
this.p = null;
}
public Point(int x, int y, Program p)
{
this.x = x;
this.y = y;
this.p = p;
}
}
class Program
{
public string Name { get; set; }
static void Main(string[] args)
{
//Point p = new Point();
//p.X = 120;
//p.Y = 100;
//Point p1 = p;
//p1.X = 190;
//Console.WriteLine(p.X);
//Point p;
//p.X = 12;//不赋值就会报错
//Console.WriteLine(p.X);
//Point p1 = new Point();
//Console.WriteLine(p1.X);//此处不赋值不会报错,原因见区别8
Program p = new Program() { Name="小花"};
Point point1 = new Point(10, 10, p);
Point point2 = point1;
point2.p.Name = "小明";
Console.WriteLine(point1.p.Name);//结果为小明,分析见下图
}
}
来源:https://www.jb51.net/article/41820.htm
栏目列表
最新更新
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
Java使用poi生成word文档的简单实例
计算机二级考试MySQL常考点 8种MySQL数据库
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比