CSharpLearing

c#

1、VSCode调试C#无法在控制台输入(解决方案)**
  • 在调试->配置 里面 把 “console”: “internalConsole”,注释掉 或者改成 "integratedTerminal"这样可以在其他终端进行调试,就可以输入了
2、初始化一个Console项目
  • cd到目标目录
  • 执行dotnet new console
  • 该命令在文件夹中创建一个Program.cs文件,其中已经编写了一个简单的“ Hello World”程序,以及一个名为HelloWorld.csproj的C#项目文件。
  • 使用dotnet run 区运行项目
3、属性和字段
  • 访问性不同
    1. C#中属性:C#中属性是限制只能给变量赋于某个范围的值,是有限制的访问私有变量。
    2. C#中字段:C#中字段是自由的、毫无限制的访问公有变量。
  • 包含不同
    1. C#中属性:C#中属性中包含两个块:set和get,set块负责属性的写入工作,get块负责属性的读取工作。
    2. C#中字段:C#中字段中不包含set和get两个块,可以直接进行字段写入和读取。
  • 安全性不同
    1. c#中属性:c#中属性应为是私有的,写入和读取需要调用set和get块,所以当不在本类中使用是可以保证使用属性的安全性
    2. 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值