.net笔记

一 .net简介

2002年微软公司发布的第一个.NET框架————.NET Framework;.NET Core是一个开源的模块化的Framework,不管是开发web或移动设备都在同一个Framework(.NET Core)下运行,而且 .NET Core也可在不同的操作系统上运行,包括Windows、linux、MacOS,实现了跨平台跨设备。

.NET Core & .NET Framework 都是 NET Standard Library 的实现,一种是跨平台,而另一种是Windows下特有的,除实现NET Standard Library外 .NET Core 和 .NET Framework 都有各自特有的实现。.NET Standard Library 是跨操作系统的关键所在,它定义了一组接口,而每个操作系统有各自的实现,.NET Core通过nuget可以动态下载当前操作系统的实现,从而实现跨操作系统(暨跨操作系统共享代码)*。

(Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展。在使用Visual Studio开发基于.NET Framework的应用时,Nuget能把在项目中添加、移除和更新引用的工作变得更加快捷方便。)*

.NET Core 更依赖于Nuget,允许本地application在部署时动态下载需要的class library。而.NET Framework需要在系统中预装。这样.NET Core的部署比.NET Framework 更简单快速同样也更轻便。

.net framwork和 .net core区别

Docker容器支持 都支持,.net Core就是以Docker为基础的
在命令行上重复回复 net Core更快
跨平台 仅.net Core支持
已经有一个预配置的环境和系统 .net framwork
系统稳定性 net framwork 更胜一筹,毕竟.net core才刚发布
是否有一个成熟的团队 net core 需要一个学习曲线

在以下情况,对服务器应用程序使用 .NET Core:

  1. 用户有跨平台需求。
  2. 用户正在面向微服务。
  3. 用户正在使用 Docker 容器。
  4. 需要高性能和可扩展的系统。
  5. 需按应用程序提供并行的 .NET 版本。

在以下情况,对服务器应用程序使用 .NET Framework :

  1. 应用当前使用 .NET Framework(建议扩展而不是迁移)。
  2. 应用使用不可用于 .NET Core 的第三方 .NET 库或 NuGet 包。
  3. 应用使用不可用于 .NET Core 的 .NET 技术。
  4. 应用使用不支持 .NET Core 的平台。

详细网络来源

创建一个.net core项目

1.要开始构建.NET应用程序,您只需下载并安装.NET SDK(软件开发工具包)即可。
下载.NET SDK

2.检查所有安装正确
安装完成后,打开新的命令提示符并运行以下命令:!#是微软公司发布的一种面向对象的、运行于.NET Framework和.NET 台在这里插入图片描述
帮助指令 dotnet --help
3.创建应用
dotnet new 创建各种类型的项目
在这里插入图片描述
该dotnet命令为您创建new类型的应用程序console。该-o参数创建一个名为myApp存储应用程序的目录,并使用所需文件填充该目录。该cd myApp命令将您带入新创建的app目录。

4. 编译项目

dotnet  build

5.运行你的程序
在这里插入图片描述

项目目录

.net笔记_第1张图片

目录 说明
obj obj 目录包括项目运行需要引用的一些类、方法和接口
bin bin 目录是项目程序目录,包括运行时配置文件等等
Program.cs 这个文件包含了 ASP.NET Core 应用的 Main 方法,负责配置和启动应用程序
myApp.csproj 项目的配置文件 包括当前项目的.netcore版本,还有引用的nuget包信息;

vscode项目创建和引用的例子

项目创建引用详情

扩展nuget包管理器
1.安装
扩展组件中搜索NuGet Package Manager,安装nuget包管理器
2.使用nuget包管理器
ctrl+shift+p,弹框中输入nuget package manager:add package;回车后按需引入包,在项目.csproj查看对应配置

二 C#简介

C# 是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的。

C# 成为一种广泛应用的专业语言的原因:

  1. 现代的、通用的编程语言。
  2. 面向对象。
  3. 容易学习。
  4. 结构化语言。
  5. 它产生高效率的程序。
  6. 它可以在多种计算机平台上编译。
  7. .Net 框架的一部分。

