.net framework 与 .net core

都是 charp 的开发工具集,前者适用于 Windows 平台,后者可跨平台。
clr: 公共语言运行库(Common Language Runtime,CLR)是整个.NET框架的核心,它为.NET应用程序提供了一个托管的代码执行环境。它实际上是驻留在内存里的一段代理代码,负责应用程序在整个执行期间的代码管理工作,比较典型的有:内存管理、线程管理、安全管理、远程管理、即时编译、代码强制安全类检查等,这些都可以成为.NET框架的生命线。

字符串 @ 使用

  1. C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待,比如:
  2. string str = @"C:\Windows";
  3. 等价于:
  4. string str = "C:\\Windows";
  5. @ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。
  6. string str = @"<script type=""text/javascript"">
  7. <!--
  8. -->
  9. </script>";

指针类型

type* variable_name

ref 指针参数,out 参数

可空 Nullable

单 ? ,双 ??

  1. ? 单问号用于对 intdoublebool 等无法直接赋值为 null 的数据类型进行 null 的赋值,意思是这个数据类型是 Nullable 类型的。
  2. int? i = 3;
  3. 等同于:
  4. Nullable<int> i = new Nullable<int>(3);
  5. int i; //默认值0
  6. int? ii; //默认值null
  7. ?? 双问号用于判断一个变量在为 null 的时候返回一个指定的值。
  8. -----
  9. Null 合并运算符( ??
  10. Null 合并运算符用于定义可空类型和引用类型的默认值。Null 合并运算符为类型转换定义了一个预设值,以防可空类型的值为 NullNull 合并运算符把操作数类型隐式转换为另一个可空(或不可空)的值类型的操作数的类型。
  11. 如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。下面的实例演示了这点:
  12. 实例
  13. using System;
  14. namespace CalculatorApplication
  15. {
  16. class NullablesAtShow
  17. {
  18. static void Main(string[] args)
  19. {
  20. double? num1 = null;
  21. double? num2 = 3.14157;
  22. double num3;
  23. num3 = num1 ?? 5.34; // num1 如果为空值则返回 5.34
  24. Console.WriteLine("num3 的值: {0}", num3);
  25. num3 = num2 ?? 5.34;
  26. Console.WriteLine("num3 的值: {0}", num3);
  27. Console.ReadLine();
  28. }
  29. }
  30. }
  31. 当上面的代码被编译和执行时,它会产生下列结果:
  32. num3 的值: 5.34
  33. num3 的值: 3.14157

params 关键字

在使用数组作为形参时,C# 提供了 params 关键字,使调用数组为形参的方法时,既可以传递数组实参,也可以传递一组数组元素。params 的使用格式为:
public 返回类型 方法名称( params 类型名称[] 数组名称 )

结构体

结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。
结构体是用来代表一个记录。

结构的特点

您已经用了一个简单的名为 Books 的结构。在 C# 中的结构与传统的 C 或 C++ 中的结构不同。C# 中的结构有以下特点:

  • 结构可带有方法、字段、索引、属性、运算符方法和事件。
  • 结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义无参构造函数。无参构造函数(默认)是自动定义的,且不能被改变。
  • 与类不同,结构不能继承其他的结构或类。
  • 结构不能作为其他结构或类的基础结构。
  • 结构可实现一个或多个接口。
  • 结构成员不能指定为 abstract、virtual 或 protected。
  • 当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
  • 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。

    类 vs 结构

    类和结构有以下几个基本的不同点:

  • 类是引用类型,结构是值类型。

  • 结构不支持继承。
  • 结构不能声明默认的构造函数。

    访问标识符

  • 访问标识符 指定了对类及其成员的访问规则。如果没有指定,则使用默认的访问标识符。类的默认访问标识符是 internal,成员的默认访问标识符是 private

    析构函数

    析构函数

    类的 析构函数 是类的一个特殊的成员函数,当类的对象超出范围时执行。
    析构函数的名称是在类的名称前加上一个波浪形(~)作为前缀,它不返回值,也不带任何参数。
    析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源。析构函数不能继承或重载。

    1. using System;
    2. namespace LineApplication
    3. {
    4. class Line
    5. {
    6. private double length; // 线条的长度
    7. public Line() // 构造函数
    8. {
    9. Console.WriteLine("对象已创建");
    10. }
    11. ~Line() //析构函数
    12. {
    13. Console.WriteLine("对象已删除");
    14. }
    15. public void setLength( double len )
    16. {
    17. length = len;
    18. }
    19. public double getLength()
    20. {
    21. return length;
    22. }
    23. static void Main(string[] args)
    24. {
    25. Line line = new Line();
    26. // 设置线条长度
    27. line.setLength(6.0);
    28. Console.WriteLine("线条的长度: {0}", line.getLength());
    29. }
    30. }
    31. }

    特性(Attribute)

    特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。
    特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。
    参考:https://www.runoob.com/csharp/csharp-attribute.html

类似java 的 annotation 注解

疑问

  1. 同一个工程中,可以有几个 namespace