C#编程自学之数据类型和变量一

一、数据类型与变量的介绍
在程序运行的过程中计算机需要记录大量的状态 数据(这里我们统称数据)。那这些数据都存放在哪呢?程序在运行过程中的数据一般都存放在内存。那么他们在内存中如何存放的一种描述就是数据类型。变量则就是数据类型的实体。那么我们来看一个例子: 假如现在需要设计一个程序计算整数 10 与 20 的和, 请看如下代码:

using System; 

namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      //变量的定义格式:
      //数据类型 变量名 赋值运算符 值
      int a = 10; // 定义一个整数类型的变量a 并赋值10
      int b = 20; // 定义一个整数类型的变量b 并赋值20 

      int c = a + b;//定义一个整数类型的变量b 赋值为 a + b 的和 

      Console.WriteLine("10 + 20 = "+c.ToString());//打印结果
    }
  }
}

分析: 首先要计算整数10与20的和,肯定需要有地方来放(在内存中存储)它们,既然计算整数那么我们就用整数的数据类 型int 定义名字为a 和 b的变量来分别存放10 和 20,在通过加法运算符将和存放在变量c中。调用我们之前了解过的控制台类将结果输出到控制台显示出来,这里要注意c.ToString(), 因为我们计算的是整数,所使用变量的类型都是整数,而控制台输出的是字符串,所以我们需要将调用int类型的一个行为ToString()将自己转换为字符串类型!这部分将在数据类型的第三篇中介绍!

二、C#基本数据类型与变量

1.数据类型

C#的数据类型分为两类:一种是值类型 一种是引用类型 (值类型与引用类型将在数据类型的第二篇中介绍),那么我们来看看C#的常用数据类型。

2.匿名类型

了解C#常用的基础数据类型以后,我们在来看看匿名类型,什么是匿名类型呢?
匿名类型:匿名类型就是在变量初始化后根据所赋的值来判断它属于哪个类型。不明白没关系,举个例子:

using System; 

namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int a = 20; //定义一个整数类型的变量
      char b = 'A';//定义一个字符类型的变量 

      var _intType = 20; //定义一个匿名类型的变量 给赋值一个整数数字 20
      var _charType = 'A'; //定义一个匿名类型的变量 给赋值一个字符 A 

      Console.WriteLine(" a 的数据类型为:{0}",a.GetType().ToString()); //打印出变量a的数据类型
      Console.WriteLine(" b 的数据类型为:{0}", b.GetType().ToString()); //打印出变量b的数据类型 

      Console.WriteLine(" _intType 的数据类型为:{0}", _intType.GetType().ToString());//打印出变量_intType的数据类型
      Console.WriteLine(" _charType 的数据类型为:{0}", _charType.GetType().ToString());//打印出变量_charType的数据类型
    }
  }
}

首先看 9 ~ 10行,定义了一个整数类型的变量a赋值为20和一个字符类型的变量b为赋值为A,那么 a与b的数据类型分别为整数类型(System.Int32与System.Char).
接着看 12 ~ 13行,定义了两个匿名类型的变量为: _intType,_charType,分别给 _intType赋了一个整数的值为20,给_charType赋了一个字符为A。在程序运行之前编译器会根绝变量所赋的值来自动判断数据类型。
程序执行结果如下:

提示:匿名类型变量在编译后确定数据类型之后,在程序作用域内该变量的数据类型不可改变!

3.变量与变量的作用域
变量:经过上面的例子与介绍应该已经对变量不陌生了,变量就是数据类型的实例。真正用来存放数据的内存空间或存放数据内存空间地址。
作用域:作用域就是程序使用该变量的一个范围。一般变量作用域的边界是由符号{与}来划定界限的,也就是说在{}内定义的变量,就只能在{}内部来调用。
C#的作用域可分为两种级别:
1.类属性级别:当变量定义为类的属性是,变量的作用域为整个类的内部可访问。
2.局部级别:当变量被定义在方法或者语句块中,变量的作用域为最近的{}之间可访问,局部级别的变量必须初始化。
关于作用域的问题:
1.当一个类定义的变量(属性)与该类方法中定义的局部变量重名时会怎么样?
答:当前作用域中的变量与上级作用域中的变量重名时,以当前作用域中的变量为准。
2.当一个类定义的变量(属性)重名或者类方法中定义的局部变量重名时会怎么样?
答:同一个作用于中不能出现相同名称的变量
参考代码:

class MyClass
{
  int a = 10; 

  public void MyMethod()
  {
    int a = 20; //方法内部变量与类属性变量 a同时出现时, 以当前方法内(作用域的变量为准)
    Console.WriteLine("a:{0}",a); //输出结果为20 

    int a = 30; // 编译错误,同一个作用域内不可以出现相同名称的变量
  }
}

三、数据类型默认值与初始化
C#中类定义属性可以不用初始化,那么他们的值分别是什么呢? 未赋值的变量会被自动赋予一个合适的默认值。
例如:
int 类型(数值类型)默认值为0
bool 类型 默认值为false
char 类型 默认值为 ‘\0'
我们还可以在定义类属性是就初始化他们的值,也可以通过类的构造函数来初始化类属性

class MyClass
{
  public int a = 10; //第一种初始化方法在定义是就赋值
  public bool b; //默认值为false
  public MyClass(bool c)
  {
    b = c; //通过构造函数初始化类属性
  }
} 

class Program
{
  static void Main(string[] args)
  {
    MyClass mc = new MyClass(true);//通过构造函数传入true 赋给参数bool类型变量c = true
    Console.WriteLine("mc->a :{0}", mc.a.ToString());
    Console.WriteLine("mc->b :{0}",mc.b.ToString());
  }
}

输出结果如下:

四、静态变量
静态变量就是通过类级别去调用,无需创建类型的对象就可以用的变量。
静态变量关键字: static
定义格式: [static 数据类型 变量名]
实例代码:

using System; 

namespace MyProgram
{
  class MyClass
  {
    public int a = 10; //变量a为对象级别属性
    public static int b = 20; //变量b为类级别属性
  } 

  class Program
  {
    static void Main(string[] args)
    {
      MyClass mc = new MyClass();
      int a_Mc = mc.a; //变量级别需要创建对象MC后通过MC(对象)来访问 

      int b_MyClass = MyClass.b; //类属性可直接通过类名访问无需创建对象 

      Console.WriteLine("mc->a :{0}", a_Mc);
      Console.WriteLine("MyClass->b :{0}", b_MyClass);
    }
  }
}

运行结果如下:

五、常量
常量就是不能被改变的变量,常量只能定义在类属性级别,常量也必须是静态的,并且在定义时就初始化赋值,常量一旦被初始化后就不可以在改变,任何对常量改变语句都将引起编译器错误。因为常量定义时就要赋值所以常量类型只能声明给值类型(值类型与引用类型下篇讲解)。
常量的定义格式: [const 数据类型 变量名]
代码:

using System; 

namespace MyProgram
{
  class MyClass
  {
    public const int a = 10; //定义常量a
    public const bool b = false; //定义常量b
  } 

  class Program
  {
    static void Main(string[] args)
    {
      int a_Const_MyClass = MyClass.a; //常量必须是静态的,通过类名访问 

      bool b_Const_MyClass = MyClass.b; //常量必须是静态的,通过类名访问 

      Console.WriteLine("MyClass->a_Const :{0}", a_Const_MyClass.ToString());
      Console.WriteLine("MyClass->b_Const :{0}", b_Const_MyClass.ToString()); 

      //任何试图修改常量的动作都会引起编译错误
      MyClass.a = 20;
      MyClass.b = true;
    }
  }
}

正确操作运行结果如下:

修改常量提示错误如下:

六、只读与静态只读
回顾下常量在声明时必须初始化赋值,那么如果我想在运行的时候才赋值怎么办?那么不用怕C#为我们提供了只读类型关键字为:readonly ,只读类型跟常量类似也是赋值后就不可以改变,但与常量不同的是它不是强制静态的,也就是只读类型是对象级别来访问的。
只读类型定义方式:[readonly 数据类型 变量名]
那么如何让他成为静态的? 很简单在前面我们已经介绍过静态的关键字static
静态只读类型定义方式:[static readonly  数据类型 变量名]
代码:

using System; 

namespace MyProgram
{
  class MyClass
  {
    public readonly int a = 10; //定义只读变量a
    public static readonly bool b = false; //定义静态只读变量b
  } 

  class Program
  {
    static void Main(string[] args)
    {
      MyClass mc = new MyClass();
      int a_ReadOnly_MC = mc.a; //只读变量是非静态的,由对象级别访问 

      bool b_StaticReadOnly_MyClass = MyClass.b; //静态只读变量是类级别变量,有类名访问 

      Console.WriteLine("a_ReadOnly_MC : {0}",a_ReadOnly_MC);
      Console.WriteLine("b_StaticReadOnly_MyClass :{1}", b_StaticReadOnly_MyClass); 

      //任何对只读类型的修改都将引起编译错误
      mc.a = 20;
      MyClass.b = true;
    }
  }
}

正确操作运行结果如下:

修改只读变量错误如下:

七、需要注意的细节
1.变量作用域是否可以出现相同变量名?
答:相同作用域时,变量不可以重名,在当前作用域与上级作用域的变量重名时,以变量所在作用域为主。
2.常量是否可以在对象级别访问?
答:常量不可以在对象级别访问,常量默认为静态的,由类级别访问。
3.常量(const)与(readonly)只读的区别?
答:相同点:是都是赋值后就不可以改变,
不同点:
1.Const 必须在声明时就赋值,readonly 可以在初始化过程中赋值.
2.Const只可以修饰值类型,而readonly可以修饰任意类型.
3.Const是类级别访问,readonly是对象级别访问

以上讲解的类的属性都代表成员变量,希望对大家的学习有所帮助。之后还有相关文章继续更新,希望大家继续关注。

(0)

