【C#学习教程】变量

数据类型

在 C# 中,变量是用来存储数据值的容器,也是我们学习任何计算机语言,首先需要掌握的内容,而且在C#中,有着丰富的数据类型,大致可以分为两大类:值类型(Value Types)和引用类型(Reference Types)。

值类型(Value Types)

值类型存储在内存的栈(Stack)上,它们直接包含数据,比如数字、字符串、布尔值等:

  • 整数类型

    • byte:无符号 8 位整数,取值范围 0 ~ 255
    • sbyte:有符号 8 位整数,取值范围 -128 ~ 127
    • 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
  • 浮点类型

    • float:单精度 32 位浮点数。取值范围-3.40E+38 ~ +3.40E+38
    • double:双精度 64 位浮点数,取值范围-1.79E+308 ~ +1.79E+308,在使用的过程中建议默认使用此类型进行浮点数计算
    • decimal:具有高精度的 128 位十进制浮点数,适用于需要高精度的金融计算
  • 字符类型

    • char:存储单个 Unicode 字符,范围从 '0' 到 'z' 或其他文化字符,具体,可以自己去查询,小光在这里给大家准备了链接:Unicode 符号表,大家可以自行去进行查看。
  • 布尔类型

    • bool:存储布尔值 true 或 false
  • 结构体(Struct)

    • struct:自定义的数据结构,可以包含值类型和引用类型的成员。

引用类型(Reference Types)

引用类型存储在内存的堆(Heap)上,它们的作用更多地是进行数据引用,比如我们下面看到的类、数组,委托等

  • 类(Class)

    • class:定义对象的蓝图,可以包含数据成员、方法、属性、事件等。
  • 接口(Interface)

    • interface:定义方法、属性、事件的签名,可以被类实现。
  • 数组(Array)

    • array:存储固定大小的同类型元素集合。
  • 委托(Delegate)

    • delegate:可以存储对方法的引用,用于事件处理和回调。
  • 字符串(String)

    • string:用于存储文本,是不可变的字符序列

有关C# String类型究竟是值类型还是引用类型,C#初学者或多或少都会有困惑,和大家说个例子:

class Class1   
{   
    static void StrChange(string str)   
    {   
      str = "hello guang";   
    }   
 
    static void Main()   
    {   
      string str = "333";//申明一个字符串   
      StrChange(str);//调用方法   
      Console.WriteLine(str);//输出字符串   
    }   
}   

大家都知道,这个程序输出的结果是 "333" 。

那么,string 到底是值类型还是引用类型?

有人会说,如果是值类型,结果倒还说的过去,但是string 的定义是引用类型,如果是引用类型的话.输出的结果难度不应该是: "hello guang"么?

破局的关键在于:C# string类型是特殊的引用类型,它的实例是只读的。

这个地方要搞清楚语法和实现的区别 。在C#的语法中,

◆static void StrChange(string str) 是值传递

◆static void StrChange(ref string str) 是引用传递

但在实现上,static void StrChange(string str) 这种值传递,在函数体内对str进行修改之前,与函数外部的变量指向同一块内存,是“引用”传递,但在函数体内对str修改后,就会触发对该str重新分配一块内存。

所以说,String 是引用类型,不过是不可变的。对字符串做操作(比如大小写的转换、使用“+=”等), 实际上是重新创建了字符串。这也是为什么在做大量字符串拼接的时候要使用StringBuilder 而不用+=。

有关C# String类型做为引用类型的特别之处,可以看下面这个例子,大家就能发现String类型其实是个引用类型:  

private void button2_Click(object sender, EventArgs e)   
      {   
          string str="pikaqiu";   
 
          string str1 = str;  
 
          str = "pankeding";

          //注释掉此名就"yes",否则"no".这就说明str重新赋值的时候,   
          //其实是重新创建了一个名为str的字符串(内存中指向的位置是不同的)
          //先前 的那个str你就再也看不到了. 
  
          string str2 = str;   
        
            
          
          if (object.ReferenceEquals( str1,str2))   
          {   
              MessageBox.Show("yes");   
          }   
          else   
          {   
              MessageBox.Show("no");   
          }   
      }  

变量声明

介绍完我们的变量类型,接下来让我们一起去看看如何给他们进行声明。 

其实变量声明也不难,变量声明包括指定变量的类型和名称:

int age;
double salary;
string name;

这样就能够声明变量啦,在后面的代码里我们就可以使用它们。

