服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#编程自学之数据类型和变量一

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

2021-10-29 12:13C#教程网 C#

本节课我们将学习C#编程语言的数据类型,数据类型可以分为值类型和引用类型,接着介绍变量的使用方法和作用域等内容,为了方便大家理解,我们还会举一些小例子作为说明。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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#的常用数据类型。

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

2.匿名类型

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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。在程序运行之前编译器会根绝变量所赋的值来自动判断数据类型。
程序执行结果如下:

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
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'

我们还可以在定义类属性是就初始化他们的值,也可以通过类的构造函数来初始化类属性

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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());
  }
}

输出结果如下:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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);
    }
  }
}

运行结果如下:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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#编程自学之数据类型和变量一

修改常量提示错误如下:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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;
    }
  }
}

正确操作运行结果如下:

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

修改只读变量错误如下:

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

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

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

延伸 · 阅读

精彩推荐
  • C#VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解

    VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软...

    张信秀7712021-12-15
  • C#SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...

    蓝曈魅11162022-01-20
  • C#深入理解C#的数组

    深入理解C#的数组

    本篇文章主要介绍了C#的数组,数组是一种数据结构,详细的介绍了数组的声明和访问等,有兴趣的可以了解一下。...

    佳园9492021-12-10
  • C#如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴...

    bbird201811792022-03-05
  • C#三十分钟快速掌握C# 6.0知识点

    三十分钟快速掌握C# 6.0知识点

    这篇文章主要介绍了C# 6.0的相关知识点,文中介绍的非常详细,通过这篇文字可以让大家在三十分钟内快速的掌握C# 6.0,需要的朋友可以参考借鉴,下面来...

    雨夜潇湘8272021-12-28
  • C#C#微信公众号与订阅号接口开发示例代码

    C#微信公众号与订阅号接口开发示例代码

    这篇文章主要介绍了C#微信公众号与订阅号接口开发示例代码,结合实例形式简单分析了C#针对微信接口的调用与处理技巧,需要的朋友可以参考下...

    smartsmile20127762021-11-25
  • C#C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    这篇文章主要介绍了C#设计模式之Strategy策略模式解决007大破密码危机问题,简单描述了策略模式的定义并结合加密解密算法实例分析了C#策略模式的具体使用...

    GhostRider10972022-01-21
  • C#利用C#实现网络爬虫

    利用C#实现网络爬虫

    这篇文章主要介绍了利用C#实现网络爬虫,完整的介绍了C#实现网络爬虫详细过程,感兴趣的小伙伴们可以参考一下...

    C#教程网11852021-11-16