C# 一些重要的功能:

  1. 布尔条件(Boolean Conditions)
  2. 自动垃圾回收(Automatic Garbage Collection)
  3. 标准库(Standard Library)
  4. 组件版本(Assembly Versioning)
  5. 属性(Properties)和事件(Events)
  6. 委托(Delegates)和事件管理(Events Management)
  7. 易于使用的泛型(Generics)
  8. 索引器(Indexers)
  9. 条件编译(Conditional Compilation)
  10. 简单的多线程(Multithreading)
  11. LINQ 和 Lambda 表达式
  12. 集成 Windows

C# 数据类型

  1. 值类型(Value types)
  2. 引用类型(Reference types)
  3. 指针类型(Pointer types)

值类型的变量可存储数据,引用类型的变量可存储对实际数据的引用。 引用类型的实例也被称作对象。 仅在不安全模式下才可使用指针类型。

c#有15个预定义类型,其中13个是值类型,两个是引用类型(string 和 object)
1、整型
.net笔记_第2张图片
2、浮点类型
.net笔记_第3张图片
3、decimal类型
.net笔记_第4张图片
4、bool(布尔)类型
在这里插入图片描述
5、char字符类型
.net笔记_第5张图片
6、引用类型(Object类型和字符串类型)
.net笔记_第6张图片

C# 类型转换
namespace TypeConversionApplication
{
class StringConversion
{
static void Main(string[] args)
{
int i = 75;
float f = 53.005f;
double d = 2345.7652;
bool b = true;

        Console.WriteLine(i.ToString());
        Console.WriteLine(f.ToString());
        Console.WriteLine(d.ToString());
        Console.WriteLine(b.ToString());
        Console.ReadKey();
        
    }
}

}
更多转换方式

C# 运算符

  1. 算术运算符
    .net笔记_第7张图片

  2. 关系运算符
    .net笔记_第8张图片

  3. 逻辑运算符
    .net笔记_第9张图片

  4. 位运算符
    .net笔记_第10张图片

  5. 赋值运算符
    .net笔记_第11张图片

  6. 其他运算符
    .net笔记_第12张图片
    C#运算符优先级
    .net笔记_第13张图片
    C# 判断
    .net笔记_第14张图片
    C# 循环

{

class Program
{
    static void Main(string[] args)
    {
        /* for 循环执行 */
        for (int a = 10; a < 20; a = a + 1)
        {
            Console.WriteLine("a 的值: {0}", a);
        }
        Console.ReadLine();
    }
}

}

C# 封装
封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。

  1. public:所有对象都可以访问;
  2. private:对象本身在对象内部可以访问;
  3. protected:只有该类对象及其子类对象可以访问;
  4. internal:同一个程序集的对象可以访问;
  5. protected internal:访问限于当前程序集或派生自包含类的类型。

C# 方法
一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块。每一个 C# 程序至少有一个带有 Main 方法的类。

要使用一个方法,您需要:

  • 定义方法
  • 调用方法

C# 可空类型(Nullable)

C# 单问号 ? 与 双问号 ??
? : 单问号用于对 int,double,bool 等无法直接赋值为 null 的数据类型进行 null 的赋值,意思是这个数据类型是 NullAble 类型的。
?? : 双问号 可用于判断一个变量在为 null 时返回一个指定的值。
Null 合并运算符( ?? )
Null 合并运算符用于定义可空类型和引用类型的默认值。Null 合并运算符为类型转换定义了一个预设值,以防可空类型的值为 Null。Null 合并运算符把操作数类型隐式转换为另一个可空(或不可空)的值类型的操作数的类型。
{
class NullablesAtShow
{

  static void Main(string[] args)
  {
     
     double? num1 = null;
     double? num2 = 3.14157;
     double num3;
     num3 = num1 ?? 5.34;      // num1 如果为空值则返回 5.34
     Console.WriteLine("num3 的值: {0}", num3);
     num3 = num2 ?? 5.34;
     Console.WriteLine("num3 的值: {0}", num3);
     Console.ReadLine();

  }

}
}
num3 的值: 5.34
num3 的值: 3.14157

C# 数组(Array)
数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。

