首页 > 代码库 > C# 重点难点

C# 重点难点

  1. A.接口:一种约定,使得实现接口的类或结构在形式上保持一致。好处:使得程序更条理清晰。

    B.接口声明:接口中只能包含属性,方法,索引器和时间的声明。接口成员的声明不能有修饰符(默认为Public)。

    public interface IBankAccount

    {

    ????void PayIn(decimal amount);

    ????bool Withdraw(decimal amount);

    ????decimal Balance

    ????{get;}

    }

    C.接口实现类:继承接口的实现类必须实现接口中声明的所有方法。

    D.实例声明为接口的引用: IBankAccount venusAccount = new SaverAccount();这样可以让它指向这个接口任何类的实例,比较灵活。缺点:要执行不属于这个接口的方法,需要先将把接口的引用强制转换成合适的类。

    E.接口的继承:接口可以彼此继承。

    interface ITransferBankAccount:IBankAccount

    {

    bool TransferTo(IBankAccount destination,decimal amount);

    }//实现接口ITransferBankAccount的类,必须实现IBankAccount和ITransferBankAccount两个接口所有的方法声明。

    F.总结:

    C#接口独立于类来定义(C++接口实际上就是抽象基类)

    接口和类都可以继承多个接口

    类可以继承一个基类,接口不能继承类。

    一个接口定义一个只有抽象成员的引用类型。所以不能实例化一个接口,只能实例化一个派生自该接口的对象。

    接口可以定义方法,属性,索引。所以,对比一个类,接口特殊性:当定义一个类时,可以派生自多重接口,但是只能从仅有的一个类派生。

  2. C#事件(event)解析
    1. C#事件基于Windows消息处理机制,只是封装的更好,开发者无需知道底层消息处理机制,就可以开发出基于时间的程序。
    2. 事件编程好处:可以方便确定程序执行顺序。事件驱动程序等待事件时,不会占用很多资源(事件驱动程序等待消息到来)。事件简化了编程(操作系统将消息传递给对象,由对象的事件驱动程序确定事件处理方法)。
    3. 事件由两部分组成:事件发生器和事件接收处理类。
    4. 捕捉键盘按键程序:派生一个EventArgs类保存键盘按键信息。

      internal class KeyEventArgs:EventArgs

      {

      ????private char keyChar;

      ????public KeyEventArgs(char keyChar):base()

      ????{

      ????????this.keyChar = keyChar;

      }

      public char keyChar

      {

      ????get {return keyChar;}

      }

      }

      创建事件发生类KeyInputMonitor,用于监控键盘的输入并触发一个事件。

      internal class KeyInputMonitor

      {

      ????public delegate void KeyDownHandler(object sender,KeyEventArgs e);

      ????public event KeyDownHandler KeyDown;

      ????public void Run()

      ????{

      ????????bool finished = false;

      ????????do{

      ????????????Console.WriteLine("Input a char…");

      ????????????string response = Console.ReadLine();

      ????????????char responseChar = (response=="")?‘‘:char.ToUpper(response[0]);

      ????????????switch(responseChar)

      ????????????{

      ????????????????case ‘X‘: finished = true;break;

      ????????????????default:

      ????????????????????KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);

      ????????????????????KeyDown(this,keyEventArgs);

      ????????????????break;

      }while(!finished);

      }

      }

      }

      创建事件接收方的类,这个类产生一个委托实例,再把委托实例添加到产生事件对象的事件列表中去,这个过程叫做订阅事件。

      internal class EventReceiver

      {

      ????public EventReceiver(KeyInputMonitor monitor)

      ????{

      ????????monitor.KeyDown +=new KeyInputMonitor.KeyDownHandler(this.OnkeyDown);

      }

      private void OnKeyDown(object sender,KeyEventArgs e)

      {

      ????Console.WriteLine("Capture key:{0}",e.KeyChar);

      }

      }

      调用:

      public class MainEntryPoint

      {

      ????public static void Start()

      ????{

      ????????KeyInputMonitor monitor = new KeyInputMonitor();

      ????????EventReceiver eventReceiver = new EventReceiver(monitor);

      ????????monitor.Run();

      }

      }

E. 总结:(C#中使用事件需要步骤)

????创建一个委托

????将委托与特定事件关联,

????编写事件处理程序

????利用编写的事件处理程序生成一个委托实例

????把这个委托实例添加到产生事件对象的事件列表中去,这个过程叫订阅事件。

????(C#中事件产生和实现流程)

????定义A为产生事件的实例,a为A产生的一个事件。

????定义B为接收事件的实例,b为处理事件的方法。

????A由于用户或者用户产生一个a事件。

????A通过事件列表中的委托对象将这个事件通知给B

????B接受到一个时间通知,

????调用B.b方法完成事件处理

????public class A

????{

public delegate void EventHandler(object sender)‘

public event EventHandler a;

public void Run()

{

Console.WriteLine("Trigger an event");

a(this);

}

}

class B

{

public B(A a)

{

a.a+=A.EventHandler(this.b);

}

private void b(object sender)

{

Console.WriteLine("Received an handled an event");

Console.Read();

}

}

C# 重点难点