学习C#第二天

变量

变量是什么?

在数学中,我们对变量的概念有一定的了解和认识,如y=x^2,其中,x,y都是变量。

定义

一个变量就是存储区(内存)中的一个存储单元

变量的声明及初始化

使用变量的步骤

  1. 声明一个变量: 根据类型分配空间

    1. 根据指定的类型定义一个变量的名称

    2. 语法:

                  int money = 5;          //变量类型  变量名 = 数值;

                 int money1;              //变量类型 变量名;
                 money1 = 10;           //变量名 = 数值;

                 int money2, money3, money4;//变量类型 变量名1,变量名2,...,变量名n;

       

  2. 初始化变量: 将数据存入内存空间

  3. 使用变量: 取出数据的使用

变量的声明

声名变量就是创建一个变量,并给一个名字

变量的命名规则

  1. 变量名 = 首字母(字母或者下划线“_”)+ 其余部分(任意多的数字字母下划线“__”)。不能以数字开头,一些特殊符号也不能使用。汉字也可以作为变量名,但是不建议使用。

  2. 简短且能清楚的表明变量的作用,通常第一个单词的首字母小写,其他单词的首字母大写。例如:myScore

  3. 变量名不能与C#关键字冲突,例如:int static = 30;

  4. 变量区分大小写,两个同样的单词,大小写有差别的话不冲突。区分开来的

     

简单数据类型

值类型:直接存储值

简单类型
  • 数值型

    • 整数型

      sbyte、short、int、long。正负数都可存储

      usbyte、ushort、uint、ulong。只能存储正数

    • 浮点型:

      float a = 1.22f;//在值的后边加上f则为指定赋值为float类型
                 double b = 1.22d;//在值的后边加上d则为指定赋值为double类型
                 double c = 11.1;//double类型默认省去后缀d。其他类型不行
                 decimal d = 1.11m;//此类型时专门用来提供货币计算的,精度非常高,赋值时需要在后缀加M或m

       

  • 字符型

    • String

      String和string不区分大小写,和object差不多。最主要简化的作用时简化字符串操作。它是特殊的引用类型,它拥有不可改变性,它赋值之后数据不会改变,表面上的改变,实则是在内存中重新生成了另一个对象,并给予赋值。

    • char

      该类型基本用不到,我只知道java中的io流会用,C#初学完全用不到貌似

  • 布尔型

    • 布尔类型主要用于来表示true/false值,C#中定义布尔类型时,需要使用bool关键字,它的值只能是true或者false,它的默认值时false

    • true

    • false

引用类型:存储对值的引用

object类型

object = System.Object

object是所有类的基类。在定义其它类时,可以直接使用object提供的一些通用方法。

String类型

string = System.String

在简单类型中字符类型里记录过,不再详写。

引用类型就是引用别的类为自己所用,其中赋予的值是互通的,都存放在堆里边,而对象名(先创建需要引用的类的对象,才能引用该类中的数据)则存储在栈里边,指向对应的堆中的数据。值类型都存放在栈里边。

变量的初始化

给一个变量赋值,就是给该变量初始化。

变量的作用域

class Program
  {
   String str = "实例变量";//实例变量在类中,方法外创建的变量为成员变量。
   static String str2 = "静态变量";//静态变量
       static void Main(string[] args)
      {
           Program program = new Program();//先创建类的对象
           Console.WriteLine(program.str);       //然后通过类的对象来调用实例变量

           Console.WriteLine(str2);//直接调用静态变量
           int a =  0;//在方法体内创建的变量就是局部变量
           Console.WriteLine(a);//方法中使用局部变量可以直接调用

           Console.WriteLine();//无法使用另一个方法内的局部变量!!!
           Console.ReadLine();
      }
       static void Test()
      {
           int b = 2;
           Console.ReadLine();
      }
  }

引用类型和值类型的区别

值类型就是简单的一对一存储,都存储在栈中,不可互通。

引用类型则是多对一,引用数据存储单独在堆中,而需要引用该数据的对象名则存储在栈中,分别对应堆中的存储数据。堆中的存储数据改变后,每个引用该数据的对象都会发生变化。

