71muke?v=1
在线看书
立即购买

第一章 前言

收起
2024-07-22更新,每天更一篇

第二章 C#简介

收起
2024-07-22更新,每天更一篇

第三章 C#的基本语法

收起
2024-07-22更新,每天更一篇

第四章 C#控制语句

收起
2024-07-22更新,每天更一篇

第五章 异常处理

收起
2024-07-22更新,每天更一篇

第六章 面向对象编程

收起
2024-07-22更新,每天更一篇

第七章 C#中提供的工具类

收起
2024-07-22更新,每天更一篇

第八章 C#实战

收起
2024-07-22更新,每天更一篇

C#的变量

C# 数据类型和变量

在 C# 中,数据类型用于定义变量的类型,变量是用于存储数据的容器。C# 是一种强类型语言,这意味着每个变量都必须有一个明确的数据类型。以下是 C# 中常见的数据类型和变量的使用方法。


一、什么是变量?


变量是一个存储数据值的容器,它在程序运行过程中可以被修改。在程序中,通过使用变量名来访问和操作变量所存储的数据。每个变量都有一个特定的数据类型,该类型决定了变量可以存储哪种类型的数据(如整数、小数、字符、字符串、对象等)以及可以对其执行的操作。

特点

  • 可变性:变量的值在程序执行过程中可以改变。例如,在一个计算购物总价的程序中,商品的数量可能会根据用户的选择而变化,这个数量就可以存储在一个变量中,每次用户添加或减少商品时,变量的值都会更新。

  • 有类型约束:不同类型的变量有不同的取值范围和操作规则。例如,整型变量不能存储字符串类型的数据。在 C# 中,int 类型的变量用于存储整数,string 类型的变量用于存储文本字符串。

在编程中的作用

  • 数据存储与操作:方便在程序中存储各种数据,如在游戏开发中,可以用变量存储玩家的分数、生命值、游戏角色的坐标等信息。通过修改变量的值来实现游戏状态的改变,比如玩家获得奖励时分数增加。

  • 参数传递:在函数或方法调用中,变量可以作为参数传递。

变量使用的理解

可以理解自己去出差需要入住酒店,你相当于是数据,酒店房间相当于内存空间,数据类型相当于房间类型(大床房、双人间、三人间)等。这样做目的是为了方便数据管理和维护。


二、数据类型介绍

值类型

值类型变量直接存储数据。这意味着当你将一个值类型变量赋值给另一个同类型的变量时,实际上是将值复制给了新变量。因此,两个变量在内存中存储的是独立的值,修改一个变量不会影响另一个变量。

image.png


引用类型

引用类型变量存储的是对数据的引用(即内存地址),而不是数据本身。当你将一个引用类型变量赋值给另一个同类型的变量时,实际上是复制了引用(即内存地址),而不是数据本身。因此,两个变量都指向内存中的同一个对象,修改其中一个变量所引用的对象会影响到另一个变量。

image.png

两者的区别

主要区别:在于它们在内存中的存储方式以及它们的行为方式。

值类型:存储在 栈空间 ——系统分配,自动回收,小而快

引用类型:储存在 堆空间——手动申请和释放




栈结构:

栈是一种后进先出(LIFO, Last In First Out)的数据结构,用于存储元素且只允许在一端(栈顶)进行添加或删除操作。

这里写图片描述

堆结构:

堆是一种常用的树形结构,是一种特殊的完全二叉树,当且仅当满足所有节点的值总是不大于或不小于其父节点的值的完全二叉树被称之为堆。

这里写图片描述


三、变量的声明和初始化

变量是用于存储数据的命名容器,必须先声明然后才能使用。

使用示例:

// 声明和初始化整数类型变量
int age = 25;

// 声明和初始化浮点类型变量
float height = 5.9f;
double weight = 70.5;

// 声明和初始化布尔类型变量
bool isStudent = true;

// 声明和初始化字符类型变量
char grade = 'A';

// 声明和初始化字符串类型变量
string name = "Alice";

// 声明和初始化数组类型变量
int[] numbers = { 1, 2, 3, 4, 5 };

// 声明对象类型变量
object obj = new object();


C#变量命名规则如下:

  • 变量名必须以字母、下划线或@开头:后续字符可以是字母、数字、下划线。例如,_name@valueage都是合法的开头形式。不过,一般不建议使用@开头,它主要用于一些特殊场景,如使用关键字作为标识符时。

  • 区分大小写myVariablemyvariable是不同的变量名。

  • 不能是C#关键字:像classintif等关键字不能直接用作变量名,但可通过添加前缀或使用@来作为变量名(如@int,不过这种情况应尽量避免)。

  • 尽量使用有意义的名称:变量名应能清晰地反映变量所存储的数据内容,增强代码的可读性,比如studentNamex更易理解。


