首页 > 编程语言 >c#基础 (语言)

c#基础 (语言)

时间:2024-03-01 10:12:19浏览次数:22  
标签:语言 c# 基础 public 类型 new 父类 where class

一.c#基础 (语言)

  1. 数据类型:

    1. 常见的类型有:

      1. 字符类型:string(字符串,可存汉字),char(字符类型)
      2. 值类型:int(整数),long(长整型),short(短整数)等
      3. 布尔类型:true,false
      4. 浮点型:float(单精度浮点数)、double(双精度浮点数)等。
    2. 可分为值类型和引用类型

      1. 值类型:存储在栈上,例如:值类型、浮点型、浮点型
      2. 引用类型:存储在堆上,例如:字符类型、类(class)、接口(interface)、数组
    3. 值类型和引用类型的装箱、拆箱

      1. 值类型到引用类型为装箱
      2. 引用类型到值类型为拆箱
    4. 栈和堆

      1. 栈:存放在栈里的数据,是顺序存储的,他是一片连续的内存域,系统自动分配和维护,引用类型总是存放在堆中
      2. 堆:堆是无序的,是一片不连续的内存域,用户可以自己释放,如若用户不手动释放,当到达一定值时,过垃圾回收器(GC)来回收
    5. GC垃圾回收

      1. GC(垃圾回收)是指程序运行过程中自动管理内存的一种机制。在大多数现代编程语言中,都会提供自动的垃圾回收机制来帮助开发人员管理内存。GC 的主要目的是回收不再使用的内存,并使该内存可用于其他目的,从而提高内存的利用率和程序的性能。
      2. 分代式垃圾回收器将对象按照其存活时间分为不同的代数(一般包括0代、1代和2代),每个代数都有自己的内存区域。通常来说,0代对象的生命周期最短,而2代对象的生命周期最长。垃圾回收器在进行垃圾回收时,会优先回收0代对象,因为相比于1代和2代对象,0代对象的存活时间更短,更容易被回收。这种优先级回收的策略可以提高垃圾回收的效率和性能,减少不必要的回收操作对程序性能的影响。
    6. 显示转换 和 隐式转换

      1. 显示转换:是在我们进行两个类型转换的时候,需要明确需要转换的类型,例如 double 转 int 这里需要强制转换(显示转换),但是在强制转换的时候可能会出现类型丢失或精度损失

        //<目标类型> 变量名 = (<目标类型>)<原始数据>;
        //转化为 int 类型,其他转换同理
        double a = 10.5;
        int b = (int)a;
        
      2. 隐式转换:在转换类型的时候自动转换,在转换的时候不会出现数据丢失,系统自动转换,如当我在 int 转换为 double 的时候不会出现数据丢失,会自动补齐为双精度

        int a = 10;
        double b = (double)a;
        
  2. 面向对象(OOP) :Object Oriented Programming简称OOP,是面向对象的语言

    1. 类(Class):用户定义的数据类型,可以表示实体,也可以在内部定义方法,不是具体存在的,例如手机,手机中可以存在很多品牌的手机,类是对象的抽象

       //这是一个类(Class)
       public class Class1
       {
      
       }
      
    2. 对象(obj):对象是类的实例,是真实存在的,通过实例化一个类,可以创建一个对象

      //例如 我们创建一个 A 的类,给他里面封装一个为 Name 的字段
      public class A
       {
           //这里可以声名字段,例如
           public string Name { get; set; }
       }
      
      //这里为类 B
       public class B
       {
           //在这里定义一个无返无参的方法
           public void GetName()
           {
               //我们去实例化一个 A 
               A a = new A();
               //通过实例化后的对象 a,给 Name 赋值,这里就完成了给对象赋值
               a.Name = "张三";
           }
       }
      
  3. 面向对象的三大基础特征:封装、继承、多态

    1. 封装:封装属性、方法,对外隐藏内部的细节,只提供接口对外部访问

    2. 继承:子类继承父类,子类可以使用父类的所有功能,也可以在此基础上添加新的方法及属性,或者重写父类的方法

      1. 子类继承父类:子类是父类的派生类,父类是子类的基类

      2. 子类继承的父类的方法,可以不重复写父类的方法,提高了代码的服用性

      3. 覆盖方法:子类可以重写父类的方法,重写父类方法的逻辑

      4. 访权限:子类可以调用父类的公共和受保护成员,但是不可以调用父类的私用成员

        internal class Program
        {
            static void Main(string[] args)
            {
                //实例化 GetA 类
                GetA getA = new GetA();
                getA.OneA("你通过GetA继承了GetB调用了OneA");
            }
        	//GetA基类
            public class GetA : GetB
            {
        
            }
        	//GetB派生类
            public class GetB
            {
                public void OneA(string a)
                {
                    Console.Write(a);
                }
            }
        }
        
    3. 多态:指的是同一个方法在不同对象上表现出不同的行为。多态性使得可以使用统一的接口来操作不同的对象,从而提高了灵活性、可扩展性和可维护性。

      1. 对象多态:就指的是重写和覆盖,就是父类被子类重写或者覆盖后表现出来的多种形态

      2. 行为多态:就指的是重载

  4. 重载和重写

    1. 重载:在一个类中方法名称相同,参数类型不同,返回值不同叫做重载,在传的参数类型不同的时候调用的方法不同,子类继承父类也可以完成重载

      //这是一个简单的重载 方法名相同 参数不同 执行的方法不同
      public class GetA
      {
          public void OneA(string a)
          {
              Console.Write(a);
          }
      
           public string OneA(string a,int b)
       	{
           	Console.Write(a + b);
          	 return a + b;
       	}
      }
      
    2. 重写:子类继承父类,方法名相同,参数相同,返回值相同,重写父类的逻辑

      internal class Program
      {
          static void Main(string[] args)
          {
              GetA getA = new GetA();
              getA.OneA();
              GetB getB = new GetB();
              getB.OneA();
          }
      
          public class GetA
          {
              public virtual void OneA()
              {
                  Console.Write("我是一个重写之前的方法");
              }
          }
      
      
          public class GetB : GetA
          {
              public override void OneA()
              {
                  Console.Write("我是一个重写之后的方法");
              }
          }
      }
      
  5. 访问修饰符

    1. internal:内部
      1. 访问限于当前程序集,在该类的当前类库中使用
    2. privare:私有
      1. 只能在该类中访问
    3. public:公共
      1. 同一个程序的所有方法都可调用
    4. protected:受保护的
      1. 只能被该类的子类访问
    5. Protected Internal 访问修饰符
      1. 访问修饰符允许一个类将其成员变量和成员函数对同一应用程序内的子类以外的其他的类对象和函数进行隐藏
  6. T (泛型)

    1. 在泛型类型或方法定义中,类型参数是在其实例化泛型类型的一个变量时,客户端指定的特定类型的占位符。 泛型T无法按原样使用,因为它不是真正的类型;它更像是类型的蓝图。 若要使用 T,客户端代码必须通过指定尖括号内的类型参数来声明并实例化构造类型。 此特定类的类型参数可以是编译器可识别的任何类型。 可创建任意数量的构造类型实例,其中每个使用不同的类型参数,减少拆箱和装箱的过程。

      //这个中的 T 代表的泛型,可存任何类型,如:int string Class 
      public class GetInfor<T>
      {
          List<T> values = new List<T>();
      
      } 
      
    2. 泛型约束,可以约束泛型的类型

      1. where T : class - T必须是一个引用类型。
      2. where T : struct - T必须是一个值类型。
      3. where T : new() - T必须有一个公共的无参数构造函数。
      4. where T : - T必须是指定基类或派生自指定基类。
      5. where T : - T必须实现指定接口。
      //where T : class - T必须是一个引用类型。
      public class GetInfor<T>  where T : class
      {
          List<T> values = new List<T>();
      }
      
      //where T : struct - T必须是一个值类型。
      public class GetInfor<T>  where T : struct
      {
          List<T> values = new List<T>();
      }
      
      //where T : new() - T必须有一个公共的无参数构造函数。
      public class GetInfor<T>  where T : new() 
      {
          List<T> values = new List<T>();
      }
      
      //where T : <base class> - T必须是指定基类或派生自指定基类。
      public class GetInfor<T>  where T : <base class>
      {
          List<T> values = new List<T>();
      }
      
      //where T : <interface> - T必须实现指定接口。
      public class GetInfor<T>  where T :<interface>
      {
          List<T> values = new List<T>();
      }
      
  7. 委托(指向方法的指针)

    1. 委托(delegate)是一种引用类型,在其他语言中,与委托最接近的是函数指针,但委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象实例的引用。
    2. 内置委托
      1. Action:无返回值,16个入参
      2. Func:16个入参,1个出参