class Program
  {
       static void Main(string[] args)
      {
           RefAndValue.Record();
           Console.Read();
      }
  }

   class Card                                         //1. 创建一个类
  {
       public string Name { get; set; }    //2. 给类中定义一个引用类型
       public int Age { get; set; }            //3. 再给类中定义一个值类型
  }
   static class RefAndValue                  //4. 再定义一个引用类型和值类型的对比类,来进行对比操作
  {
       public static void Record()           //5. 定义一个静态方法便于调用
      {
           Card card1 = new Card { Age = 18, Name = "张三" };//6. 创建一个Card的对象,并初始化
           Card card2 = new Card { Age = 20, Name = "赵四" };//7. 再创建一个Card对象,并初始化
           int age = card1.Age;                //8. 使用int对象来记录未修改前的值
           card1.Age = 30;                       //9. 对值类型修改,之后来查看是否会影响到另外的值

           Card card3 = card2;                 //10. 利用card2创建一个新的Card对象
           card2.Name = "王五";              //11. 修改card2中的引用类型,之后来查看是否会影响另外的值
           Console.WriteLine("card1的Age:" + card1.Age);
           Console.WriteLine("age:" + age);//分别查看俩个值是否一样

           Console.WriteLine("card2的Name:" + card2.Name);
           Console.WriteLine("card3的Name:" + card3.Name);//分别查看两个值是否一样
           //最后再在Main方法中调用来运行,查看结果以作对比。
      }
  }

 

使用变量时的一些错误

错误都是字面意思QAQ!!!,就不一一阐述啦,就是一些,命名错误,忘记赋值,赋值类型错误什么的。报错框都会写出来的

枚举

枚举相当于一种特殊的字段,它是值类型的数据。他主要是声明一种具有相同性质的常量,比如说我们经常使用的日期数据,我们可以把这些数据组织成多个不同名称的枚举字段

  1. 语法:访问修饰符 enum 枚举名{值1,值2,值3…}

  2. 枚举是一组描述性的名称

  3. 枚举定义一组有限的值。不能包含方法

  4. 对可能的值进行约束

  5. 枚举允许描述性名称表示整数值

    public enum MRKJ//定义一个枚举
      {
           Java = 1,
           C = 2,
           CS = 3,//如果不给予赋值的话,它会自动从1递增给予赋值。最后一个不用再加逗号,
      }
       class Program
      {
           static void Main(string[] args)
          {
               int i;
               Console.WriteLine((int)MRKJ.Java);//不加前置转换的话输出枚举字段,如果加前置转换的话会输出枚举字段自己的值。
               Console.Read();
          }
      }
  6. 在实际开发中,经常使用枚举来作为用户的使用权限,根据枚举字段所表示的用户权限来设置各级别的用户所拥有的不同的操作权限

数据类型的转换

  1. 自动转换

    1. 在某种条件下,系统自动完成类型的转换(即隐式类型转换)

      1. 两种类型兼容。例如:double兼容int类型

      2. 目标类型精度大于源类型。例如:double类型的精度大于int类型

  2. 显式类型转换(也叫做前置类型转换)

    1. (类型名)表达式 ;

      显式类型转换会丢失一些精度。操作方式为,在需要转换的数据前边加上括号,括号内写转换后的数据类型。例如

      int i = (int)(11.2+11.3);

      如果被转换的数据类型大于转换后的数据类型的区间,并不会报错,但是会溢出错误。比如说转换前是long类型转换成int类型是大于int的最大区间。转换后的值就会变成int最大区间的值。此时需要使用第二种显式类型转换。

    2. Convert.To类型名(表达式);

                  double a = 10.5;
                 int c = Convert.ToInt32(a);

      使用此方式,如果出现数据溢出的情况,他会报错提醒你。

    3. 类型名.Parse(表达式)

      此方法只针对数值类型来转换,其他的类型是没有这个方法的。

                  long a = 1111111111111111111;
                 int c = int.Parse(a.ToString());
  3. 装箱和拆箱

    1. 装箱

      1. 把值类型转换成引用类型被称为装箱操作

      2.             int a = 10;//定义一个值类型
                   object obj = a;//把值类型转换成引用类型,把值类型的变量,隐式的转换为Object的变量。
    2. 拆箱

      1. 把装箱好的object类型,显示转换成值类型

      2.             int a = 10;//定义一个值类型
                   object obj = a;//把值类型转换成引用类型,把值类型的变量,隐式的转换为Object的变量。
                   int b = (int)obj;//把装箱好的引用类型显式转化类型为值类型
      3. 执行拆箱操作时,转换的类型,必须和装箱时被转换的值类型的数据类型相同。装箱时为int,拆箱时也只能拆成int类型。

      4. 装箱拆箱对于程序的性能影响很大。装箱时需要重新创建一个全新的对象来存储它的值。这是肯定会比你直接赋值需要的时间多,拆箱时需要用到前置类型转换,需要的时间也很多。