public class StaticTest : MonoBehaviour
{
private void Start()
{
MyStaticClass.Fun();
MyClass.Fun();
Debug.Log(MyClass.b);
int a = 3;
MyClass.Fun3(a);
}
}
public static class MyStaticClass
{
//public void Fun() { }错误,静态类,无法声明实例成员
public static void Fun() { Debug.Log("static Fun"); }
//public int c;错误,静态类无法声明实例成员
}
public class MyClass
{
public static int b = 10;
public static void Fun()
{
Debug.Log("This is Fun");
}
int global_a = 1;
public static void Fun2()
{
int a = 2;//局部成员
Debug.Log("Fun2, a = " + a);
//global_a = a;错误,不能在静态类内部使用全局的非静态成员
a = b;//静态全局的b,可以访问
Debug.Log("Fun2, a = " + a);
}
public static void Fun3(int a)
{
Debug.Log("Fun 3, result = " + a);
}
public static void Fun4()
{
//Fun3(global_a);错误,不能在静态类内部使用全局的非静态成员
int a = 3;//局部成员
Fun3(a);
Fun3(b);//可以访问静态全局的b
}
}
以上实验结果可知:
- 1、静态成员和静态方法属于类本身,静态方法可以直接用静态类的方式访问。
- 2、静态方法不能访问当前类的全局变量,只能访问当前类的静态全局变量,方法内的局部变量无此限制。
- 3、静态类只能包含静态方法和属性。
- 4、静态局部变量表示此值在方法调用完后不会释放。
总的来说, 静态类最大的特点就是共享,静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,
所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。
静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,
而且静态内存是有限制的,太多了程序会启动不了。
延伸1:只读字段
只读字段不仅能在声明时初始化,还能在构造函数中赋值,适合用于要通过计算才能确定初始值。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
var cl = new class1("I'm readonly");
var c2 = new class1("I'm readonly too");
var c3 = new class1();
Console.WriteLine(cl.Wmt);
Console.Write(c2.Wmt);
Console.Write(c3.Wmt);
Console.Read();
}
}
public class class1
{
public readonly string Wmt;
public class1(string words)
{
Wmt = words;
}
public class1()
{
}
}
}