using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _2.结构体
{
internal class Program
{
static void Main(string[] args)
{
//访问Booksp1
Books b1;
b1.title = "西游记";
b1.anthor = "吴承恩";
b1.subject = "神话故事";
b1.book_id = 1;
Console.WriteLine(b1);
//上面的b1没有实例化,结构体也支持实例化
Point p1= new Point(10,20);
Console.WriteLine(p1);
/*
栈:值类型的数据在栈中
堆:引用类型的数据放到堆中
与类的区别:
1.结构体属于值类型,所以默认内存在栈中,而类创建的对象属于引用类型,默认的内存在堆中
2.结构体的赋值是按照值的方式传递的,对象是按照引用类型传递的
3.系统默认的构造函数,在结构体中不能重写 而类可以
4.结构体不能继承其他类结构体,但是可以继承接口
使用场景:
1.如果是定义一本书,因为书只会有属性,没有行为,属于小数据结构,适用于结构体,因为赋值操作开销小
2.如果要定义一个人,那么除了属性之外,还会有行为,属于复杂数据结构,适用于类,因为传递时候开销小
*/
//只读结构体
Point2 point2 = new Point2(10,20);
Console.WriteLine(point2);
//point2.X = 10;不可以再次赋值
//关于结构体的默认值
//结构体使用default会把当前结构体中的所有字段初始化为0
Point p3= default(Point);
Console.WriteLine(p3);
//类使用default,表示没有任何对象,返回null
People aPople=default(People);
Console.WriteLine(aPople);
}
}
//struct关键字用来定义结构体,属于值类型,主要的用途是封装数据,类似于类,但是只能表示简单的数据结构,例如,书本信息,坐标点,日期,时间等.
public struct Books
{
public string title;
public string subject;
public string anthor;
public int book_id;
public override string ToString()
{
return $"书名:{title},作者:{anthor},类型:{subject},数量:{book_id}";
}
}
public struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
//重写ToString
public override string ToString()
{
return $"(坐标:{X},{Y})";
}
}
//只读结构体
//readonly:关键字代表构造之后就不能更改了
public readonly struct Point2
{
public int X { get; }
public int Y { get; }
public Point2(int x, int y)
{
X = x;
Y = y;
}
//重写ToString
public override string ToString()
{
return $"(坐标:{X},{Y})";
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _2.结构体
{
internal class People
{
public string title;
public override string ToString()
{
return "嘿嘿嘿嘿";
}
}
}