变量的定义和使用示例:

image.png


四、变量作用域

变量的作用域决定了变量的可访问性。


局部变量:在方法、构造函数或块中声明,只能在声明它的范围内访问。


使用示例:

public void MyMethod()
{
    int localVar = 10; // 局部变量
    Console.WriteLine(localVar);
}



成员变量:在类或结构中声明,作用域为整个类或结构。

使用示例:

public class MyClass
{
    private int memberVar; // 成员变量

    public void MyMethod()
    {
        memberVar = 20;
        Console.WriteLine(memberVar);
    }
}



静态变量:使用 static 关键字声明,属于类本身而不是类的实例,作用域为整个程序生命周期。

使用示例:

public class MyClass
{
    public static int staticVar; // 静态变量

    public void MyMethod()
    {
        staticVar = 30;
        Console.WriteLine(staticVar);
    }
}


使用示例:

//命名空间的使用,相当于文件夹,文件夹不同,里面的文件名一样也不会冲突,这个就是命名空间的作用
namespace FirstProjectTest
{
    // 定义一个类,后面的面向对象重点讲解,这里先知道类可以有属性和方法
    public class Program
    {
        //定义一个变量,可以赋值使用就是属性
        //public int age;
        //public string name;
        //当我们定义一个变量,不赋值(age=10)、用等号(=)表示赋值含义,它会为null(空值)
        public char sex = '男';
        public double height;
        public static string name = "李四";

        //static 静态关键字,当程序运行前,就要先把这个Main方法存储到内存中
        public static void Main(string[] args)
        {
            name = "王五"; //如果这个变量是静态关键字修饰的,那么在静态方法中可以使用。但是在普通方法中不可以使用!
            Console.WriteLine("Hello, World!");
            //实例化类再使用
            Program p = new Program();
            //调用类的方法
            p.useVar();
            p.say();
        }
        //变量的定义和使用(先声明,再初始化)
        public void useVar()
        {
            //访问静态关键字修饰的变量,可以用下面的语法访问【类名.静态变量名 或者 类名.静态方法】
            Console.WriteLine("名字是:"+Program.name);

            height = 170.0;
            //定义一个整数
            int age; //声明了一个变量age,但是没有入住
            age = 20;
            int num = 10; //声明了一个变量num,让10入住
            byte a = 1;
            short b = 2;
            long c = 100;

            Console.WriteLine("房间age的值是:" + age);

            //定义小数
            float _f = 10.1f;
            double @d = 20.00;
            decimal A = 10.88m;
            //变量命名不允许以数字开头(上面的这些命名规则,在类的定义和方法定义都使用)
            bool a2 = true;
            bool a3 = false;
            //单字符类型,需要用 单引号括起来这个值
            char cc = 'c';
            //字符串类型 =》 引用类型(当我们要存储多个值在内存中的时候,都是使用引用类型来存储)类、接口、委托、字符串
            //提示:如果是字符串声明和定义,那么我们需要使用的是双引号括起来内容
            string name = "张三";
            Console.WriteLine("我的名字是:"+name);
            //不能用关键字来命名变量名
            // int class = 10;
        }

        //还支持方法
        public void say()
        {
            height = 190.0;
            //变量在使用时会有作用域问题:
            //1、变量在方法内定义时,只能在该方法内使用,在别的方法中调用时,会报错!
            //2、全局变量(成员变量)、属性,可以在其他方法中使用这个变量,但是不能在static关键字修饰的方法中使用!!
            //3、静态成员变量可以在静态方法中直接通过【变量名】使用,也可以在普通方法中 通过 【类名.静态成员名】 访问
            //Console.WriteLine("age="+a);
            Console.WriteLine("我说:你好!"+sex+","+height);
        }

    }
}

五、控制台的输入方法

  • Console.ReadLine()

    • 功能:从标准输入流(通常是键盘)读取一行文本。当用户按下回车键时,输入结束,并将读取到的字符串返回。

    • 示例

      string input = Console.ReadLine();
      Console.WriteLine("你输入的内容是: " + input);
    • 注意事项:读取的内容是字符串类型,如果需要其他类型的数据,需要进行类型转换。例如,如果要读取一个整数,可以使用int.Parse()int.TryParse()方法。

  • Console.Read()

    • 功能:从标准输入流读取一个字符的 ASCII 码值(返回值是int类型)。如果没有可用的字符,则会阻塞程序,直到有输入为止。

    • 示例

      int asciiCode = Console.Read();
      char character = (char)asciiCode;
      Console.WriteLine("你输入的字符是: " + character);
    • 注意事项:它每次只读取一个字符的 ASCII 码值,对于读取大量文本不太方便。而且如果需要将读取的值作为字符处理,需要进行类型转换。

