成员修饰符顺序
由:核心声明、一组可选的修饰符和一组可选的特性
语法
[特性] [修饰符] 核心声明
修饰符
- 如果有修饰符,必须放在核心声明之前。
- 如果有多个修饰符,可以是任意顺序。
如:pubilc、static
特性
- 如果有特性,必须放在修饰符和核心声明之前。
- 如果有多个特性,可以是任意顺序。
例
public static int MaxVal;
static public int MaxVal;
静态字段/方法
- 静态字段被类的所有实例共享,所有实例都访问同一内存位置。因此,如果该内存位置的值被一个实例改变了,这种改变对所有的实例都可见。
- 可以使用static修饰符将字段声明为静态
语法
static int Mem2;
static public void PrintValA() {
....
}
实例
字段
class D {
int Mem1;
static int Mem2;
}
static void Main() {
D d1 = new D();
D d2 = new D();
}
分析
因为Mem2是静态的,类D的两个实例共享单一的Nem2字段。如果Nem2被改变了,这个改变在两个实例中都能看到。
成员Mem1没有声明为static,所以每个实例都有自己的副本。
内存图如下:
方法
class X
{
static public int A;
static public void PrintValA() {
Console.WriteLine($"Value: {A}");
}
}
class MyClass
{
static void Main() {
X.A = 10;
X.PrintValA();
}
}
结果
Vaule: 10
生命周期
存在整个程序运行阶段
- 在实例被销毁后,还可以进行赋值读取
- 即使类没有实例,也存在静态成员,那也可以访问,也包括静态函数成员
可以声明成静态的类成员类型
数据成员(存储数据) | 函数成员(执行代码) |
---|---|
✔字段 | ✔方法 |
✔类型 | ✔属性 |
常量 | ✔构造函数 |
/ | ✔运算符 |
/ | 索引器 |
/ | ✔事件 |
静态类
静态类中所有成员都是静态的。
静态类用于存放不受实例数据影响的数据和函数。
静态类的一个常见的用途可能就是创建一个包含一组数学方法和值的数学库。
规则
- 类本身必须标记为static。
- 类的所有成员必须是静态的。
- 类可以有一个静态构造函数,但不能有实例构造函数,不能创建该类的实例。
- 静态类是隐式密封的,也就是说,不能继承静态类。
例
static public class MyMath
{
public static float PI = 3.14f;
public static bool IsOdd(int x)
{
return x % 2 == 1;
}
public static int Time2(int x)
{
return 2 * x;
}
}
class Program
{
static void Main(string[] args)
{
int val = 3;
Console.WriteLine($"val:{val}, MyMath.IsOdd:{MyMath.IsOdd(val)}");
Console.WriteLine($"{val} * 2 = {MyMath.Time2(val)}");
Console.ReadKey();
}
}
结果
val:3, MyMath.IsOdd:True
3 * 2 = 6
扩展方法
允许编写的方法和声明他的类之外的类关联
规则
- 声明扩展方法的类必须声明为static。
- 扩展方法本身必须声明为static。
- 扩展方法必须包含关键字this作为它的第一个参数类型,并在后面跟着它所扩展的类的名称。
例
static class ExtendMyData
{
public static double Average(this MyData md){ //扩展方法
...
}
}
实例
sealed class MyData
{
private double D1, D2, D3;
public MyData(double d1, double d2, double d3)
{
D1 = d1;
D2 = d2;
D3 = d3;
}
public double Sum()
{
return D1 + D2 + D3;
}
}
static class ExtendMyData
{
public static double Average(this MyData md)
{
return md.Sum() / 3;
}
}
class Program
{
static void Main(string[] args)
{
MyData md = new MyData(3, 4, 5);
Console.WriteLine($"Sum: {md.Sum()}");
Console.WriteLine($"Average: {md.Average()}");
Console.ReadKey();
}
}
结果
Sum: 12
Average: 4