相关推荐

  • C#使用SqlBulkCopy批量复制数据到数据表

    本文实例讲述了C#使用SqlBulkCopy批量复制数据到数据表的方法.分享给大家供大家参考.具体实现方法如下: 使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据 1.使用Datatable作为数据源的方式: 下面的代码使用到了ColumnMappings,因为目标表和数据源Datatable的结构不一致,需要这么一个映射

  • C#编程自学之数据类型和变量二

    我们继续自学C#编程教程,在上一课中介绍了C#的基本数据类型以及变量,今天这一节课我们来介绍值类型与引用类型! 一.什么是值类型与引用类型? C#与大多数面向对象语言数据类型一样,分为值类型与引用类型两种?如何区分这两种类型?如图: 根据类型结构图我们得出: 1.值类型包括 内置数据类型如(int double float) 用户自定义值类型(struct 结构体) 枚举(emun) 2.引用类型包括 接口类型 类类型等等. 知道了那些类型属于值类型与那些类型属于引用类型之后,我们来分析一下值类

  • C#编程自学之数据类型和变量三

    了解了数据类型与变量的基本概念之后,我们来讨论数据类型的转换与装箱与拆箱!装箱和取消装箱使我们能够统一地来考察类型系统,其中任何类型的值最终都可以按对象处理. 一.数据类型转换 在编程时 我们有时候会遇到将一个类型的变量转换成另一种数据类型,我们称它为数据类型的转换,C#数据类型的转换有两种方式如下: 1.默认安全的数据类型转换 默认安全的数据类型转换:我们称之为 隐式的数据类型转换,什么是隐式的数据类型转换?隐式的数据类型转换就是数据类型的低范围(参考C#数据类型与变量一中的数据类型的范围)向

  • C# Bitmap 复制的小例子

    复制代码 代码如下: public Bitmap CopyBitmap(Bitmap source){    int depth = Bitmap.GetPixelFormatSize(source.PixelFormat); if (depth != 8 && depth != 24 && depth != 32)    {        return null;    } Bitmap destination = new Bitmap(source.Width, sou

  • C#编程自学之运算符和表达式

    我们了解完C#数据类型与变量之后,还会遇到变量之间的运算,例如计算两个数的和等等运算.那么,C#中都有那些常用的运算符呢?那么,往下看吧! 一.算数运算符 1.基本算数运算符 说到算数运算符,我们首先就应该可以想到我们数学中一些常用的运算符例如:加 减 乘 除 求余! 那么在C# 这些运算符都是如何表示的呢? 知道C#基本运算符的表示之后我们该如何去使用呢?那么我们来看段代码来看下什么是表达式. int a = 10; //定义一个整形变量a 值为10 int b = 20; //定义一个整形变

  • C# 对文件与文件夹的操作包括删除、移动与复制

    在.Net中,对文件(File)和文件夹(Folder)的操作可以使用File类和Directory类,也可以使用FileInfo类和DirectoryInfo类.文件夹(Folder)是只在Windows操作系统中使用的名词.在操作系统的理论中,人们更习惯于使用目录(Directory)这个名词.或许微软为了有朝一日将.Net移植到其他的操作系统中(实际上也有很多人也在做着这个项目),所以还是以Directory来命名操作文件夹的类. File类和Directory类都是静态类.使用它们的好处

  • c#根据文件大小显示文件复制进度条实例

    初学者,照着书上的抄袭制作,但已经理解了里面的意思和应用,并且进行了稍微改善和异常捕捉.这里记录下,以防以后用到这方面的知识点. 窗体设计: code: 复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.

  • C#装箱和拆箱原理详解

    .NET包含一个特殊的Object类,可以接受任意的数据类型的值,当所传递或所赋值的类型不是一个特定的数据类型时,object类就提供了一种传递参数和赋值的通用方法.赋给object的值必须作为引用类型,并存放砸托管堆中. 装箱: int age = 24; object refAge= age; 可以看的出,第一条语句创建一个变量age,并将值放在托管栈中: 第二条语句将age的值赋给引用类型.它将值24放在托管堆中. 这个值类型包装为引用类型的过程,称为装箱. 拆箱: 相反,将引用类型转换为

  • C#进行文件读写、创建、复制、移动、删除的方法

    本文实例讲述了C#进行文件读写.创建.复制.移动.删除的方法.分享给大家供大家参考.具体分析如下: 1.文件夹创建.移动.删除 //创建文件夹 Directory.CreateDirectory(Server.MapPath("a")); Directory.CreateDirectory(Server.MapPath("b")); Directory.CreateDirectory(Server.MapPath("c")); //移动b到a D

  • C#中深度复制和浅度复制详解

    本文章主要是讲解C# 语言编程中,深度复制和浅度复制,下面我将通过一个实例进行讲解.在实例开发之前,我们得先知道深度复制是什么和浅度复制是什么,它们之间的区别又是什么,下面将为大家一一揭晓. 1.深度复制是什么? 深度复制就是引用类型的复制. 2.浅度复制是什么? 浅度复制是值类型的复制. 以下是C#中深度复制和浅度复制的实例代码引用片段: using System; using System.Collections.Generic; using System.Text; namespace T

  • ASP.NET深度复制和浅度复制分析

    本文深入浅出的分析了ASP.NET深度复制和浅度复制.分享给大家供大家参考.具体分析如下: 之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉. 如果大家不懂值类型和引用类型的区别,请先看http://www.jb51.net/article/57471.htm,本来想自己写的,但刚好看到了这篇写的非常全面,就不自己写了. 大家都知道Object是所有类共同的基类,其有个方法是MemberwiseClone(),其用途为 我们可以通过这个方法来达到浅

随机推荐