C#新手可以继续往下看,基本功扎实的老鸟可以出门右转,0.0。
问题:
①变量、对象、(类型)实例这几个概念放在一起会搞混吗?
②那么引用类型(对标——值类型)、声明类型、实例类型这几个概念放在一起又会搞混吗?
探究:
下面是对于上述概念进行理解的一个例子(下方代码中的ValueClass不是本篇重点)。
class MyProgram
{
class RefrenceClass
{
public int field;//字段
public RefrenceClass() { }
public RefrenceClass(int i) { }
}
struct ValueClass
{
const int MaxVlaue = Int16.MaxValue;//const可以声明简单类型的常量。 不能有其他结构类型的常量
static readonly ValueClass2 OtherValueClass;//static readonly可以声明简单类型的常量,也可以是其他结构类型的常量
//const ValueClass2 valueClass2;//CS0283、CS0145 error
private static List<int> ValueList;
struct ValueClass2 { }
static ValueClass()
{
ValueList = new List<int>();
OtherValueClass = new ValueClass2();
}
int CurrentIndex;
int NextValue()
{
return CurrentIndex > 0 && CurrentIndex < ValueList.Count - 2 ? ValueList[CurrentIndex + 1] : -1;
}
}
static void Main()
{
int x = 1;
int y = 1;
int i = x++;
int j = ++y;
RefrenceClass c;
//首先RefrenceClass是一个类型
//变量c是在方法Main中声明的一个局部变量
//变量c的声明类型是RefrenceClass(RefrenceClass是一个引用类型,所以c是一个引用类型的变量)
c = new RefrenceClass();
//①new RefrenceClass()以"RefrenceClass类型的公共无参构造函数"创建了一个(类型)实例
//②并将该"实例的引用"(被称为对象)存储在变量c中
//③即变量c中存储的对象是在①中创建出的实例
//④RefrenceClass是这个实例的实例类型
c = new RefrenceClass(1);
//①new MyClass()以"RefrenceClass的包含一个int类型参数的构造函数"创建了一个(类型)实例
//②同上②
//③同上③
//④同上④
}
}
结语:
那么,以下是根据本人认识做出的总结(如有错误,烦请指出):
①C#中的类型分为引用类型(如我们自定义的类)和值类型(如结构类型和枚举类型)。
引用类型有类类型、接口类型、数组类型或委托类型。值类型有结构类型或枚举类型。
②变量使用时需要先进行声明,变量声明由两部分组成:声明类型(声明类型可以为值类型或引用类型)+变量名称。
③被声明为引用类型的变量,其值是一个对象,这个对象是对某个类型的一个实例的引用。
注意:被声明为值类型的变量和对象这一概念无关,值类型的赋值是把值类型一个实例的副本交由变量存储。(只有通过装箱操作把值类型的实例显示转换为引用类型Object后所对应的值才能称为对象)。参考:C#——类型
④实例类型,就是赋予变量值的对象,所引用的实例,被创建时所调用的类型构造函数所属的类型。(有点拗口,才疏学浅还请见谅,即:typeof(变量的值=对象->实例))
注意:根据面向对象六大原则的里氏替换原则,任何基类出现的地方其派生类都可以出现,所以声明类型是基类的变量,可以被赋值为派生类的实例,导致我们所讲的声明类型和实例类型不相同。