闲暇之余学了C#,觉得有些概念因为C#过度包装而丧失了一些灵活性,今天看到托管,觉得这个概念很神奇,就查资料
托管delegate其实就是一个能够装函数的东西,这个东西在C++里面叫做指针【PS:C++:我啥都是指针,怕不怕】
写了一个简单的对比程序,这下就应该明白了
using System;
namespace ConsoleApp1
{
class Program
{
class btn_base //纯虚基类
{
public virtual void click() { } //这是模拟C++的格式,其实C#里面的纯虚基类要么用abstract,要么用interface
}
class Button : btn_base
{
public delegate void btn_func(); //托管类型,l类似于C++中的函数指针,他存放的是函数的地址/对象,这一行在C++里面写作 using btn_func=void(void)
public event btn_func click_func; //使用托管类型来声明一个指针,在C++里面是 btn_func *click_func;
public Button(btn_func action)
{
click_func = action; //设置托管
}
public override void click() //覆盖基类的虚函数,C++自动覆盖
{
click_func();
}
}
static void Btn1_click()
{
Console.WriteLine("Btn 1 has clicked");
}
static void Main(string[] args)
{
Button btn1 = new Button(Btn1_click);
btn1.click();
}
}
}
#include<iostream>
using namespace std;
class btn_base{
public:
virtual void click()=0;
};
class Button : public btn_base{
public:
using btn_func=void(void);
btn_func *click_func;
Button(btn_func* action){
click_func=action;
}
void click(){
click_func();
}
};
void Btn1_click(){
cout<<"Btn 1 has clicked"<<endl;
}
int main(){
Button *btn_a=new Button(Btn1_click);
btn_a->click();
}
其实一毛一样,对吧。
我个人觉得,C#有些地方设计还是比较……新手友好,C++灵活即是缺点,也是优点