标签:语言,c#,基础,public,类型,new,父类,where,class
From: https://www.cnblogs.com/mxfenfei/p/18046362

相关文章

  • CF1827C Palindrome Partition 题解
    CF1827CPalindromePartition题解题面题目传送门。称一个字符串是好的,当且仅当它是一个长度为偶数的回文串或由若干长度为偶数的回文串拼接而成。给定一个长度为\(n\)的字符串\(s\),求有多少\(s\)的子串是好的。$1\len\le5\cdot10^5$,\(s\)仅包含小写字母。......
  • 如何理解IOC中的“反转”和DI中的“注入”
    在理解IOC中的“反转”和DI中的“注入”之前,首先要理解原本的控制流程。在传统的应用程序中,对象之间的依赖关系通常由调用方(例如客户端或者上层模块)来管理。这意味着,当一个对象需要另一个对象时,它必须自己创建或查找依赖的对象,这种控制权在对象之间的依赖关系的代码中是显式......
  • Vue 3.0 Class与Style绑定
    操作元素的class列表和内联样式是数据绑定的一个常见需求。因为它们都是attribute,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可。不过,字符串拼接麻烦且易错。因此,在将 v-bind 用于 class 和 style 时,Vue.js做了专门的增强。表达式结果的类型......
  • 2024-02-29-Linux高级网络编程(4-TCP编程)
    4.TCP编程4.1TCP介绍面向连接的流式协议;可靠、出错重传、且每收到一个数据都要给出相应的确认通信之前需要建立链接服务器被动链接,客户端是主动链接TCP编程流程服务器:1.创建套接字socket()2.将套接字与服务器网络信息结构体绑定bind()3.将套接字设置为监听状......
  • 从零开始写 Docker(三)---基于 cgroups 实现资源限制
    本文为从零开始写Docker系列第三篇,在mydockerrun基础上基于cgroups实现容器的资源限制。完整代码见:https://github.com/lixd/mydocker欢迎Star如果你对云原生技术充满好奇,想要深入了解更多相关的文章和资讯,欢迎关注微信公众号。搜索公众号【探索云原生】即可订阅......
  • Codeforces 932D Tree
    首先有个动态加叶子的操作,考虑到树剖需要离线下来预处理,便考虑用倍增来维护。首先要找到\(\gea_u\)的最深的父亲\(v\),便可以先用倍增处理好长度为\(2^i\)的链上的\(\max\)。如果\(\max<a_u\),就往上跳,跳不了就是到点\(v\)了。考虑连边\(v\tou\),这仍然会是一棵树(建......
  • c#基础 (语言)
    一.c#基础(语言)数据类型:常见的类型有:字符类型:string(字符串,可存汉字),char(字符类型)值类型:int(整数),long(长整型),short(短整数)等布尔类型:true,false浮点型:float(单精度浮点数)、double(双精度浮点数)等。可分为值类型和引用类型值类型:存储在栈上,例如:值类型、浮点型、......
  • 核心子方法4: postProcessBeanFactory(beanFactory)方法详解
    先总结: 子类覆盖方法做额外的处理,此处我们自己一般不做任何扩展工作,但是可以查看web中的代码,是有具体实现的AnnotationConfigWebApplicationContext->AbstractRefreshableWebApplicationContext的实现:1.设置ServletContextAwareProcessor后处理器, 并设置忽略......
  • springboot应用中根据特定条件使用CommandLineRunner
    PS使用SpringBoot3.1.2进行测试1.使用@ConditionalOnProperty仅当特定属性存在或具有特定值时,注释@ConditionalOnProperty才会创建bean。在此示例中,仅当或文件中的CommandLineRunner属性db.init.enabled设置为true时才会执行application.propertiesapplication.ymlpac......
  • 关于import cvxopt :ImportError: DLL load failed: 找不到指定的模块。
    前提:前天再写python代码时遇到需要使用到cvxopt包求解QP问题,但是之前却没有安装过这个包,所以对其进行安装。报错:在pipinstallcvxopt后直接使用,出现报错。之后在网上查各种解决办法的方案,但在运行后均出现不同报错情况。我所需要解决的问题主要是numpy、scipy和cvxopt之间不兼容......