c#语法进阶

一, 概述

C#是一种完全面向对象的编程语言。

C#进阶语法,是和面向对象思想相关的语法。面向对象是对真实世界对象的模仿,使得开发人员们可以集合智慧,更好地沟通人机,满足人对软件层出不穷的需求。

c#的本质就是所有东西全都是类,一个继承另一个,子类继承父类。 c#有强大的类库,就是基本上所有你要完成的程序都可以用c#类库(有很多很多类),实例化你要用的。拼起来就行了。

C++并非纯面向对象的,为了和C兼容以及提供更高的执行效率,它保留了很多模块化的东西。Java尽管号称是面向对象的,但实际上,对于对象所应该具备的三种构成结构——属性、方法和事件,Java仅提供了方法,其它两种结构都要通过方法来模拟。

C# 1.x提出了纯粹的面向对象概念,并在语言中得到了非常好的体现。

C#通过类类型、值类型和接口类型的概念形成了统一的类型系统。

通过委托(稍后介绍),结合关键字event,C#提供了优雅的事件概念。使用+=运算符,开发者可以非常方便地将一个事件处理器关联到一个事件上,这个过程称之为“订阅”一个事件。由于委托内部封装了一个调用链表,因此可以方便地为一个事件添加多个事件处理器,这些处理器会自动地依次调用。

多年的开发语言进化证明,函数指针是非常重要也是非常危险的语言特征之一。同时,基于函数指针的回调机制也Windows 核心概念之一。然而,由于函数指针很难验证参数的类型准确性,因此C#(确切地说是CLI)提出了“委托”的概念,这是一种类型安全的函数指针链表。这意味着,C#不仅可以提供回调机制,同时调用回调的一方还无需在其内部维护函数指针列表,所要做的仅仅是声名一个具有恰当委托类型的公共成员即可;而提供回调的一方也只需通过构造一个带有指定方法的相应委托实例,并通过“+=”运算符添加到回调列表即可。

二,面向对象OOP

Object-oriented programming (OOP)

(一),对象Objects

一个以某类型为模板而创建的对象称为该类型的实例。对象是由它所代表的事物的属性的数据和处理这些数据的方法组成的集合体。

对象特点:

  • 1、以数据为中心,围绕对数据所做的处理来设置操作。

  • 2、实现了数据封装。对象的私有数据被封装在对象内部,外界无权直接处理,只能通过对象提供的公用方法来实现访问。

  • 3、对象是主动的,传统的数据都是等待外界对它进行处理,而对象的私有数据是自己执行自己的方法,处理自己的私有数据。

  • 4、模块独立性好,对象之间的互联程度弱,耦合度低。而对象内部的各元素之间结合紧密、内聚度高。

C#的对象不是引用就是值。在句法中不作进一步区分。

(1).对象类(object class,对象类型,object type)是所有其它类型的基类,C#中的所有类型都直接或间接从对象类型中继承(即使是值类型也在装箱形式时隐性继承自它)。对象类包括许多可被其它对象共享的最通用的方法,部份方法是虚拟可重载的。

object是引用类型,

object

Object

所有其他类型的基类型

 

它是引用类型而非值类型

因此,对一个对象类型的变量,可以赋予任何类型的值,例如:

对对象类型的变量声明,采用object关键字,这个关键字是在.NET框架结构中提供的预定义的命名空间System中定义的,是类System.Object的别名。

装箱时就自动使用了object对象。

(2),Object对象的成员:

Equals - 对象间比较

Finalize - 资源清理,(默认的析构器)

GetHashCode - 一个能够标识内存中指定对象的整数

GetType - 获得当前实例的类型

ToString - 创建可描述类实例的可阅读文本,通常返回类的名称。

System.Object的接口:

public class Object {public Object()public virtual Boolean Equals(Object obj)public virtual Int32 GetHashCode()public Type GetType()public virtual String ToString()protected virtual void Finalize()protected Object MemberwiseClone()public static bool Equals(object objA, object objB)public static bool ReferenceEquals(object objA, object objB) }

(二),类Classes

类是面向对象编程语言诸如C#的最基本的东西。它们为对象提供模板式服务。它们包括模仿真实世界般存储和处理数据的成员。

1声明

6.2.2.1部分类Partial class

2初始化

6.2.3.1对象初始化 6.2.3.2集初始化

3访问成员

4修饰符

6.2.5.1访问修饰符 6.2.5.2静态

5构造器

6析构器

7方法

6.2.8.1 ref和out参数 6.2.8.2可选参数 6.2.8.3外部

8域

9性能

6.2.10.1自动属性

10索引Indexers

11继承

6.2.12.virtual 6.2.12.2new 6.2.12.3抽象abstract 6.2.12.4密封sealed

(三),接口

6.3.1实现一个接口

三,泛型Generics

1使用泛型

