C# 结构,结构是值类型。 该类型由struct
关键字定义。 结构与类非常相似。 它们在某些方面有所不同。 结构旨在表示轻量级对象,例如Point
,Rectangle
,Color
等。 在许多情况下,结构可能比类更有效。 结构是值类型,并在堆栈上创建。 注意,像int
,bool
,float
之类的原始数据类型在技术上都是struct
类型。
所有struct
类型都继承自System.ValueType
,并且继承自System.Object
。 结构从来都不是抽象的,它们总是被隐式密封的。 因此结构类型不支持继承。 因此,不能将struct
数据成员声明为受保护的。 struct
定义不允许使用抽象修饰符和密封修饰符。 不允许struct
声明无参数的构造函数。
结构还可以包含构造函数,常量,字段,方法,属性,索引器,运算符,事件和嵌套类型。 但是,如果我们需要实现更多这些功能,则可以考虑使用一个类。 结构可以实现接口。 struct
可以用作nullable
类型,并且可以分配为空值。
简单结构示例
以下示例创建一个简单的结构。
Program.cs
using System;
namespace SimpleStructure
{
public struct Point
{
private int x;
private int y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
public override string ToString()
{
return String.Format("Point x:{0}, y:{1}", x, y);
}
}
class Program
{
static void Main(string[] args)
{
var p = new Point(2, 5);
Console.WriteLine(p);
}
}
}
该示例创建一个Point
结构。 这个点也可以用一个类来表示,但是有了struct
,我们的效率更高了。 特别是如果我们处理了很多问题。
public struct Point
{
...
}
该结构用struct
关键字声明。
public override string ToString()
{
return String.Format("Point x:{0}, y:{1}", x, y);
}
struct
类型不支持继承。 但是,我们可以对方法使用override
关键字,struct
类型隐式地从中继承。 ToString()
方法就是这种情况。
var p = new Point(2, 5);
Console.WriteLine(p);
我们创建Point
结构,并在其上调用ToString()
方法。
$ dotnet run
Point x:2, y:5
这是示例的输出。
没有new
关键字
可以创建不带new
关键字的struct
类型的实例。
Program.cs
using System;
namespace NoNewKeyword
{
public struct Person
{
public string name;
public int age;
}
class Program
{
static void Main(string[] args)
{
Person p;
p.name = "Jane";
p.age = 17;
Console.WriteLine("{0} is {1} years old",
p.name, p.age);
}
}
}
我们有一个Person
结构,其中有两个公共成员。
Person p;
首先,我们声明一个Person
结构。
p.name = "Jane";
p.age = 17;
稍后我们用一些数据初始化结构。
$ dotnet run
Jane is 17 years old
这是程序的输出。
C# 结构是值类型
结构类型是值类型。 它们是在堆栈上创建的。 创建值类型时,仅在内存中分配了一个空间来存储值。 值类型的分配将复制该值。
Program.cs
using System;
namespace ValueTypes
{
public struct Person
{
public Person(string name, int age) : this()
{
this.Name = name;
this.Age = age;
}
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return String.Format("{0} is {1} years old", Name, Age);
}
}
class Program
{
static void Main(string[] args)
{
var p1 = new Person("Beky", 18);
var p2 = p1;
Console.WriteLine(p2);
p2.Name = "Jane";
p2.Age = 17;
Console.WriteLine(p2);
Console.WriteLine(p1);
}
}
}
我们有一个带有两个数据成员的Person
结构。 我们有两个参数的构造函数,我们也使用自动属性。
public string Name { get; set; }
public int Age { get; set; }
可以在struct
类型中使用自动属性。
var p1 = new Person("Beky", 18);
var p2 = p1;
在这里,我们创建一个struct
。 然后将创建的struct
分配给另一个struct
。 我们创建该结构的副本。
p2.Name = "Jane";
p2.Age = 17;
我们更改第二个结构的数据。 第一个不受影响,因为我们正在处理原始struct
类型的副本。
$ dotnet run
Beky is 18 years old
Jane is 17 years old
Beky is 18 years old
基本类型是结构
像int
,float
或bool
之类的原始数据类型是内部结构。 这不同于 C++ 或 Java 之类的语言。
Program.cs
using System;
public class PrimitiveTypes
{
static void Main()
{
float x = 12.3f;
int y = 34;
bool z = false;
Console.WriteLine(x.GetType());
Console.WriteLine(y.GetType());
Console.WriteLine(z.GetType());
}
}
我们有三个变量:float,int
和bool
。 我们对它们每个调用GetType()
方法。
Console.WriteLine(x.GetType());
我们在浮点值上调用GetType()
方法。 每个结构都隐式继承自包含GetType()
方法的System.ValueType
类。
$ dotnet run
System.Single
System.Int32
System.Boolean
这是示例的输出。 我们可以在文档中查找这些类型是结构。