六、控制台输出

  • Console.WriteLine()

    • 功能:将指定的数据输出到控制台,并在末尾添加一个换行符。它可以输出各种类型的数据,包括基本数据类型(如intdoublebool等)和引用类型(如string)。

    • 示例

      int number = 10;
      string text = "Hello, World!";
      bool flag = true;
      Console.WriteLine("数字: " + number);
      Console.WriteLine("文本: " + text);
      Console.WriteLine("布尔值: " + flag);
    • 用法细节:当输出对象类型时,会调用对象的ToString()方法来获取要输出的字符串表示。如果要自定义输出格式,可以重写对象的ToString()方法或者使用格式化字符串。例如:Console.WriteLine("数字的格式化输出: {0:D3}", number);,这里{0:D3}表示将第一个参数(number)以十进制形式输出,且至少占 3 位宽度(不足 3 位前面补 0)。

  • Console.Write()

    • 功能:将指定的数据输出到控制台,但不会添加换行符。它的参数使用方式和Console.WriteLine()类似。

    • 示例

      Console.Write("这是没有换行的输出");
      Console.Write(" 继续输出");
    • 应用场景:当需要在同一行连续输出多个内容时使用,比如构建动态更新的控制台界面或者格式化表格形式的输出。

image.png

七、C#注释的使用

1. 单行注释

使用//符号,从//开始到本行末尾的内容都会被视为注释,编译器会忽略这部分内容。例如:

int num = 10; // 这是一个定义整数变量的语句,这里的注释用于说明变量的用途

2. 多行注释

使用/* */符号来包裹注释内容,可以跨越多行。例如:

/*
以下是一个计算两个数之和的方法
这个方法接受两个整数参数并返回它们的和
*/
int Add(int a, int b)
{
    return a + b;
}

需要注意的是,多行注释不能嵌套,例如下面的代码是错误的:

/*
这是一个外层注释
/* 这是一个内层注释,这样会导致错误 */
这里是外层注释的继续
*/

3. XML注释

这种注释方式主要用于生成文档。以///开头,通常用于对类、方法、属性等代码元素进行详细的描述。例如:

/// <summary>
/// 这个类表示一个简单的用户信息
/// </summary>
class User
{
    /// <summary>
    /// 用户的姓名
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 用户的年龄
    /// </summary>
    public int Age { get; set; }
}

当使用合适的文档生成工具(如 Visual Studio 中的相关功能)时,可以根据这些 XML 注释生成清晰的代码文档,方便其他开发人员理解代码的功能和使用方法。

使用示例:

image.png


八、C#的转义字符

以下是 C#中常见转义字符的语法表格:

转义字符含义示例
\n换行符,将光标移到下一行的开头Console.WriteLine("第一行\n第二行");
\r回车符,将光标移到当前行的开头string text = "abc\rdef"; //结果为 defc(覆盖了前面的部分)
\t水平制表符,用于在输出中创建水平间隔Console.WriteLine("姓名\t年龄");
\v垂直制表符Console.Write("a\vb");(在文本模式下垂直方向有一定间隔效果)
\f换页符较少使用,在某些打印相关场景有意义
\\反斜杠字符本身string path = "C:\\Windows";
\"双引号字符Console.WriteLine("他说:\"你好\"");
\0空字符(ASCII 码值为 0)在字符串操作中可能有特殊用途,比如初始化字符数组
\a警报(响铃)字符,在某些终端环境可能产生声音Console.Write("\a");(可能会发出提示音)

使用示例:

image.png


练习题

编写一个 C#程序,声明并初始化以下变量:

  • 一个short类型的变量,表示学生的成绩(假设成绩范围是 -32768 到 32767),初始值为 85。

  • 一个float类型的变量,表示一个圆的半径,初始值为 3.5f(注意这里的f后缀表示float类型)。

  • 一个string类型的变量,表示一本书的名字,初始值为"Effective C#"。

然后,在控制台输出这些变量的值,格式如下:

成绩:[成绩值] 圆半径:[半径值] 书的名字:[书名]



留言

发布留言

需要购买本课才能留言哦~

{{ item.createtime | dateStr }}
×