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();

}

}

时间: 2024-11-16 14:58:59

C# 重点难点的相关文章

10个HTML和CSS必须知道的重点难点问题

前端日刊 登录 10个HTML和CSS必须知道的重点难点问题 2018-02-26 阅读 2982 收藏 6 原链:segmentfault.com 分享到: 前端必备图书<深入浅出Node.js> >> >>  1.怎么让一个不定宽高的 DIV,垂直水平居中? 使用Flex 只需要在父盒子设置:display: flex; justify-content: center;align-items: center; 使用 CSS3 transform 父盒子设置:disp

第213天:12个HTML和CSS必须知道的重点难点问题

12个HTML和CSS必须知道的重点难点问题 这12个问题,基本上就是HTML和CSS基础中的重点个难点了,也是必须要弄清楚的基本问题,其中定位的绝对定位和相对定位到底相对什么定位?这个还是容易被忽视的,浮动也是一个大坑,有很多细节. 这12个知识点是我个人认为的,下面我们就来看看这12个知识点. 1.怎么让一个不定宽高的 DIV,垂直水平居中? 使用Flex 只需要在父盒子设置:display: flex; justify-content: center;align-items: center

零基础学UI设计教程分享C4D中重点难点分析

一. C4D中基础知识 1.世界的旋转.缩放和位移 旋转:Alt+鼠标左键 缩放:Alt+鼠标右键 位移:Alt+鼠标滚轮(中键) 2.物体的旋转.缩放和位移 旋转:快捷键R 缩放:快捷键T 位移:快捷键E 快速找到当前物体:快捷键H 物体和世界切换:快捷键W 3.找到当前C4D文件:窗口右下角(可直接切换多个文件) 关闭当前文件:窗口左上角文件--关闭(全部关闭) 合并两个文件:在其中一个文件下,点击左上角文件--合并--选择你想要合并的文件 4.等比旋转:先点击R调出旋转命令,把鼠标放在你想

PL/SQL重点\难点

几种常用数据库的JDBC URL: ?对于 Oracle 数据库连接,采用如下形式: –jdbc:oracle:thin:@localhost:1521:sid ?对于 SQLServer数据库连接,采用如下形式: –jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid ?对于 MYSQL 数据库连接,采用如下形式: –jdbc:mysql://localhost:3306/sid 数据库事务:完全执行或完全不执行的SQL语句. J

Java体验的重点难点-----总结

1.关于JVM原理:http://www.cnblogs.com/zhanglei93/p/6590609.html 2.关于垃圾收集机制:http://www.cnblogs.com/zhanglei93/p/6636831.html JVM运行时数据区有程序计数器.虚拟机栈.本地方法栈.堆.方法区5个区域.其中前三个区域随线程的创建而创建,随线程的消亡而消亡:栈中的栈帧随着方法的进入和退出而有条不紊地执行出栈和入栈操作.因此这三个区域的不需要过多的考虑垃圾回收问题.而Java堆和方法区则不一

HTML和CSS必须知道的重点难点问题

一.如何让一个不定宽高的div,垂直居中? 1.使用flex布局,只需要在盒子的父级设置如下代码即可: .className{ display:flex; justify-content:center; align-items:center; } 2.使用css3transform布局: 父级盒子设置: { position:relative;} div设置: { transform:translate(-50%,-50%); position:ansolute; top:50%;left:50

vue 1.0源代码重点难点分析

vue初始化根组件的入口代码: 对于没有路由的单页应用来说,入口就是new Vue(options),options就是根组件代码,对于有路由的项目来说,入口就是router.start(app),其中app是根组件. function Router() {} // router构造函数var router = new Router(); // new router实例router.start(app); // 项目真正的入口 Router.prototype.start = function

【python基础学习】基础重点难点知识汇总

python中decorator装饰器 语法示例: @decorator 什么是装饰器: 问题: 定义一个函数后 在运行时动态增加功能 又不想改动函数本身的代码 示例: # 希望对下列函数调用增加log功能,打印出函数调用: def f1(x): return x*2 def f2(x): return x*x def f3(x): return x*x*x 方法1:直接修改原函数的定义 def f1(x): print('call f1') return x*2 def f2(x): prin

带条件的分页【重点】

二.前台 1.不带条件的查询 [1 ]实现Dao方法:getPageList ().getTotalItemNum () ◆在BookDao中写接口方法 /** * 获取在指定条件下的分页数据 * @param pageNo 不能使用pageCondition返回的pageNoStr.要使用经过Page对象纠正的 * @param pageSize * @param pageCondition * @return */ List<Book> getPageList (int pageNo, i