熬夜爆肝万字C#基础入门大总结【建议收藏】_c#

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
往期文章分享

点击跳转=>熬夜再战Android从青铜到王者-UI组件快速搭建App界面
点击跳转=>熬夜再战Android从青铜到王者-几个适配方案
点击跳转=>熬夜再战Android从青铜到王者-开发效率插件篇
点击跳转=>Unity粒子特效系列-龙卷风预制体做好了unitypackage包直接用
点击跳转=>姐姐喊我解锁套娃新技能FairyGUI在Unity中实现List嵌套List/立体画廊等玩出花儿来
点击跳转=>Unity新手必备5款宝藏插件–价值上千元白嫖最新版

👉关于作者

在这里插入图片描述

众所周知人生是一个漫长的流程不断克服困难不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考于是我决定将自己的思考经验和故事全部分享出来以此寻找共鸣
专注于Android/Unity和各种游戏开发技巧以及各种资源分享网站、工具、素材、源码、游戏等
有什么需要欢迎私我交流群让学习不再孤单

👉前提

自己出身Android开发因为业务了解也清楚所以项目开发很快就决定业余时间学习下其他技术。公司有前端/后端/C++/移动端/动画/模型/硬件/人工智能等多个部门根据公司发展和自己兴趣再加上人们对带有立体感的软件渐渐喜爱决定扩展下此方向定下了学习c#。开整。

注因为不是新手有不少编程经验。所以学习起来很快挑重点学习记录也是挑重点。适合做成手册没事翻翻。新手警告阅读可能有一定困难。

👉实践过程

😜C#介绍

源于c语言简单易学入门超快减少了烦人的指针有统一的操作符/修饰符/运算符使用起来简洁称心。不仅如此

  1. 她是结构化语言能产生高效率的程序
  2. 面向组件开发快速
  3. 在多种计算机平台上编译良好兼容性
  4. 优秀的版本管理控制安装卸载和其他程序不影响
  5. 点Net框架一部分
  6. 都是她被广泛应用的原因。

她不仅是按照面向对象设计的语言而且还类型安全还有更多让人舒心的功能

  1. 自动垃圾回收
  2. 属性、事件、委托等
  3. 标准库
  4. 简单多线程
  5. Lambad表达式

虽然c#和Java她们在内部功能实现及性能上不同代码依赖也不同(Java依赖JVMc#依赖.NET)但是她们仍然有很多相似之处这对于Android出身的我来说更得心应手

😜.NET简介

.NET框架是一个集成、一个环境、一个非常强大的平台是微软推出的核心技术。开发式的体系结构覆盖的内容非常广
在这里插入图片描述
由上图看出.NET Framework是.NET最重要的核心技术。Framework提供了多语言开发而C#是其中核心语言。
在这里插入图片描述

😜VS快捷键

先来普及回顾下VS中的常用快捷键

Ctrl+K+D:快速对齐代码

Ctrl+Z:撤销

Ctrl+S:保存(一定要经常保存)

Ctrl+J:快速弹出智能提示

Shift+End 、Shift+Home

Ctrl+K+C:注释所选代码

Ctrl+K+U:取消对所选代码的注释

F1转到帮助文档

折叠冗余代码#Region 和#EndRegionAndroid Studio也可以自定义折叠代码 //region //endregion 快捷键 Ctrl+Alt+T

单行注释 //

多行注释/要注释的内容/

文档注释 /// 多用来解释类或者方法

😜数据类型

编程基础就不强调了主要看看拼写和其他语言有什么不同就行了
在这里插入图片描述
除了这些值类型还有引用类型包含对象类型动态类型字符串类型

字符串类型string或者String注意s大小写平时都能用但也有也小区别。

字符串有个@符号可以将转移字符当成普通字符且@符会保留字符串里面的换行符空格符等

例string str=”D:\alibaba”; 等价于string str=@”D:\alibaba”;

动态类型dynami他会根据内容自动存储对应类型

例dynamic str=”这是字符”; dynamic number=10; 就像前端的var类型

对象类型ogject所有类型的最低基类能分配任何类型的值麻烦就是用的时候可能经常得进行类型转换。

😜转义字符

在这里插入图片描述

😜运算符

仍然是直接上表格图编程基础。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

😜判断/循环

逻辑判断仍然是编程老鸟的基基础只是简单概括一下

判断语句if else switch

循环语句while for foreach do…while break continue

😜访问修饰符

C#可以设置使用者的访问权限这样开发者可以指定该模块或逻辑是公开封闭还是指定访问者。不知道其他语言什么样跟Java是一样样的。

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

😜可变类型/合并运算符

可空类型Nullable表示其基础类型除了默认的值外再添加一个null值。例如int? num = 1; double? num= new double?();

Null合并运算符如果第一个操作数为null则返回第二个操作数否则返回第一个就像Java的运算。

例如 A=B??C 如果B为空则将C赋值给A如果B 不为空则将B赋值给A。

😜数组

数组类型是若干个数据类型相同的数据元素组成的数据结构。C#也是分为一维数组和多维数组多维数组又包括矩形数组和交错数据。

还有一个参数数组可以传递未知数量参数给函数。 这个就像Java中的(int… num)。

例ParamArray app = new ParamArray(); int sum = app.AddElements(512, 720, 250, 567, 889);

数组类型基本是System.Array类的派生类快捷键Ctrl+左键进入源码快速学习都有什么功能实现。

😜结构体

她能用单一变量存储多个数据类型举例一个书变量可以存作者标题出版社价钱等基础变量。超好理解和Java的实体一样就是需要struct关键字来修饰创建结构体。特点

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

结构体的字段可以加前缀”_”来和变量区分
结构体快捷键首选选中你要自动完成的变量先按ctrl+R,再按ctrl+E这两个组合键可以自动生成属性中的get和set方法

😜枚举

就是命名一组整型常量不能继承或传递继承只能当常量使用。举例enum Number{one,two,three}; 则Number.one等于0 Number.two等于1以此类推
枚举可以和结构体结合

public struct Person{
        public string _name;//字段
        public int _age;
        public Gender _gender;
    }
    public enum Gender   {,}
Person zsPerson;
zsPerson._name = "张三";
zsPerson._age = 21;
zsPerson._gender = Gender.;

😜类/函数

类仍然是class修饰在class前面可以指定对类及成员的访问规则若没写则类默认是internal成员访问是private。
例public class ClassName { }
函数和Java同样含有构造函数和带参函数在这多了一个析构函数是一个特殊的成员函数。是一个新知识需要记一下。
析构函数以~作为前缀不需要任何修饰符不返回值也不带参数不能继承或重载。官方文档大致意思就是用来释放资源的只不过并非是在不使用的时候立即释放她是懒惰的垃圾回收机制会在适当的时候回收比如内存紧张关闭程序等时候。这和Android里面的onDestory有异曲同工之妙同样的也有GC方法来强制回收。

😜继承/多重继承

继承是面向对象设计的最重要概念之一一个类继承自另一个类举例
class A{ } class B:A{ } B继承自AB可以称为派生类也可以称为子类A可以称为基类也可以称为父类。派生类和基类子类和父类 。 B拥有访问A的能力形象点说就是子类可以拿到父类的财产父类拿不到子类的财产。
C#不支持多重继承我咨询过C++同事C++支持多重继承。

😜多态

面向对象程序的核心功能之一是同一个行为具有多个不同表现的能力。C#和Java都是面向对象的她们的多态思想基本是一致的。优点多多

  1. 消除类型间耦合关系
  2. 具有可扩充性增强灵活性
  3. 接口性实现简单

C#包含静态多态动态多态静态多态又包含函数重载和运算符重载。
函数重载就是相同的函数名有多个定义。函数的参数类型或个数不同来实现。例如
int test(int num1){}
int test(int num1,int num2){}
int test(int num1,string str1){}
运算符重载看示例更形象但是示例代码多就不在这记了感兴趣的可以自己去搜索学习
动态重载使用的是用abstract创建的抽象类另一个事借助关键字virtual修饰的虚方法类似实现。示例

namespace Test
{
   abstract class Shape
   {
       abstract public int area();
   }
   class Rectangle:  Shape
   {
      private int length;
      private int width;
      public Rectangle( int a=0, int b=0)
      {
         length = a;
         width = b;
      }
	  //注意着的override
      public override int area ()
      {
         Console.WriteLine("Rectangle 类的面积");
         return (width * length);
      }
   }

   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle r = new Rectangle(10, 7);
         double a = r.area();
         Console.WriteLine("面积 {0}",a);
         Console.ReadKey();
      }
   }
}
//虚方法示例
namespace Test
{
   class Shape
   {
      protected int width, height;
      public Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      // 关键字virtual
      public virtual int area()
      {
         Console.WriteLine("父类的面积");
         return 0;
      }
   }
   class Rectangle: Shape
   {
      public Rectangle( int a=0, int b=0): base(a, b)
      {
      }
      public override int area ()
      {
         Console.WriteLine("Rectangle 类的面积");
         return (width * height);
      }
   }
   class Triangle: Shape
   {
      public Triangle(int a = 0, int b = 0): base(a, b)
      {
     
      }
      public override int area()
      {
         Console.WriteLine("Triangle 类的面积");
         return (width * height / 2);
      }
   }  
   class Tester
   {
     
      static void Main(string[] args)
      {
         Rectangle r = new Rectangle(10, 7);
         Triangle t = new Triangle(10, 5);
         c. area ();
         c. area ();
         Console.ReadKey();
      }
   }
}

😜接口

接口使用interface关键字声明和类class的声明差不多默认是public类型的。有个当有多个类多个类有多个相同的方法使用接口来实现方便管理且不会丢失。和Java使用基本是一致的。示例

