c#
1、VSCode调试C#无法在控制台输入(解决方案)**
- 在调试->配置 里面 把 “console”: “internalConsole”,注释掉 或者改成 "integratedTerminal"这样可以在其他终端进行调试,就可以输入了
2、初始化一个Console项目
- cd到目标目录
- 执行dotnet new console
- 该命令在文件夹中创建一个Program.cs文件,其中已经编写了一个简单的“ Hello World”程序,以及一个名为HelloWorld.csproj的C#项目文件。
- 使用dotnet run 区运行项目
3、属性和字段
- 访问性不同
- C#中属性:C#中属性是限制只能给变量赋于某个范围的值,是有限制的访问私有变量。
- C#中字段:C#中字段是自由的、毫无限制的访问公有变量。
- 包含不同
- C#中属性:C#中属性中包含两个块:set和get,set块负责属性的写入工作,get块负责属性的读取工作。
- C#中字段:C#中字段中不包含set和get两个块,可以直接进行字段写入和读取。
- 安全性不同
- c#中属性:c#中属性应为是私有的,写入和读取需要调用set和get块,所以当不在本类中使用是可以保证使用属性的安全性
- c#中字段: 没有属性那样在读取和写入时不需要调用set和get亏啊,不在本类中使用时不安全
4、部分类和部分方法
- 部分类就相当于是把一个大的类拆开了
- 部分方法的使用不多,
- 需要注意一下几点部分方法必须是私有的,并且不能使用 virtual、abstract、override、new、sealed、extern 等修饰符。
- 部分方法不能有返回值。
- 在部分方法中不能使用 out 类型的参数
5、拆箱和装箱
-
**在 C# 语言中数据类型分为值类型和引用类型,
-
将值类型转换为引用类型的操作称为装箱,
-
相应地将引用类型转换成值类型称为拆箱。
-
int类型是值类型string类型是引用类型**
-
int val = 100; object obj = val; Console.WriteLine("对象的值 = {0}", obj); //这是一个装箱的过程,是将值类型转换为引用类型的过程 int val = 100; object obj = val; int num = (int) obj; Console.WriteLine("num: {0}", num); //这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程
-
-
6、c#锯齿形数组
-
//锯齿形数组 数据类型[][] 数组名 = new 数据类型[数组长度][]; 数组名[0] = new 数据类型[数组长度];
-
数组的遍历可以使用for和foreach
- foreach的缺点foreach循环的时候会释放使用完的资源,所以会造成额外的gc(垃圾手机)开销,所以使用的时候,请酌情考虑
- foreach也称为只读循环,所以再循环数组/集合的时候,无法对数组/集合进行修改。
- 数组中的每一项必须与其他的项类型相等.
7、类和结构体
结构体 | 类 |
---|---|
允许不使用new对其进行实例化 | 必须使用new实例化 |
没有默认的构造方法 | 有默认的构造方法 |
不能继承类 | 能继承类 |
没有析构方法 | 有析构方法 |
不允许使用abstract、protected以及sealed修饰 | 允许使用 |
-
结构体在new方法的时候会调用隐式的构造函数,这个构造函数会为所有结构体字段赋值
- 为值类型的字段赋0
- 为引用类型的字段赋null
-
结构体在定义的时候不能赋值
-
最大的区别是 结构体是值类型,类是引用类型
-
我们必须在结构体的构造函数中,为所有结构体字段赋值下面是一个例子
-
struct Rectangle { private int width; private int heigth; public Rectangle(int width) { this.width = width; Console.WriteLine("....") } }
-
以上代码会有以下错误
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gHvyXN01-1584676930328)(G:\大三下学习资料\ecojapan\image-20200316235546561.png)]
-
泛型
对于引用类型的变量来说,如果未对其赋值,在默认情况下是 Null 值,对于值类型的变量,如果未赋值,整型变量的默认值为 0。但通过 0 判断该变量是否赋值了是不太准确的。
- 由于以上原因,c#引入了一种泛型类型即可空类型
- 可空类型允许为值类型赋NULL
定义可空类型变量的语法形式如下。System.Nullable 变量名;Nullable a = Null;int? a泛型方法
* 在 C# 语言中泛型方法是指通过泛型来约束方法中的参数类型,也可以理解为对数据类型设置了参数。
* 如果没有泛型,每次方法中的参数类型都是固定的,不能随意更改。
* 定义泛型方法需要在方法名和参数列表之间加上<>,并在其中使用 T 来代表参数类型。
private static void Add(T a, T b) //定义泛型方法Add(3.3, 4); //泛型方法的调用泛型类
* 泛型类的定义与泛型方法类似,是在泛型类的名称后面加上,当然,也可以定义多个类型,即“<T1,T2,・・・>”。
class 类名<T1,T2,…>{ //类的成员}
* 这样,在类的成员中即可使用 T1、T2 等类型来定义。
泛型集合
* 非泛型类中的ArrayList 和 HashTable在泛型类中共分别被List, Dictionary<K,V>来表示
* using System.Collections.Generic;
List list_2 = new List(); list_2.Add(new Student(1, “小明”, 20)); list_2.Add(new Student(2, “小李”, 21)); list_2.Add(new Student(3, “小赵”, 22)); foreach(Student x in list_2) { Console.WriteLine(x); }集合的比较
* 在 C# 语言中提供了 IComparer 和 IComparable 接口比较集合中的对象值,主要用于对集合中的元素排序。
* IComparer 接口用于在一个单独的类中实现,用于比较任意两个对象。
* IComparable 接口用于在要比较的对象的类中实现,可以比较任意两个对象
lambda表达式
-
一个参数 : param => expr
素排序。* IComparer 接口用于在一个单独的类中实现,用于比较任意两个对象。 * IComparable 接口用于在要比较的对象的类中实现,可以比较任意两个对象
lambda表达式
- 一个参数 : param => expr
- 多个参数 : (para-list) => expr