C#基础知识理论

C#基础语法

C#基本概念:

是一种面向对象的编程语言。
语言特点:继承、封装、和多态。

继承

允许根据一个类来定义另一个类,已有的类叫做基类,新创建的类就叫做派生类,同时根据多个类定义一个新类,此时就叫做多重继承 ,反之就是单一继承。这里需要注意C# 不支持多重继承

封装:

把一个或者多个项目封闭在一个物理的或者逻辑的包中。封装根据需要进行设置使用这的访问权限: C#访问修饰如下
public:所有对象都可以访问;
private:对象本身在对象内部可以访问;
protected:只有该类对象及其子类对象可以访问
internal:同一个命名空间的对象可以访问;
protected internal:访问限于当前程序集或派生自包含类的类
型。

多态

多态是指同一个行为具有多个不同的表现形式,或者形态的能力,可以简单理解成为子类对所继承的接口或基类所进行的拓展,或者方法的重载均属于对象的多态

基本语法

关键字:

using 在程序中引用命名空间

成员变量

变量是类的属性或者数据成员,用于存储数据

成员函数

函数是一系列执行指定任务的语句。类的成员函数在类中声明的,简单一句,在类中定义的函数就是成员函数又叫做成员方法

C#关键字:

关键字是c#预定义的保留字
在这里插入图片描述
详见菜鸟教程:lC#基础语法

变量

系统提供一个程序操作的存储区的名字,每个变量都有自己的类型以及变量值

常量:常量可以看作一种特殊的变量,在程序中一旦被定义就无法被改变
常量的基本数据类型: 数值类型,字符类型

const和readonly
const(常量): 常量是固定值,程序执行期间不会改变
readonly:使用此修饰符的变量一旦被赋值,就只能程序中使用 不能进行更改.

区别:const:在编译时就已经被初始化赋值。
readonly:程序运行时变量进行初始化赋值

数据类型

C#数据类型共分为值类型,引用类型 指针类型

值类型

C#基本的值类型的数据类型有很多 仅对常用的进行列举: Int long float demical char byte ;

C#内置引用类型数据 object ,dynamic string class, Array ,interface 委托

C#指针类型
(应用较少 不做过多解释)

值类型,引用类型区别

值类型存储在栈中,引用类型存储在堆中

C#数据类型

装箱:将之类型转化成引用类型
拆箱:将引用类型转化成值类型

注意:频繁的装拆箱操作会造成系统的效率低下;

结构体

概念:结构体是一种值类型相关的数据结构。让其单一变量可以存储各种数据类型的相关数据.1
如何定义:使用 struct关键字 创建结构体 其其方式类似类的定义

struct Books
{
   public string title;
   public string author;
   public string subject;
   public int book_id;
};  

使用 :


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

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

C#中结构体的优点:


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

结构体与类的区别:
类是引用类型,结构体值类型
结构体不支持继承
结构体不能声明默认的构造函数
结构体中声明的字字段无法赋初值 ,类中可以

枚举

概念:枚举是一种命名整型常量.枚举类型使用enum关键字进行声明
声明枚举变量数据

模板

enum <enum_name>
{ 
    enumeration list 
};

定义枚举示例
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };

enum_name 指定枚举的类型名称。
enumeration list 是一个用逗号分隔的标识符列表。

Array

数组一个存储相同元素的固定大小的集合 ,数组是用来存储数据的集合,数组是使用索引器进行读取数据

String和StringBulid

string:是C#中的一种数据类型,其本质上更像是一种字符数组,拥有一些已经封装好的实例方法,string是微软定义的关键字代替String
微软string

StringBuild:可变字符字符串
详见[微软StringBulid]

string 与StringBulider 的区别:

String声明之后在内存中大小是不可修改的,而StringBuilder可以自由扩展大小(String分配在栈区,StringBuilder分配在堆区)

如何使用 :
对字符串操作不是太过于频繁 可以使用string ;
对字符串操作过于频繁 使用StringBulider

运算符:

算术运算符、 关系运算符、逻辑运算符、位运算符、赋值运算符及其他运算符

运算符讲解链接

运算符重载:
程序开发中根据自身需求进行运算符的功能进行修改。
C#重载运算符是具有特殊名称的函数,是通过关键字operator后跟运算符的符号来定义。
摘录菜鸟示例代码

  public static Box operator+ (Box b, Box c)
      {
         Box box = new Box();
         box.length = b.length + c.length;
         box.breadth = b.breadth + c.breadth;
         box.height = b.height + c.height;
         return box;
      }

流程控制

流程控制语句列举:
if …else :
if … else if …else:运行模式类似于switch case
switch case
while
do … while
for
foreach
break
continue

注意:
if else if 和 switch case的区别:
if else-if:语句的判断条件是一个条件表达式。
switch:语句的判断条件只能是常量表达式

流程控制语句可以嵌套使用,同样的条件使用不同方式的流程控制语句产生不同的性能损耗
例如
多个条件并行存在 或 关系

这里使用a,b,c代替条件
			if (a){ }
            if (b) { }
            if (c) { }
            else { };

            if (a) { }
            else if (b) { }
            else if (c) { }
            else { }