(1)泛型类 (2)通用接口 (3)一般代表 (4)通用方法

2型参数Type-parameters (1)协变和逆变Covariance and contravariance

四,统计员Enumerators

1发电机的功能

五,LINQ

1查询语法

六,匿名方法

1匿名代表 2 Lambda表达式

七,匿名类型

八,扩展方法

九,杂项

1属性 2预处理器Preprocessor 3代码注释 4 XML文档系统

十,方言Dialects

1规格#

二,数据类型对象

类的概念是面向对象编程的核心。

此外,C#还通过无参数列表的方法声名语法,结合get/set访问器实现了优雅的属性语法。其中的get访问器相当于获取属性值的方法,可以通过一些运算返回最终的结果,而不是简单地返回一个变量的值;而set访问器相当于设置属性值的方法,在其中可以进行一系列检测,最后将属性值赋给相应的变量。同时,通过同时提供get和set访问器、只提供get访问器和只提供set访问器,还可以很方便地实现可写、只读和只写的属性。C#的这种属性语法,使得一个属性在提供该属性的类的内部看来,非常像一组方法;而对于外部调用类看来,访问一个对象的属性和访问它的公共域没有任何区别。

*构造函数和析构函数

构造函数其实是一个方法,当构造一个类类型的对象时会调用,通过使用构造函数来初始化对象。其特点有:

构造方法的名称与类的名称一样

  构造方法没有返回类型

  构造方法不返回任何值

  可以被重载,调用哪一个构造函数取决于给new的变元

析构函数也是个方法,当无用单元收集器回收对象时调用该方法。(此过程称为析构)

类的析构函数名称是类的名称前加上符号(~)

只有一个析构函数,不使用变元,没有返回类型

 

 

九,函数

A,函数定义:static 返回值类型/void 函数名(参数类型1 参数1,参数类型2 参数2,...){...return 返回值//return必须在函数结束前被处理,不能跳过//return ;//当用于void时用不带返回值的return来中止函数。}

B,参数数组:

static int sumVals(params int[] vals){int sum = 0foreach(int val in vals){ sum+=val}return sum}static void Main(string[] args){int sum = sumVals(1,5,2,9,8) Console.WriteLine("Summed Values = {0}",sum)}     C,值传递参数/引用传递参数/out输出参数 static void showDouble(ref int val)//引用传递参数 { val*=2 Console.WriteLie("val doubled = {0}",val) } static void showDouble2(int val)//值传递参数 { val*=2 Console.WriteLine("val doubled = {0}",val) } static void showDouble3(int val,out int valIndex)//out输出参数 { val*=2 valIndex++; Console.WriteLine("val doubled = {0}",val) } int myNmuber = 5 showDouble(ref myNumber) //引用传递参数,会改变myNumber值,所以要求myNumber必须不是常量或者未初始化的变量。 showDouble2(myNumber)//值传递参数,不会改变myNumber值 int valindex//out输出参数,不用初始化,初始化了也会在函数开始执行时丢失值。 showDouble3(myNumber,out valIndex)

D,全局变量

static/const 变量名

注:const定义的全局变量是只读的

当全局变量与局部变量同名时,局部变量优先,要用类似class1.myString来引用全局变量。

E,Main()函数;

static void Main() static void Main(string[] args)//args是函数命令行参数 static int Main()//返回一个表示函数终止状态的int值 static int Main(string[] args)//返回一个表示函数终止状态的int值

F,结构中的函数

G,同名函数的重载:同名,签名不同,系统自动识别使用哪个函数

H,委托:用于把引用存储为函数以灵活调用函数

十,面向对象基础

十一,类

1,类的定义

class 类名 {//类成员 } internal/public sealed/abstract

十和,接口

interface IMyInterface {//接口成员 }

参见

漫谈Object基类(一)| 漫谈Object基类(二)| An article about Equals and GetHashCode functions in C#|

对象和类、System.Object类知识点、学习小结和思考练习|

面向对象和基于对象|

c#学习笔记.txt|:文艺笔法

C#面向对象编程|

c#|面向对象语言(c# & Java)程序实例化(new)的详细介绍| C# 1.0:纯粹的面向对象|

C#面向对象分析|

C#本质论|:章1-5

认知枚举(C# Enum)|

c#学习笔记(五)| c#学习笔记(六)| c#学习笔记(七)| c#学习笔记(八)| c#学习笔记(九)| c#学习笔记(十)| c#学习笔记(十一)| c#学习笔记(十二)| c#学习笔记(十三)|

C#教程—面向对象(一)| C#教程—面向对象程序设计(二)| 高效掌握C#笔记 第四章 C#的面向对象功能|

戏说面向对象程序设计C#版|

c#比vb中多的一些概念|

c#基础知识|

对工作很无奈(请正确在C#中使用C++好吗)|