声明数组 datatype[] arrayName;
其中,datatype 用于指定被存储在数组中的元素的类型。
[ ] 指定数组的秩(维度)。秩指定数组的大小。
arrayName 指定数组的名称。

double[] balance;
初始化数组 double[] balance = new double[10];
赋值给数组 double[] balance = new double[10]; balance[0] = 4500.0;
{
class MyArray
{
static void Main(string[] args)
{
int [] n = new int[10]; /* n 是一个带有 10 个整数的数组 */
int i,j;

     /* 初始化数组 n 中的元素 */         
     for ( i = 0; i < 10; i++ )
     {
        n[ i ] = i + 100;
     }

     /* 输出每个数组元素的值 */
     for (j = 0; j < 10; j++ )
     {
        Console.WriteLine("Element[{0}] = {1}", j, n[j]);
     }
     Console.ReadKey();
  }

}
}

C#字符串
class StringProg
{
static void Main(string[] args)
{
string str1 = “This is test”;
string str2 = “This is text”;

     if (String.Compare(str1, str2) == 0)
     {
        Console.WriteLine(str1 + " and " + str2 +  " are equal.");
     }
     else
     {
        Console.WriteLine(str1 + " and " + str2 + " are not equal.");
     }
     Console.ReadKey() ;
  }

}

C# 结构体(Struct)
在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
};

public class testStructure
{
public static void Main(string[] args)
{

  Books Book1;        /* 声明 Book1,类型为 Book */
  Books Book2;        /* 声明 Book2,类型为 Book */

  /* book 1 详述 */
  Book1.title = "C Programming";
  Book1.author = "Nuha Ali"; 
  Book1.subject = "C Programming Tutorial";
  Book1.book_id = 6495407;

  /* book 2 详述 */
  Book2.title = "Telecom Billing";
  Book2.author = "Zara Ali";
  Book2.subject =  "Telecom Billing Tutorial";
  Book2.book_id = 6495700;

  /* 打印 Book1 信息 */
  Console.WriteLine( "Book 1 title : {0}", Book1.title);
  Console.WriteLine("Book 1 author : {0}", Book1.author);
  Console.WriteLine("Book 1 subject : {0}", Book1.subject);
  Console.WriteLine("Book 1 book_id :{0}", Book1.book_id);

  /* 打印 Book2 信息 */
  Console.WriteLine("Book 2 title : {0}", Book2.title);
  Console.WriteLine("Book 2 author : {0}", Book2.author);
  Console.WriteLine("Book 2 subject : {0}", Book2.subject);
  Console.WriteLine("Book 2 book_id : {0}", Book2.book_id);       

  Console.ReadKey();

}
}

C# 结构的特点

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

结构和类的区别:
1、结构是值类型,它在栈中分配空间;而类是引用类型,它在堆中分配空间,栈中保存的只是引用。
2、结构类型直接存储成员数据,让其他类的数据位于堆中,位于栈中的变量保存的是指向堆中数据对象的引用。

C# 中的简单类型,如int、double、bool等都是结构类型。如果需要的话,甚至可以使用结构类型结合运算符运算重载,再为 C# 语言创建出一种新的值类型来。

由于结构是值类型,并且直接存储数据,因此在一个对象的主要成员为数据且数据量不大的情况下,使用结构会带来更好的性能。

因为结构是值类型,因此在为结构分配内存,或者当结构超出了作用域被删除时,性能会非常好,因为他们将内联或者保存在堆栈中。当把一个结构类型的变量赋值给另一个结构时,对性能的影响取决于结构的大小,如果结构的数据成员非常多而且复杂,就会造成损失,接下来使用一段代码来说明这个问题。

结构和类的适用场合分析:
1、当堆栈的空间很有限,且有大量的逻辑对象时,创建类要比创建结构好一些;
2、对于点、矩形和颜色这样的轻量对象,假如要声明一个含有许多个颜色对象的数组,则CLR需要为每个对象分配内存,在这种情况下,使用结构的成本较低;
3、在表现抽象和多级别的对象层次时,类是最好的选择,因为结构不支持继承。
4、大多数情况下,目标类型只是含有一些数据,或者以数据为主。

你可能感兴趣的:(学习笔记,.net,学习)