#region 常量和静态变量静态类readonly
//----------------------------------------------------------------------
//常量和静态变量,静态类
//----------------------------------------------------------------------
//类的静态变量和常量,都属于类而不属于对象,不能用对象来调用,只能用类名调用
//这不同于C++,是更合理的设计
//常量的值在类定义时就确定了,不因对象而不同,因此存放在类中更合理
class CNormclass
{
class CInclass
{
public float fx = 20;
}
public int _id;
public const string cname = "CNormalclass";
//1,常量仅能修饰 :数字,bool,字符串,null引用
//不能像C++那样定义一个常量对象,这真是太悲哀了,因为很多时候这可以加速数据传递,增加安全性
//由于这个原因,C#的List.ToArray每次都只能返回一个内部数组的拷贝,因此使用list存储数量较大较复杂的数据时
//不要轻易使用ToArray,直接用List就行了,它也支持下标索引方式取数组元素
const CInclass lst = null;
//2,readonly也不能实现常量对象的效果
//readonly仅表示变量本身不能被赋值,但不阻止通过对象变量更改对象内的字段
//onc.readonlyobj.fx = 20
public float fx = 20;
private readonly CInclass readonlyobj = new CInclass();
public static void Test()
{
//1,不能调用非静态字段或方法
//this._id = 20; //error,没有this指针
//2,可以调用常量字段
var lname = cname;
var onc = new CNormclass();
//私有变量在类的静态方法也可以访问
//2,虽然不能更改readonlyobj本身的值,却可以更改其内部成员的值,这就是readonly的作用
onc.readonlyobj.fx = 20;
}
}
static class C712//类中类,默认为私有
{//静态类不能实例化,且只能声明:常量,静态常量,静态属性,静态方法
public const int constX = 20; //1,常量
public static int staticX = 0; //2,静态常量
public static int ix { set; get; } //3,静态属性
//一,【静态类中不能定义实例化字段】
//public int _id;
//二,【静态类中不能定义实例化字段】
//void Ctest(){ //【error: 静态类中不能定义实例化方法】
// this._id = 20;
//}
static void Test()//4,静态方法
{
//三,【静态方法中不能调用非静态变量或方法,因为没有this指针】
//_id = 20; //error
//四,【可以调用常量字段,这与C++不同】
var c = constX;
}
}
public const int ixd = 20;
public static float fx = 20;
public void Testff()
{
fx = 30; //等价于Program.fx = 30,而不是 this.fx = 30;
Program.fx = 30;
var tx = C712.constX;
C712.staticX = 30;
var ix = Program.ixd;
//var oc7 = new C712(); //error 静态类不能创建实例
}