C#学习(二)变量与常量

本文详细介绍了C#中的变量声明与赋值、数据类型(值类型、引用类型、枚举和常量)、作用域(成员变量和局部变量)、以及类型转换的基本概念,帮助初学者理解C#的基础语法和内存管理。

一、变量的声明与赋值

变量可以存储特定类型的数据,且可以随时调用和改变存储值。

变量由类型,名称和值构成

1.变量的声明

变量在使用之前必须先声明,需要指定变量的类型和名称。

C#中可以同时声明多个变量,不同变量名之间由逗号隔开,以分号结束。

int num;
string str1,str2,str3;

上面的代码声明了一个整形变量和3个字符串变量。声明变量的同时也可以初始化变量,即对变量进行赋值:

int a = 1;
string c = "Hello"

 声明变量时,变量的命名也有一定规范:

1.变量只能由数字、字母和下划线组成。

2.变量名的第一个符号只能是字母和下划线,不能是数字。

3.不能使用关键字作为变量名。

4.一旦在一个语句块中定义了一个变量名,那么在变量的作用域内都不能再定义相同名称的变量。

2.变量的作用域

变量的作用域指程序代码能够访问该变量的区域,在该区域之外访问变量,则编译时会出现错误。根据变量的作用范围,可将变量分为成员变量的和局部变量

1.成员变量

成员变量是属于类或结构体的变量。成员变量用于存储对象的状态或数据,并在类的实例化过程中分配内存。它们定义了类的特征或属性。

成员变量又可分为两种,即实例变量和静态变量:

实例变量: 属于类的实例,每个对象都有自己的一组实例变量。这些变量在类的实例创建时被分配内存。

静态变量: 属于类而不是类的实例。所有该类的实例共享相同的静态变量。静态变量在程序启动时分配内存,直到程序结束时才释放。

实例变量的作用域为整个类。在成员变量类型前加上static关键字,就成为了静态变量,其作用域可以跨类,在其他类内可以通过“类名.静态变量”的方式使用。

2.局部变量

在类的方法体中定义的变量,即在方法内部代码中声明的变量。局部变量只在当前定义的方法内有效。当方法被调用时,C#编译器为方法中的局部变量分配内存空间;调用结束后,会释放空间并销毁局部变量。

需要注意的是,局部变量在声明时必须初始化,即给定一个初始值。

public class Example
{
    // 成员变量
    private int instanceVar = 10;

    public void ExampleMethod()
    {
        // 局部变量
        int localVar1 = 5;
        string localVar2 = "Hello";

        // 在这里可以使用 localVar1 和 localVar2,但不能在类的其他地方使用它们

        // 使用局部变量和成员变量
        int sum = localVar1 + instanceVar;
    }
}

3.数据类型

1.值类型

值类型直接包含其数据的实际值,而不是引用指向对象的地址。值类型在栈上分配内存,并且它们的变量直接包含数据的实际值。以下是值类型的一些主要特点:

  1. 栈上分配内存: 值类型的实例通常在调用栈上分配内存空间。这使得值类型的创建和销毁速度较快,因为它们的生命周期通常与包含它们的代码块的执行时间相匹配。

  2. 直接包含数据: 值类型的变量直接包含实际数据的值,而不是引用指向数据的内存地址。这使得值类型的复制是对实际数据的复制,而不是引用的复制。

  3. 默认初始化: 值类型的变量在声明时会被默认初始化为其零值。例如,int 类型的变量默认初始化为0,bool 类型的变量默认初始化为false

1.整数类型 

sbyte   有符号8位整数。   范围:-128 ~ 127。

byte     无符号8位整数。   范围:0 ~ 255。

short    有符号16位整数。范围:-32,768 ~ 32,767。

ushort  无符号16位整数。范围:0 ~ 65,535。

int        有符号32位整数。范围:-2,147,483,648 ~ 2,147,483,647。

uint:      无符号32位整数。范围:0 ~ 4,294,967,295。

long      有符号64位整数。范围:-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807。

ulong    无符号64位整数。范围:0 ~ 18,446,744,073,709,551,615。

