C#学习-结构体(Struct+和Class的区别,ref关键字,析构函数)
2023-09-27 14:27:29 时间
相同点:
- 都包含字段,属性,方法
- 修饰的访问权限
- 通过new实例化对象
不同点:
- Struct结构体在栈上开辟空间,是值类型,不传地址,原始数据不变
- Class类在堆上开辟空间,是引用类型,传地址,原始数据会发生改变,可使用ref进行传地址做出值的改变
- 结构体中不允许写析构函数
- 结构体只有一个父类Object,无继承
代码:
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace _TBD_2020814Test
{
public struct Point
{
//字段
public double x;
public double y;
//属性
public double X //属性访问器
{
set
{
this.x = value;
}
get
{
return x;
}
}
//方法
public void Test()
{
}
//public Point() { }结构体不允许无参构造
public Point(double x,double y)
{
this.x = x;
this.y = y;
}
}
class Program
{
static void Main(string[] args)
{
//实例化一个结构体Point对象
Point p = new Point();//没有无参构造,但没有出问题,说明Struct中始终有一个public的无参构造方法
Point p1 = new Point();
p.x = 10;
p.y = 20;
p1.x = 10;
p1.y = 20;
Change(p);
Console.WriteLine(p.x);//10
Console.WriteLine(p.y);//20
Console.WriteLine("不改变数值");
Change(ref p1);
Console.WriteLine(p1.x);//100
Console.WriteLine(p1.y);//200
Console.WriteLine("传地址改变数值");
//struct是栈上开辟空间是值类型,不传地址,所以不改变值的大小
//把Struct改成class,调用方法输出的是100,200,因为class是堆上开辟空间是引用类型,传地址,会改变地址中的值
}
//~point() { }没有析构函数
public static void Change(Point p) //ref关键字传地址改变值
{
p.x = 100;
p.y = 200;
}
public static void Change(ref Point p1) //ref关键字传地址改变值
{
p1.x = 100;
p1.y = 200;
}
}
}
析构函数:
参考:
代码理解:
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace _TBD_2020814Test
{
class First // 基类First
{
~First() // 析构函数
{
Console.WriteLine("~First()析构函数");
}
}
class Second : First // Second类从First类派生
{
~Second() // 析构函数
{
Console.WriteLine("~Second()析构函数");
}
}
class Third : Second // Third类从Second类派生
{
~Third() // 析构函数
{
Console.WriteLine("~Third()析构函数");
}
}
class Program
{
static void Main(string[] args)
{
// C#析构函数
Third Third1 = new Third(); // 创建类的实例
}
}
}
相关文章
- c# 如何获取项目的根目录
- 代码走查25条疑问 C# 跳转新的标签页 C#线程处理 .Net 特性 attribute 学习 ----自定义特性 看懂 ,学会 .NET 事件的正确姿势-简单版
- [译]聊聊C#中的泛型的使用(新手勿入) Seaching TreeVIew WPF 可编辑树Ztree的使用(包括对后台数据库的增删改查) 字段和属性的区别 C# 遍历Dictionary并修改其中的Value 学习笔记——异步 程序员常说的「哈希表」是个什么鬼?
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
- C#学习记录——Visual Studio为项目添加DLL文件引用
- C#学习记录——开发网络应用程序,注册表基础
- C#学习记录——复杂的变量类型:枚举、结构和数组
- C# Window Service安装、卸载、恢复选项操作
- C# 中使用RegisterShellHookWindow Hook窗体创建
- C#【规范篇】命名规范(控件)
- C#,人工智能,机器人路径规划(Robotics Pathfinding)DStarLite(D* Lite Algorithm)优化算法与C#源程序
- C#学习笔记(3)
- C#学习笔记(2)
- C#Winform中控件的布局思想
- C#中获取当前程序所在路径的各种方法示例
- C# 坦克游戏大战中学习相关类(Bitmap)
- C#中的委托是什么
- c# 搜索字符串
- 带你熟知c#基础知识点--思维导图
- c#生成MD5字符串
- C#学习之打包DLL+EXE方法
- C#学习之调试神器MessageBox.show(“×××”,“提示”);
- C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义
- 定义C#鼠标指针的形状 Cursor
- 【实战学习c#】为程序设置版本和帮助信息