C#学习基础

6

枚举

定义:它是一个被命名的整形常量的集合,一般用它表示状态,类型等等

声明枚举

我们使用enum 声明一个枚举类型,枚举名称一般用EE_ 开头后面跟上你的名字

我们需要在namespace或class,struct语句块中声明枚举,不能在函数语句块中声明。

enum E_name
{
    name,
    name1,
    name2,
}

枚举中包裹的整形常量的第一个默认值是1,下面的依次累加,比如name1就是1,name2就是2

enum E_name
{
    name = 5,
    name1,
    name2,
}

当然也可以给他赋值,下面就会从5开始累加

enum E_name
{
    name = 5,
    name1,
    name2 = 100,
    name3,
}

name3会从100开始累加

声明枚举变量

namespace Lesson1_第一个应用程序
{
    enum E_PlayerType
    {
        MainPlayer = 100,
        OtherPlayer = 101,
    }


    internal class Program
    {
        static void Main(string[] args)
        {
            E_PlayerType playerType = E_PlayerType.MainPlayer;

            if( playerType == E_PlayerType.MainPlayer )
            {
                Console.WriteLine("This is the main player.");
            }
            else if (playerType == E_PlayerType.OtherPlayer)
            {
                Console.WriteLine("This is another player.");
            }
            else
            {
                Console.WriteLine("Unknown player type.");
            }
        }
    }
}

枚举通常和Switch搭配使用

枚举类型转换

            //枚举和int互转
            int i = (int)playerType;
            //int 转枚举
            playerType = 0;
            //枚举和string互转
            string str = playerType.ToString();
            //string 转枚举
            playerType = (E_PlayerType)Enum.Parse(typeof( E_PlayerType ), "Other");

数组

数组名.Length 可以返回数组的长度

二维数组

int[,] arr = new int[2, 3] { { 1, 2, 3 }, { 1, 2, 3 } };

生成一个两行三列的二维数组

当然不在括号里面明确写出行和列,直接在花括号里面写也行

获取二维数组的行:array.GetLength(0)

获取二维数组的列:array.GetLength(1)

交错数组

定义: 交错数组是数组的数组,每个维度的数量可以不同,交错数组每行第列数可能不同

获取行列:

String

String虽然是引用数据类型,但是如果把一个String赋值給另一个数值,改动其中一个另一个并不会变,因为c#在底层对String作了特殊处理,每有改动都会开辟新的地址

函数

函数声明方式:

static 返回类型 函数名(参数类型 参数名)
{
    // 函数体
    return 返回值;
}

static不是必须的。

返回类型中void 表示没有返回类型。

函数名要使用帕斯卡命名法(所有单词开头都要大写)

ref out

            static void ChangeValueRef(ref int value)
            {
                value = 100;
            }
            int a = 10;
            ChangeValueRef(ref a);

我们在形参和实参前面都加上ref 关键字,这样在函数内部改变量的值,外面的值也会改变,用out 替换ref 也是可以的,用法和作用都是一模一样的。区别就是,ref 传入的变量必须初始化,但是用out 传入的不用初始化,out传入的变量必须在内部赋值

变长参数和参数默认值

           static void Sum(params int[] arr)
           {
               
           }

这样可以灵活接收不同数量的参数,然后这些参数都会存入arr中。一个函数中最多只能出现一个parmas关键字,并且一定要在最后一个参数,前面可以有n个其它参数

默认参数:

        static void Speak(string str = "test")
        {
            Console.WriteLine(str);
        }
        static void Main(string[] args)
        {
            Speak();
        }

但是有默认值的参数只能写在普通参数的后面,否则会报错

递归函数

递归函数就是函数调用自己

结构体

          struct 自定义结构体名
        {
            //第一部分 变量
            //第二部分 构造函数(可选)
            //第三部分 函数
        }

自定义结构体的命名也需要用帕斯卡命名法。

在结构体中声明的变量不能直接初始化。 在结构体中的函数方法不需要加static关键字。在函数中可以直接使用结构体内部声明的变量。

结构体的用途是封装多个相关字段的数据

结构体中的构造函数名称必须和结构体名称相同,且内部的变量必须变量初始化。结构函数里面的变量前面需要加上this

namespace Lesson1_第一个应用程序
{
    internal class Program
    {
        struct Student
        {
            int age;
            bool sex;
            int number;
            string name;
            public Student(int age, bool sex, int number, string name)
            {
                this.age = age;
                this.sex = sex;
                this.number = number;
                this.name = name;
            }

            public void Speak(string word)
            {
                Console.WriteLine(word);
            }
        }
        static void Main(string[] args)
        {
            Student s = new Student(18, true, 1, "张三");
            s.Speak("Hello, World!");
        }
    }
}

访问修饰符

如果不加修饰符,那么就是默认是私有的(private),其他地方用不了,如果想让外部访问就需要用public关键字