在选则数据类型时,要注意数值的大小,防止运算溢出:

 static void Main(string[] args)
 {
     byte a = 256;
     int b = 256;
     Console.WriteLine("a = {0}",a);
     Console.WriteLine("b = {0}",b);
}

编译后会出现错误:

这是因为byte类型的变量范围为0~255,256超出了此范围,所以会报错。

2.浮点类型

浮点类型主要存储有小数的数值,包含float和double两种类型。

float 32位单精度浮点数。

范围:约 ±1.5 x 10^-45 到 ±3.4 x 10^38。

float myFloat = 3.14f;

注意:需要在数字后面加上 'f' 表示为 float 类型

double 64位双精度浮点数。

范围:约 ±5.0 x 10^-324 到 ±1.7 x 10^308。

double myDouble = 3.14;
 3.布尔类型

布尔类型有true和false两个值,不能与其他类型数据相互转换。

2.引用类型

在C#中,引用类型是一种数据类型,它不直接包含实际的数据,而是存储一个指向对象在堆内存中的地址的引用。这意味着引用类型的变量存储的是对象的引用,而不是对象本身的实际数据。

以下是代码示例:

​
using System;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public void DisplayInformation()
    {
        Console.WriteLine($"Name: {Name}, Age: {Age}");
    }
}

class Program
{
    static void Main()
    {
        // 创建引用类型的实例
        Person person1 = new Person("John Doe", 25);

        // 调用引用类型的方法
        person1.DisplayInformation();

        // 修改引用类型的属性
        person1.Age = 26;

        // 创建另一个引用类型的实例
        Person person2 = new Person("Jane Doe", 30);

        // 调用另一个引用类型的方法
        person2.DisplayInformation();

        // 注意:person1 和 person2 是引用类型的变量,它们存储的是对象在堆内存中的地址
    }
}

​

相比于值类型,引用类型有一些关键的区别:

引用类型存储在堆内存中,其本身存储的是对象在堆内存中的地址,并通过引用传递。传递的是对象在堆内存中的地址。而值类型存储在栈内存中,直接包含其数据的实际值,通过值传递。传递的是实际数据的副本。

引用类型默认初始化为 null,表示不引用任何对象。值类型默认初始化为相应类型的零值。

3.枚举类型

枚举类型通常用来声明一组具有相同性质的常量。

定义枚举类型时,如果不对其进行赋值,默认第一个枚举值为0,后面每个值依次递增1.

C#中使用enum关键字声明枚举类型:

enum 枚举名
{
    list1=value1,
    list2=value2,
    ...
    listN=valueN,
}

 以下是枚举类型的实际应用:

public enum DayOfWeek
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

class Program
{
    static void Main()
    {
        // 使用枚举类型变量
        DayOfWeek today = DayOfWeek.Wednesday;

        Console.WriteLine($"Today is: {today}");

        // 判断今天是否是周末
        if (today == DayOfWeek.Saturday || today == DayOfWeek.Sunday)
        {
            Console.WriteLine("It's the weekend!");
        }
        else
        {
            Console.WriteLine("It's a weekday.");
        }
    }
}

输出结果为:

Today is: Wednesday
It's a weekday.

4.类型转换

1.隐式转换

隐式转换不需要声明,比如将int类型转换为long类型:

int a = 100;
long b = a;

2.显式转换

显式转换也称为强制转换,需要在代码中明确声明要转换的类型。如在将高精度变量转换成低精度变量时,就需要使用显式转换。

实际上,强制转换可以将任何数值类型转换为其他类型。

示例代码如下:

class Program
{
    static void Main()
    {
        int intValue = 42;

        // 显式将整数转换为双精度浮点数
        double doubleValue = (double)intValue;

        Console.WriteLine($"Original Integer Value: {intValue}");
        Console.WriteLine($"Converted Double Value: {doubleValue}");
    }
}

5.常量

常量就是固定不变的量。C#中使用关键字const定义常量。创建常量时必须设置初始值。以下是定义一个整型常量的示例:

const int = 5

如果修改常量的值,程序就会报错。

2024年3月6日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值