interface ITestInterface
{
    void TestInterfaceMethod();
}
public class Test : ITestInterface{
public void TestInterfaceMethod()
    {
    }
}

😜命名空间

Namespace这玩意就是用来方便管理的而且在计算机中相同的设计思想到处可见比如同一个文件夹下不同有同名的文件你放在不同文件夹下可以有同名文件。
其他编程语言比如Java有包路径不同路径名字可以有同名的类。这种思想方便管理文件/代码。

namespace first_space
{
   class namespace_cl
   {   }
//比如这样程序是会报错的
   class namespace_cl
   {   }
}
//但是你是下面的状态就不会报错
namespace first_space
{
   class namespace_cl
   {   }
}
namespace second_space
{
   class namespace_cl
   { }
}

到这有的人就开始有疑问了如果是不同的文件或者想访问其他的空间怎么办呢
细心的已经发现了就和Java的导包一样C#使用using导入空间在每个编程文件的最上面几行都是这样的引入想要哪些空间的功能导入哪个。
这时候又有人有疑问了能不能修仙小说那样天外有天天上还有天。能不能命名空间套命名空间套套套此处禁止套娃。
答案是可以的引入的时候using namespaceone.namespacetwo 用英文符号.即可跟Java包路径同理。

😜预处理器

从字面理解就是提前对信息进行处理。她确实也是这样的她会根据你指定的条件只编译满足条件的代码不满足条件的代码不编译。既区分了软件版本代码还在一块管理方便。预处理指令是#开始的且只能作为开头一般指令单独占一行。都有哪些指令在这就不单独写了。在Unity中指令挺有用的因为PC是键盘Android事件是手势用预处理提前写好不同端的不同实现代码当然她们功能可能是一致的打包发布的时候利人利己。

😜异常

哎呀这个老四件套了try、catch、finally 和 throw

  • try 一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。
  • catch 程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。
  • finally finally 块用于执行给定的语句不管异常是否被抛出都会执行。例如如果您打开一个文件不管是否出现异常文件都要被关闭。
  • throw 当问题出现时程序抛出一个异常。使用 throw 关键字来完成。

😜反射

通俗的讲就是可以访问一个类的所有属性和方法且能够调用。有人提问了随便写的public类不都是能任意访问调用的吗这有什么区别
区别在于一个是正常写代码你知道代码逻辑和内容且都在你的掌控之内当然能访问而反射不同她能够访问你不清楚的类比如三方框架你遇到这个框架里某个类某个方法没有对外开放而你又需要使用就可以用反射把她抛出来。

优点

  1. 反射提高了程序的灵活性和扩展性。
  2. 降低耦合性提高自适应能力。
  3. 它允许程序创建和控制任何类的对象无需提前硬编码目标类。

缺点

  1. 性能问题使用反射基本上是一种解释操作用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上普通程序不建议使用。
  2. 使用反射会模糊程序内部逻辑程序员希望在源代码中看到程序的逻辑反射却绕过了源代码的技术因而会带来维护的问题反射代码比相应的直接代码更复杂。

😜属性

总结一句话和Java里实体的get/set方法一样的性质。

😜委托

使用关键字delegate来修饰必须用new关键字来创建且与某个特定方法关联。
比较官方的说法表示对具有特定参数列表和返回类型的方法的引用。通过委托可以将方法视为可分配给变量并可作为参数传递的实体。 委托还类似于其他一些语言中存在的“函数指针”概念。 与函数指针不同委托是面向对象且类型安全的。
按照自己的理解委托就是包一个外壳操作外壳就是调用壳内的内容。就好像老板让你板砖你委托给另一个人让她板砖。这就是委托。
委托中还能通过加减号来实现多个称之为多播。只有相同类型的委托可以合并。
使用场景因刚需C#没什么实际经验大家知道有什么好的实际应用环境吗

委托示例

//这个是声明个委托
    delegate int NumberChanger(int n);
    static int num = 10;
    public static int AddNum(int p)
    {
        num += p;
        return num;
    }
    public static int MultNum(int q)
    {
        num *= q;
        return num;
    }

    static void Main(string[] args)
    {
        // 创建委托实例
        NumberChanger nc;
        NumberChanger nc1 = new NumberChanger(AddNum);
        NumberChanger nc2 = new NumberChanger(MultNum);
        // 使用委托对象调用方法
        nc1(25);
        Console.WriteLine("Value of Num: {0}", num);
        nc2(5);
        Console.WriteLine("Value of Num: {0}", num);
        //下面是组播 使用  +或- 符号操作
        nc = nc1;
        nc += nc2;
        // 调用多播
        nc(5);
        Console.WriteLine("Value of Num: {0}", num);
        Console.ReadKey();
       //输出结果为
            //Value of Num: 35
            //Value of Num: 175
            //Value of Num: 75
}

👉其他

📢作者小空和小芝中的小空
📢转载说明-务必注明来源https://zhima.blog.csdn.net/
📢欢迎点赞👍收藏🌟留言📝

👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6