区别:
方式一实现,在首个条件满足时,系统在运行时仍然会进行条件判断
方式二实现:当首个条件满足时,系统在运行代码不会再执行相应条件判断

当只有最后一个条件满足时 两种实现方式的运行效率相同

多个条件同时存在 与关系

 		if (a)
            {
                if(b)
                {
                    if(c)
                }
            }

          //实现时仅需将获得结果集重新赋给数据集即可 适用于数据筛选过滤
          bool flag=false;
            if (a) {flag=true; }
            if (b) { flag=true;}
            if (c) {flag=true; }
          

方式一:使用嵌套语句,需要考虑的条件较多,最多可达到 n的平方中条件
方式二:使用状态值进行判定,考虑条件较少,仅需n中条件

总结:目前来说两种方式的效率几乎相同在实际开发中推荐使用方式二 ,使用方式二的形式的代码可读性更高,

foreach 和 for 区别

foreach 遍历的对象必须继承Ienumable<>
for 循环需要检测对象是否可以进行循环

算法
冒泡 快速排序

int[] nums = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
for (int i = 0; i < nums.Length - 1; i++)
{
    for (int j = 0; j < nums.Length-1-i; j++)
    {
        if (nums[j] > nums[j + 1])
        {
            int temp = nums[j];
            nums[j] = nums[j + 1];
            nums[j + 1] = temp;
        }
    }
}
//打印数组
for (int i = 0; i < nums.Length; i++)
{
    Console.WriteLine(nums[i]);
 
}

快速排序 摘录自快速排序
个人感觉封装后更易于理解 优化版

static void QuickSort(int[] dataArray, int left, int right)
{
    if (left < right)
    {
        //基准数, 把比它小或者等于它的 放在它的左边,然后把比它大的放在它的右边
        int x = dataArray[left];
        int i = left;
        int j = right;

        while (i < j)//当i==j的时候,说明我们找到了一个中间位置,这个中间位置就是基准数应该所在的位置 
        {
            //从后往前比较
            //找到了一个比基准数 小于或者等于的数子,应该把它放在x的左边
            while (i < j)
            {
                if (dataArray[j] <= x)
                {
                    dataArray[i] = dataArray[j];
                    break;
                }
                else
                {
                    j--;//向左移动 到下一个数字,然后做比较
                }
            }
            //从前往后
            while (i < j)
            {
                if (dataArray[i] > x)
                {
                    dataArray[j] = dataArray[i];
                    break;
                }
                else
                {
                    i++;
                }
            }
        }
        //跳出循环 现在i==j i是中间位置
        dataArray[i] = x;
        QuickSort(dataArray, left, i - 1);// left -i- right
        QuickSort(dataArray, i + 1, right);
    }
}

(保证完全正确)

面向对象

封装 :
继承 :
多态 :
重载:在同一类中定义多个方法名称相同,参数不同或返回类型不同的方法
重写:子类将父类的方法进行修改,同时将父类的方法以Base()的形式将其保存起来 父类中的函数 必须使用virtual 修饰符修饰

修饰符 :详见开篇

类的成员 :包含数据成员和函数成员

数据成员:字段,常量,默认时实例成员,除非使用static 关键字修饰
字段 :与类相关的变量 (其数据类型根据使用情况自行确定)
常量:使用const关键字明 ,若将其声明为public ,则就可以在类的外面进行访问。

函数成员:
方法 : 是将一些相关语句组织在一起,用于执行一个任务的代码语句块 ,
<Access Specifier> <Return Type> <Method Name>(Parameter List) { Method Body }C#中的方法只能声明在类中,调用方法可以是自身的其他成员方法,或者其他类进行调用,具体和方法的修饰符有关系

属性:属性是类,结构体,和接口的命名成员。类或结构体中的成员方法或变量称之为域,属性是对域的拓展,通过使用访问域可让私有域的值被外界访问‘;

事件 :在发生某些行为时可以使用对象通知调用方 ,是一种特殊的委托,详细介绍在c#高级语法;
索引器:可以使用访问数组的方式访问类的内部成员

接口

概念 :约束类de成员的一种行为规范
成员: 属性 方法 事件 索引器 ,
注意:接口中的方法都是抽象成员,接口的所有成员不能使用修饰符,默认的访问形式是public
作用:是一种行为规范 继承接口的程序可以更加安全

了解 抽象工厂模式 :

在实例化一个类时,不进行直接实例化,通过调”工厂方法“的形式,进行实例化类
优点 :生产出类更加安全,符合某种约束条件,才能被实例化 ,

小提示 :对于设计模式的介绍后期会有详细的教程,这里仅作简单描述!!!

abstract :

抽象 ,使用abstract 修饰的成员 叫做抽象成员。
抽象类和接口的区别:
从继承上来说 接口可以多继承,抽象类只能单继承,
从成员上讲:接口成员少 ,抽象类成员多
从使用 ,类继承接口 必须实现所有成员,抽象类可以不实现 ,如果实现 只需要添加相应的修饰符,使用场景,接口为了制约 ,抽象类是为了扩展

C#的简单知识概念总结暂为以上部分,将会不定期对其进行相关修改 ,同时首次写博客没有经验,版面稍微错乱 ,相关知识总结不是非常到位,如发现错误部分请联系修改 。

提示:下一篇 c#高级概念

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值