您现在的位置是:首页 >技术交流 >C#基础知识大总结(在C语言的基础上)网站首页技术交流

C#基础知识大总结(在C语言的基础上)

丹牛Daniel 2023-07-12 16:00:04
简介C#基础知识大总结(在C语言的基础上)

前言

本文为C#基础知识,是在有一定C语言或C++基础上进行的总结,因此会省略许多C语言的基础知识,但是对一些C#特有或者是C语言中比较少见或重要的知识也会归纳到博文里。

承接上文C#入门知识https://blog.csdn.net/danielxinhj/article/details/130401403

目录

一、复杂数据类型

1.枚举

a.定义

b.声明

c.枚举的类型转换(不常用)

2.数组

a.交错数组(几乎不用 有兴趣可了解)

二、值与引用

1.特殊引用类型string

三、函数

1.有参有多返回值函数

四、ref和out

1.ref是函数参数的修饰符

2.out也是函数参数修饰符

五、变长参数和参数默认值

1.变长参数关键字 

2.参数默认值

六、函数重载

七、结构体

1.访问修饰符

2.结构体构造函数


一、复杂数据类型

两种类型:

  1. 数据集合:多个数据(变量)集合在一起构成的数据。
  2. 自定义:可以自己取名字,自定义的数据(变量)。

包括:枚举、数组、结构体

1.枚举

a.定义

是一个被命名的整型常量的集合 一般便是状态、类型

//枚举名 以E或者E_开头,作为我们的命名规范
enum E_自定义枚举名
{
    自定义枚举项名字1, //默认第一个值是0 下面依次累加
    自定义枚举项名字2,
    自定义枚举项名字3,
}

如果自己给其中一个枚举项赋了值,那么后面的项都会在此基础上递增,除非人为的再次改变

b.声明

  • 一般在namespace语句块当中声明 
  • 可以在class语句块中
  • 可以在struct语句块中
  • 不能在函数中声明!!!

公式:自定义的枚举类型 变量名 = 默认值; (自定义的枚举类型.枚举项)

enum E_PlayerType
{
    Main, //默认第一个值是0 下面依次累加
    Other,
}
E_PlayerType playerType = E_PlayerType.Main;

枚举和switch语句非常适合,switch括号中写上常量,后面会自动补全。

c.枚举的类型转换(不常用)

// 枚举和int互转
int i = (int)playerType;
Console.WriteLine(i);

// 枚举和string相互转换
string str = playerType.ToString();
Console.WriteLine(str);

// string转为枚举
// Parse后 第一个参数:你要转为的是哪个 枚举类型 第二个参数:用于转换的对应枚举项的字符串
playerType = (E_PlayerType)Enum.Parse(typeof(E_PlayerType),"other");

2.数组

与C语言中数组原理相同

a.交错数组(几乎不用 有兴趣可了解)

二、值与引用

引用类型有:string、数组、类

值类型:除引用类型之外如char、int、short、bool和结构体等一系列

1.特殊引用类型string

每次赋值、拼接都会在堆中重新分配空间

三、函数

基本与C语言相通

1.有参有多返回值函数

static int[] Calc(int a,int b)
{
    int sum = a + b;
    int avg = sum / 2;
    int[] arr = {sum, avg};
    return arr;
    //return new int[] {sum, avg}; //也可直接在return中新建数组返回
}

四、ref和out

1.ref是函数参数的修饰符

static void ChangeValue(ref int value)
{
    value = 3;
}

//调用函数时
int a = 2;
ChangeValue(ref a);

2.out也是函数参数修饰符

和ref使用上一模一样

// 如果不加out或ref 函数内的赋值便无法影响到外部
static void ChangeValue(out int[] arr)
{
    arr = new int[] {1,2,3};
}

int[] arr1 = {10,20,30};
ChangeValue(out arr1);

但ref和out也有区别,在于:

  • ref传入的变量必须初始化            out不用
  • out传入的变量必须在内部赋值     ref不用
int a;
ChangeValueRef(ref a);//会报错!必须初始化
ChangeValueOut(out a);//不会报错

五、变长参数和参数默认值

1.变长参数关键字 

params int[] 意味着可以传入n个int参数 n可以等于0 传入的参数会存在arr数组当中

注意:

  • params关键字后面必为数组
  • 数组的类型可以是任意一个类型
  • 函数参数可以有别的参数和params修饰的参数
  • 函数参数中最多只能出现一个params 并且一定要是放在最后的参数
//求n个整数和的函数
static int Sum(params int[] arr)
{
    //利用for循环求数组内的数字和即可
}

//调用时
Sum(1,2,3,4,5,6);//可以传任意多个参数

2.参数默认值

有参数默认值的参数一般称为可选参数

当调用函数时可以不传入参数,不传就会使用默认值

如果要混用 那么可选参数必须写在普通参数后面

static void Speak(string str = "还没有话语")
{
    console.WriteLine(str);
}

//调用时可以不传入参数
Speak();

六、函数重载

要求:

  • 同一语句块(class或struct)
  • 函数名相同
  • 参数数量不同
  • 参数数量相同但类型或顺序不同
static int CalSum(int a,int b)
{

}

//这两个函数也不不能同时出现,即使其中一个用的是可选参数
static int CalSum(int a , int b = 1)
{

}

七、结构体

结构体一般写在namespace语句块中

关键字是struct

struct 自定义结构体名
{ 
    //变量

    //构造函数(可选)

    //函数
}

写一个学生结构体的实例

struct Student
{
    string name;
    int age;
    bool sex;
    int id;

    // 注意结构体中的方法 目前不需要加static
    void Speak()
    {
        //可以使用前面声明的变量
    }

}

1.访问修饰符

修饰结构体中的变量和方法 能否被外部使用

public是公共的  private是私有的(默认都是私有的)

2.结构体构造函数

  • 没有返回值
  • 函数名与结构体名相同
  • 必须有参数
  • 声明了构造函数就必须在其中对所有变量数据初始化
//student结构体内要写的构造函数
public student(int age, bool sex, int number, string name)
{
    this.age=age;
    this.sex=sex;
    this.number=number;
    this.name=name;
}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。