C# 基础-类型、变量、和表达式

一、数据类型

  C#两种数据类型:值类型和引用类型。值类型的变量直接包含他们的数据,每个变量都有他们自己的数据副本(ref和out除外),因此对一个变量操作不可能影响另一个变量。而引用类型的变量存储对他们的数据的引用,引用类型也成为对象,对于引用类型两个变量可能引用同一个对象,因此对一个变量的操作可能影响对另一个变量所引用的对象。

1、值类型:

 

  值类型细分为:简单类型、枚举类型、和结构类型

  引用类型细分为:类类型、接口类型、数组类型、和委托类型

       

  注意:值类型直接包含他们的数据,值类型的实例要么在堆栈上,要么内联在结构中,将一个值类型变量赋给另一个值类型变量时,将复制包含的值,引用类型变量赋值只复制对象的引用,不复制对象本身 ,值类型不可赋值null,引用类型可以赋值为null;

  堆栈:值类型作为方法字段其数值存在内存栈中,作为对象字段其数据存在内存堆中。引用类型存放与堆栈中,其值存在堆中,值在内存堆中的引用地址存放在内存堆中

2、枚举类型:指具有一组命名常量的独特值类型

  emum Color

  {

  Red,

  Green,

  Blue

  } 

  枚举类型定义规则及修饰符:

(new,public,protected,internal,private) enum 名称:整数类型(没有指定整数类型 默认int)

  例如:public enum Color:int {}

3、 结构类型:像类一样,包含数据成员和函数成员的数据结构,但是与类不同,结构是值类型,不需要堆分配。结构类型的变量直接存储该结构的数据,而类类型的变量则存储对动态分配的对象的引用。结构类型不支持继承,所有结构类型都隐式从类型object继承。使用struct关键字定义,通常用来封装小型相关变量组,对于具有值语义的小型数据结构特别有用,相比类可以大大节省应用程序分配的内存。

  结构构造函数也是使用new运算符调用,但不分配内存,结构构造函数直接返回结构值本身(通常是堆栈上的一个临时位置),然后根据需要赋值该结构值。相对与类,两个变量引用同一个对象,对一个对象的操作会影响两一个对象,结构不会,因为操作是数据的副本。

      结构类型可包含的成员:构造函数、常量、字段、方法、属性、索引器、运算符、事件(同时具备以上成员,应考虑用类)

      结构可以实现接口,无法继承另一个结构。

二、引用类型

  引用类型存储是对值的内存地址的引用,位于堆上。引用类型主要包含字符串、数组、类、接口和委托类型。

1、字符串:规则字符串,和逐字字符串(以@开头,比如:string path=@"C:\temp\demo\test.txt")

2、类:是最基础的数据类型。类是一个数据结构,将(状态)字段和操作(方法和其他函数成员)组合在一个单元中,类动态创建实例成为对象,类的实例用new关键字创建,该运算符为新的实例分配内存,调用构造函数初始化该实例并返回对该实例的引用。不在使用该对象时,该对象所占用的内存,将被GC(.net内置垃圾回收机制)自动回收并释放。 如:Student stu=new Student();

 3、接口:定义了一个可由类和结构实现的协定。接口可包含成员:方法、属性、事件、索引器。接口不提供它所定义的成员的实现,它仅指定实现它的类或结构必须提供的成员。

  接口可以继承接口,一个类可以实现多个不同接口,但是只能继承一个父类。

  当类或者结构实现某个特点接口的时候,该类或结构的实例可以隐式地转换为该接口类型。例如:IPerson(接口),man(实现接口IA的类)

  man m=new man();

  IPerson ps=m;

  在无法静态知道某个类是否实现某个接口的情况下,可以强制转换

  Object obj=new man();

  IPerson ps=(IPerson)obj

  C#还支持显式接口成员实现,使用完全限定的成员名,比如:IPson 里面有个无返回值的eat()方法,man类实现IPson接口

  public class man:IPerson

  {

    void IPerson.eat(){...}    //避免将成员声明为public

  }

       显式成员接口只能通过接口类型来访问,列如:

  man m=new man();

  IPerson ps=m;

       ps.eat();

4、委托类型:表示对具有特定参数列表和返回类型的方法的应用,通过委托我们能将方法作为实体赋值给变量和作为方法的参数传递(作为方法参数传递的是方法体,而不是方法的返回值),委托它不知道也不关心它所引用的方法的类,它所关心的仅是所引用的方法和委托是否具体相同的参数和返回类型

5、装箱和拆箱:值类型的值通过装箱和拆箱操作按对象处理,以object为桥梁,值类型转换为引用类型(装箱-隐式转换),引用类型转换为值类型(拆箱-显式转换)

   当将值类型的值转换为object类型时,将分配一个对象实例(箱子)以包含该值,并将复制到该箱子中。反过来,将一个object引用强制转换为值类型时,将检查所引用对象是否含有正确的值类型,如果有,则将箱子中的值复制出来。

   装箱转换允许将值类型隐式转换为引用类型。存在下列装箱转换

  • 从任何值类型(包括任何枚举类型)到类型object.
  • 从任何值类型(包括任何枚举类型)到类型System.ValueType
  • 从任何值类型到值类型实现的任何接口类型(结构)
  • 从任何枚举类型到System.Enum类型

  装箱包括以下操作:分配一个对象实例,然后将值类型的值复制到该实例中。

  拆箱转换允许将引用类型显式转换为值类型。存在以下拆箱转换

  • 从类型object到任何值类型(包括任何枚举类型)
  • 从类型System.ValueType到任何值类型(包括任何枚举类型)
  • 从任何接口类型到实现了该接口类型的任何值类型
  • 从System.Enum类型到任何枚举类型  

  拆箱包括以下操作:首先检查对象实例是否已为给定值类型的一个装了箱的值,然后将该值从实例中复制出来。

三、变量和常量

  1、变量用来保持特定的值或者计算结果,在变量中可以存储各种类型信息,变量必须先定义后使用

  2、常量就是其值固定不变的量,用const关键字声明,常量名称所有字母大写,字段首字母小写,属性首字母大写,字段和属性命名用驼峰法即可。

    比如:public const int YEARS=12;

四、表达式

  1、表达式由操作数和运算符组成

  2、操作符:一元操作符,如:i++   二元运算符,如:z=x+y  三元运算符 ,如:y=x>0?x:1(也叫三目运算符)

     is 操作符用于动态地检查运行时对象类型是否和给定类型兼容,多用于判断语句比如if,如:1 is int    返回true

     as 操作符用于引用转换或装箱转换将一个值显式地转换成指定的引用类型,as 转换不会产生异常,若转换失败,结果为null.

     自增和自减操作符有前后缀之分,对于前缀操作符“先增减,后使用”,而后缀操作符相反,“先使用,后增减”

posted on 2021-08-07 20:46  ~程序源~  阅读(150)  评论(0编辑  收藏  举报