变量命名规则

  • 标识符必须以字母、下划线(_)或 @ 符号开始

    • 字母包括 Unicode 字母,可以是任何语言的字母字符。
  • 后续的字符可以是字母、下划线、数字(0-9)

    • 这意味着变量名一旦开始,就不能包含空格或特殊字符(除了下划线)
  • 区分大小写

    • Variable 和 variable 是两个不同的变量名
  • 不能使用 C# 关键字

    • 例如,变量不能使用 classpublicstatic 等关键字作为变量名
  • 不能使用保留字

    • 除了 C# 关键字,还有保留的类型名称也不能用作变量名,如 intstringdouble 等
  • 使用描述性的名称

    • 变量名应该清楚地描述变量的用途或存储的数据类型。
  • 遵循命名约定

    • C#有一套命名约定,比如 PascalCasing(帕斯卡命名法)用于类和方法名,camelCasing(驼峰命名法)用于局部变量和方法参数。
  • 避免使用过长的名称

    • 变量名应该简洁且具有描述性,但不应过长。
  • 避免使用缩写

    • 除非缩写是广泛认可的,否则最好使用完整的单词。
  • 使用名词或形容词

    • 变量名通常使用名词或形容词,而方法名可以使用动词或动词短语。

以下是一些符合 C# 命名规则的变量名,帮助大家理解:

int studentCount;       // 描述性的名称
string FirstName;        // 使用帕斯卡命名法
double PiValue;         // 使用名词
bool IsEligible;         // 使用形容词
int _counter;           // 使用下划线作为前缀
int counter1;           // 使用数字,但尽量避免仅以数字命名
string @name;           // 使用 @ 符号允许变量名以数字开头或包含空格

以下是不符合 C# 命名规则的变量名,大家尽量不要这样起名:

int 1stStudent;         // 以数字开头
string -name;           // 使用减号
double 3.14;            // 包含数字和点号
string student name;    // 包含空格
string student-name;    // 包含减号
string Student_Name;    // 包含下划线(尽管技术上可行,但不符合帕斯卡命名法)

变量初始化

在 C# 中,变量初始化是指在声明变量时或声明后立即赋予它一个初始值。初始化是可选的,但一个好的编程实践是在变量声明时立即初始化,这样可以避免在使用变量之前忘记初始化而导致的潜在错误。

关于不同变量初始化,它们的方式也有所不同,让我们一起来看看:

基本数据类型初始化

int myNumber = 10;      // 整数初始化为 10
double myDouble = 3.14;  // 浮点数初始化为 3.14
bool myBool = true;      // 布尔值初始化为 true
char myChar = 'A';       // 字符初始化为 'A'
string myString = "Hello World"; // 字符串初始化为 "Hello World"

引用类型初始化

对于引用类型,如类、数组等,初始化通常意味着分配内存。

List<int> mylist = new List<int>(); // 创建一个整数列表的实例
string[] myArray = new string[5];   // 创建一个包含 5 个字符串的数组

使用对象初始化器

对于复杂的对象,可以在创建对象的同时初始化其属性。

var person = new Person
{
    Name = "John Doe",
    Age = 30
};

使用集合初始化器

对于集合类型,如列表和字典,可以在声明时初始化其元素。

var numbers = new List<int> { 1, 2, 3, 4, 5 };
var points = new Dictionary<string, int>
{
    ["x"] = 1,
    ["y"] = 2
};

未初始化的变量

如果你声明了一个变量而没有初始化,它的默认值将取决于它的数据类型。对于值类型,如整数和浮点数,它们会被初始化为其类型的默认值(例如,int 为 0,double 为 0.0)。对于引用类型,如类和数组,它们会被初始化为 null

int uninitValueType; // 默认值为 0
Person uninitReferenceType; // 默认值为 null

静态和实例变量的初始化

在类中,你可以在字段声明时初始化静态或实例变量。

public class MyClass
{
    public int InstanceField = 10; // 实例变量初始化
    public static int StaticField = 20; // 静态变量初始化
}

常量初始化

常量必须在声明时初始化,并且一旦赋值后不能被修改。

const double Pi = 3.14159; // 常量初始化

初始化变量是编程中的一个重要步骤,它确保了变量在使用前已经被赋予了合适的值,从而避免错误发生。

以上就是我在学习变量时候的一些笔记,希望对大家有用,与君共勉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光酱ZG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值