• c#语法详解


    创建

    视频
    在这里插入图片描述
    每个项目对应的是一个解决方案,一个解决方案下面可以包含多个项目(这个项目可以认为是一个小的模块)。写成中文也识别的,但一般不要这样,写成英文的好
    在这里插入图片描述
    当勾选不使用顶级语句的时候创建的程序内容更多一点,如下图所示,不然就是什么都没有 但是可以直接进行程序编写
    在这里插入图片描述
    在这里插入图片描述
    不勾选就是下面这样的
    在这里插入图片描述
    在这里插入图片描述
    在这个解决方案下,添加一个项目
    在这里插入图片描述
    正常退出的话,代码就是为0
    在这里插入图片描述

    using System;           //引入命名空间  Console就是在这个命名空间下面的
    
    //命名空间:namespace 可以方便代码进行分类、使用。引入命名空间就可以了
    namespace _001_开始      //可以写成中文,但一般不这样写 写英文 命名空间一般与项目名保持一致
    {
       
       //一个命名空间里面有多个类
        class Rectangle
        {
       
            // 成员变量
            double length;
            double width;
            public void Acceptdetails()
            {
       
                length = 4.5;
                width = 3.5;
            }
            public double GetArea()
            {
       
                return length * width;
            }
            public void Display()
            {
       
                Console.WriteLine("Length: {0}", length);
                Console.WriteLine("Width: {0}", width);
                Console.WriteLine("Area: {0}", GetArea());
            }
        }
    
        //在命名空间下创建了一个类 
        internal class Program  //类的名字就是Program,与文件名是保持一致的
        {
       
            //在类下面创建了一个方法
            static void Main(string[] args)
            {
       
                Rectangle r = new Rectangle();//实例化一个类
                r.Acceptdetails();
                r.Display();
                Console.ReadLine();
            }
        }
    }
    
    //注释的快捷键:ctrl+k ctrl+c 取消注释 ctrl+k ctrl+u
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    在这里插入图片描述

    基础知识

    1、c#是运行在.net平台上面的(好像是只能运行在这个上面),但是.net平台上可以有很多运行(比如vb和c++),不止c#,但是c#是这个平台上最主流的开发语言。
    2、c#是在c和c++以后诞生的,好用,在这个上面鼓励是不使用指针的
    3、应该是类或者对象的时候才需要new进行初始化
    4、.net(也就是.net core)与.net framework 的区别:

    • .net是.NET framwork的升级版本,主要用于开发跨平台(Windows,linux,macos等)的应用。
    • .NET 为跨平台框架,可在 Linux、macOS 和 Windows 上运行。.NET Framework 仅在 Windows 上运行.
    • .NET 为开放源代码,接受来自社区的贡献。.NET Framework 源代码可用,但不接受直接贡献。
    • .NET Framework 包含在 Windows 中,并由 Windows 更新自动在整个计算机上更新。.NET 独立交付。
    • 微软为了统一.NET平台,。在2019年5月6日宣布了.NET 5将是.NET Core 3.0的下一个主要版本。
    • 简单的讲就是现在只有两个,一个是只能在Windows上运行的.net framework。另外一个就是可以跨平台的.net5(现在更新到6了,也就是曾经的.net core的升级版,现在改名叫这个了)

    5、参考资料

    C# 基础语法一文通
    c#官方文档
    很不错的专栏,值得一看

    关键字

    说是说关键字 但不一定 就是关键字 只是吧他们放到了这里而已

    static

    详解
    总结:
    1、修饰类

    • 将类修饰为静态的,意味着这个类不能实例化对象,在调用类里面的任何内容的时候直接用类名加点的形式调用其中的方法或者字段。类名.方法名
    • 使类成为静态类。这样在此类中只能定义静态的方法和静态的变量

    2、修饰方法

    • 该方法是类所有,而不是类实例化对象所有,这个方法在调用的时候需要类名加点。
    • 这样做的好处 我猜就是可以直接调用这个方法,不然应该是需要先实例化一个对象,然后才能调用这个方法

    3、修饰变量

    • 修饰变量,这个变量只能是成员变量,不能是局部的。不能修饰方法体中的变量,以及形式参数。
    • static修饰的变量与具体与类的对象无关性。也就是和c语言一样 付一次初值后一直都存在。

    4、类的非静态成员属于类的实例所有,每创建一个类的实例都在内存中为非静态成员开辟了一块区域。而类的静态成员属于类所有,为这个类的所有实例所共享,无论这个类创建了多少个副本,一个静态成员在内存中只占有一块区域。

    class A
    
    {
       
        string name;
    
        static int ID;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    A a=new A();
    
    a.ID=1;
    a.name="w";
    
    • 1
    • 2
    • 3
    • 4

    那么实例化后,两个变量都赋了值
    再实例化对象a2

    A a2=new A()
    
    • 1

    a2的name为空,但a2的ID则已经有了值1

    var

    详解
    1、var 是弱化类型的定义,可代替任何类型,编译器会根据上下文来判断你到底是想用什么类型,在无法确定自己将用的是什么类型时就可以使用var,类似 OBJECT 但是效率比OBJECT高。
    2、使用var定义变量时有以下四个特点:

    • 必须在定义时初始化。也就是必须是var s = “abcd”形式,而不能是如下形式: var s; s = “abcd”;
    • 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。
    • var要求是局部变量。
    • 使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。

    partial

    详解
    Partial是局部类型的意思。允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中。C#编译器在编译的时候仍会将各个部分的局部类型合并成一个完整的类

    out

    C#中 OUT 的用法
    创建函数的时候,在创建的变量前面写上out。调用的时候传递进去的的变量前面需要也写上out,那么这个变量在里面任意值得改变,都会传递出去。

    class Test
    {
       
        static void Main(string[] args)
        {
       
            int n;//调用方法之前,对out参数传递的变量只需声明,可以赋值也可以不赋值,赋值也会在方法中被覆盖掉
            int a = 1;
            //bool b = MyTryParse("123", out n, a);//不加类名也可以
            bool b = Test.MyTryParse("123", out n, a);//方法的参数使用out修饰时,调用该方法时也要加上out关键字
            Console.WriteLine(b);
            Console.WriteLine(n);
            Console.WriteLine("a的值是:" + a);//c#中函数里面的改变对外部也是没有影响的
            //Console.ReadKey();
        }
    
        static bool MyTryParse(string s, out int result, int a)//方法的参数使用out修饰时,调用该方法时也要加上out关键字
        {
       
            result = 0;
            try
            {
       
                result = Convert.ToInt32(s);// 使用out参数传递变量时,必须在方法内为其赋值,否则return的返回值没有意义
                a = 5;
                return true;
            }
            catch
            {
       
                return false;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

    as

    比如我定义一个类A 一个类B

    A a =new A();
    a.getvalue()//实现a的某方法
    B b= a as B;
    b.getvalue()//这到底是实现A的方法还是B的?
    
    • 1
    • 2
    • 3
    • 4

    as 进行类型转换。 转型失败返回null,而不是抛出异常。
    比如你举例的 B b= a as B;就相当于B b= (B)a;但是如果转型失败后一种就会抛出异常,而前一种b == null;

    如果B是A 的基类,那么最后的b.getvalue()实际调用的是a的方法。
    如果B不是A的基类,那么b为null b.getvalue() 会引发异常
    详解

    冒号:

    详解
    最常用的功能是,表示一个类(接口)继承自一个类(或实现了某个接口)

     public class A :B
     {
        
    	 public A()
    	 {
       
    		 dosomething();
    	 }
     }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    region

    在这里插入图片描述

    typeof

    在这里插入图片描述

    namespace Base
    {
       
        internal class Program
        {
       
            public static List<stdudent> students = new List<stdudent>();
            static void Main(string[] args)
            {
       
                Type intType = typeof(int);
                Console.WriteLine(intType.FullName);
    
                Type stringType = typeof(string);
                Console.WriteLine(stringType.FullName);
    
    
                //初始化列表
                students.Add(new stdudent() {
        Age = 11, Grade = 70, Name = "王刚", ID = 1 });
                students.Add(new stdudent() {
        Age = 21, Grade = 50, Name = "小工", ID = 2 });
                students.Add(new stdudent() {
        Age = 31, Grade = 80, Name = "小红", ID = 3 });
                students.Add(new stdudent() {
        Age = 42, Grade = 100, Name = "刘德华", ID = 4 });
    
                Type type = typeof(stdudent);   
                Console.WriteLine
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    Redis的三大问题
    用MicroPython开发ESP32-用TFT-LCD(ST7735S)显示图像
    第1章 初识MyBatis框架
    【SpringBoot】SpringBoot:构建安全的Web应用程序
    浅谈数字孪生产业应用与标准----工业软件讲坛第七次讲座
    计算机网络——TCP/IP网络层次模型
    14-1 网络编程和网络通信要素概述
    单细胞文献学习(part5)--Using Cell-to-Cell Variability— A New Era in Molecular Biology
    深入详解Mybatis的架构原理与6大核心流程
    在云时代,我们该如何看待新的开源许可证?
  • 原文地址:https://blog.csdn.net/chengcao123/article/details/126154804