C/C++/C# Note

C/C++/C# Note

Falling_Sakura HaHa

三种语言的相似之处有很多,先后学了 c++ c c#,把一些之前不知道的东西记录一下,写过很多遍的就不整理了。

变量

枚举类型

c++/c#

枚举 enum 是一种用户定义的类型,它由一组命名的整数常量组成。枚举类型的主要目的是提高代码的可读性和可维护性,特别是在处理一组相关的常量时。

示例

1
2
enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };
eDirection dir;

这里就定义了一个枚举类型 eDirection,和这个类型的一个变量 dir,它只可以取其中这些常量的值。

里面的值可以设定,默认是递增的。

访问即 dir.LEFT,这样可以使代码更直观

conio.h

c++

_kbhit()

如果有键盘输入,则返回 1.

否则返回 0.

它是非阻塞的,这点与 _getch() 不同。

_getch()

从控制台中读取单个字符,不需要回车键。

且读取的字符不会在控制台中显示。

Class

c#

静态变量

关键字 static

每一个 class 都有它的变量、函数等。

对象实例

如果是 static 类型的变量,那么无需为这个 class 实例化(即创建一个对象)便可以修改它的值。

示例:

1
2
3
4
5
6
7
public class Myclass {
static int staticNum;
int num;
}
Myclass myclass = new Myclass();
myclass.num = 6;
Myclass.staticNum = 6;

访问修饰符

  • public

修饰类时,代表它可以被任何文件的任何代码访问。

修饰成员时,表示这个对象可以在任何位置被访问。

  • private

只能修饰成员,表示这个变量只可以在对象内部被访问。

  • internal

类或成员只能被一个程序集中的代码访问,类的默认修饰符。

  • protected

子类可以访问,而外部不可访问。

Class 与 Struct

它们的区别在何处?

class 变量储存的是地址,而 sruct 变量储存的是值。

也就是说,如果将一个 class 赋值给另一个 class,那么这两个 class 所指向的是相同的变量。

而如果把一个 struct 赋值给另一个 struct,那么这两个 struct 是两个值相同的不同的变量。

同样,当 class 作为形参传入一个函数时,它的值会受到函数内修改的影响,因为访问的都是同一个地址。

struct 作为值只是复制了一份传入函数,函数内修改的是复制体,并不会影响到外面的值。

struct 使用 ref 关键字,即取地址,即可实现和 class 一样的效果。


struct 不能继承 struct 或者 class,无法被继承,只能继承接口。

class 可以继承一个父类,也可以继承接口。

继承

public class A : B 表示类 A 继承类B,A 是子类,B 是父类,子类可以使用父类中的变量。

而如果子类中某个函数不想使用父类中的函数,可以采用 override 关键字重新定义这个函数。

1
2
3
public override void fn() {
...
}

同时需要在父类的这个函数中添加 virtual 关键字表示这个函数允许被重写。

1
2
3
protected virtual void fn() {
...
}

需要注意,父类变量可以存储子类变量的值,但子类变量不可以存储父类变量的值。

所有类型的基类是 object

Partial

在类前加上此关键字可以在各个文件中写这个类,并且它们最终会合并在一起。

1
2
3
public partial class p {
...
}

接口

在类前加上 interface 便可以作为一个接口。

接口内定义若干方法,而不定义它们的实现,且不能添加访问修饰符,默认 public

接口只提供声明,不提供实现。

所以继承接口后需要给出它相应的实现。

Abstract

添加 abstract 的类无法被实例化,并且可以暂时不实现接口。

abstract 也可以修饰函数,只声明不实现,留给子类实现。

抽象类中可以实现接口。

类只能继承一个抽象类。

抽象类也可以自己声明函数、属性并实现。

泛型

1
2
3
4
5
public class GV<T> {
public T x;
public T y;
}
GV<int> giv = new GV<int>();

这样就可以实现同一份代码的不同类型。

泛型方法:

1
2
3
4
public void Attack<T>(T a, T b) where T : Actor{
a.Attack();
b.Attack();
}

需要说明这个泛型继承自哪个类,否则默认就是 object

函数

函数指针

使用 delegate 声明一个类型,它可以储存多个相同形式的函数并依次执行,通过 +=-= 控制里面的函数。

包括这个函数的类型,形参等。

1
2
3
4
5
6
7
8
9
10
11
12
13
delegate float CalcFn(float v1, float v2);

float Add(float a, float b) {
return a + b;
}
float Mul(float a, float b) {
return a * b;
}

CalcFn p = Add;
p(1f, 2f);
p += Mul;
p(1f, 2f);

相当于一个函数集合。

Func<T1, T2, TResult> 表示一个委托类型,前面几个是输入参数的类型,最后一个是返回值的类型。

Action<T1, T2> 是无返回值

  • Title: C/C++/C# Note
  • Author: Falling_Sakura
  • Created at : 2024-06-05 21:00:00
  • Updated at : 2024-11-21 10:44:39
  • Link: https://vercel.fallingsakura.top/edeb27c6.html
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments