C#部分知识个人整理



以下纯属基于自己平时的应用以及看书而整理的一些资料,可能有一些地方和大家理解的有所不同,这里写下来只是为了时刻提醒自己。

谈到C#,大家首先想到的就是它的面向对象的特性,对于这个概念,我也没法说清楚。过去的面相过程编程常常会导致所有的代码都包含在几个模块中,是程序无法阅读和维护。对软件做一些修改时常牵一动百。

面相对象则需要许多代码模块,每个模块都只提供特定的功能,它们是彼此独立的,这样就提高了代码的重用率,更有利于软件的开发、维护和升级。在面相对象过程中,算法与数据结构被看成一个整体,也就是对象。这就涉及到类与对象。平时用到的类都具有一定的属性和操作,而这些都可以用算法和数据结构开描述。因此有些书籍上就这么描述他们的关系:
                         对象=算法+数据结构 ,程序=对象+对象+.........


程序就是许多对象在计算机中相继表现自己,而对象则是一个个程序实体。

    面向对象的三个特点:封装,继承,多态。就不多解释了

    关于类的概念是,类是对象概念在面相对象编程语言中的反映,是相同对象的集合。它描述了一系列在概念上有相同含义的对象,并为这些对象统一定义了编程语言上的属性和方法。它是C#中功能最为强大的数据类型,定义了数据类型的数据和行为。程序员就可以创建作为此类的实例的对象。需要主要的还有申明类用到的几个标识符 
new:仅允许在嵌套类声明时使用,声明类中隐藏了由基类中继承而来的、与基类中同名的成员
public:不限制对该类的访问
protected:自身类以及由自己派生的类可访问
internal:自身所在类可访问
private:只有.NET中的应用程序或者类库才能访问
abstract:抽象类,无法实例化
sealed:密封类。无法被继承

类中有两个比较特殊的函数,就是构造函数和析构函数。这里构造函数就不多讲了,析构函数(~+类名)这边需要提到的是,.NET类库有垃圾回收的功能,当类的实例无需使用时,.NET则会调用析构函数实现垃圾的回收。这里需要注意的是:除特殊情况外,不建议定义类的析构函数,C#中无用的对象会由垃圾收集器回收,如果构造函数中执行较为耗时的操作会影响垃圾收集器的功能。

    对于类与对象的关系总结如下:类是具有相同或相似结构、操作和约束规则的对象组成的集合,而对象是某一个类的具体实例化,每一个类都是具有某些相同特征的对象的抽象。

字段、属性和索引是类中用于存储数据的重要成员,字段是类中的成员变量、属性提供对类或者对象性质的访问、索引器,可以看成是一种特殊的“属性”,通常用来操作数组中的元素。

需要提到的就是属性,它是对现实实体特征的抽象,提供对类或者对象性质的访问。其用法大家应该很熟悉,就是我们经常用到的get set方法。还有就是索引器,它的用法类似于属性,二者一个重要的区别在于索引器在声明时需要定义参数,他们之间的区别还有就是索引器的名称必须是关键字this,this后面一定要跟一对方括号,指定索引的参数。而且索引必须是非静态的。

对于类面相对象的三个特性就不多说了,其中类的多态性就是通过子类中重载(override)基类的虚方法(virtual)或函数成员来实现的。多态的实现方式有多种,可以通过继承,抽象类,接口等实现多态。


下面简单的总结一下C#中接口与抽象类。

接口(interface)提出了一种规范,让使用接口的程序设计人员必须严格遵守接口提出的约定。它可以包含方法、属性、索引器和事件作为成员,而且他们只能定义 不能赋值。
抽象类(abstract)就是不与具体事物联系,只是表达一种抽象的概念或行为。(tip 派生类对象实例化抽象类)

比较一下他们之间的异同点:
抽象类和接口都包含可以由派生类继承的成员,它们都不能直接实例化。

区别:
它们的派生类只能继承一个基类,即只能直接继承一个抽象类,但可以继承任意多个接口
抽象类中可以定义成员的实现,但是接口不可以
抽象类中可以包含字段,构造函数,析构函数,静态成员或常量等。接口中不可以。
抽象类中的成员可以是私有的,但是接口中的成员必须是公开的

下面说下迭代器
迭代器是可以返回相同类型的值的有序序列的一段代码,可用作方法,运算符或get访问器的代码体。
迭代器代码使用yield return依次返回每个元素,yield break语句将终止迭代。可以在类中实现多个迭代器,每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在foreach语句中被客户端代码调用。迭代器的返回类型必须为IEnumerable或IEnumerator。

例:

public class Demo:IEnumerable
  {
     //创建一个str数组
	string[] str={"a","b","c"};
     //通过实现IEnumerable接口的GetEnumerator方法来创建迭代器
	public IEnumerator GetEnumerator()
	{
	      for(int i=0;i<str.Length;i++)
	     {
	       //使用yield一次返回每个元素
		yield return str[i];
	     }
	}

  }
 
class   Program
{
    static void Main(string[] args)
    {
	Demo d =new Demo();
	foreach(string s in d)
	{
            Console.Write(s);
	    Console.Readkey();	
	}
     } 
} 



最后说一下泛型。泛型的类型参数T可以看作是一个占位符,它不是一种类型,它仅代表了某种可能的类型。在定义泛型时T出现的位置可以在使用时用任何类型来代替。


下面是一个简单的案例。

public class FindIndex
{
    public int Find<T>(T[] items, T p)
    {
        for (int i = 0; i < items.Length; i++)
        {
            if (items[i].Equals(p))
            {
                return i;
            }
        }
        return -1;
    }
}

class Program
{

    static void Main(string[] args)
    {
        FindIndex fi = new FindIndex();

        int s = fi.Find<string>(new string[] { "2", "3", "5", "98", "8", "7", "1", "11" }, "8");

        Console.WriteLine(s);
        Console.ReadKey();
    }

}
以上都是些最基础的东西,温故而知新嘛,有什么不足的地方欢迎指正!!!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值