用C++理解C#,联系与区别的猜想

最近喜欢上了写博客,哈哈。

 

一、由于我一开始学习的是C++,所以在学习C#的时候情不自禁会用C++的思路去理解c#中新增的东西。所以准备把对C#的设计的猜测写下来,虽然不一定对,但可以帮助自己记忆。

二、并没有对每个知识点的详细解释。全是定性的理解。


abstract和virtual

因为C++中有纯虚函数和虚函数都用virtual来标识,只是纯虚函数的写上=0,虚函数不用,而有纯虚函数的基类才叫做抽象类,且纯虚函数一定要覆盖。

所以C#中直接给了一个abstract关键字,用于代表纯虚函数,需要强制覆盖。而有abstract的类自然就是抽象类了。

    即:C#直接将纯虚函数与虚函数 用了两个关键字来标识,C++中用了一个。


命名空间:

C#默认命名空间为全局,即:一个不加namespace声明的类,全局可见,还跨文件。


特性:  

特性的作用是用于给一个”东西“添加一个“信息”。这个东西可以是函数,可以是其他数据类型。这个信息 是元数据。 

编译器来访问的特性叫 预定义特性,也可以自己来访问和定义特性,叫做自定义特性。          

特性就是一个继承system.Attribute的类,这个类可以用 [  ] 构造,且[ ]只能放在一个“东西”之前。

但是这个类的实例被存在了哪儿,我不知道,只知道要用反射来访问,用getcustomattribute()来访问。

特性的应用:  

1.给一个函数添加 关于自己执行时机的信息, 如 预定义的conditional ,把[Conditional("DEBUG")] 放在一个函数前,代表这个函数在debug的时候才调用。


反射: 

反射类似于动态绑定,只是反射将可以动态获取的东西变得更多了。

.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。
例如:memberinfo继承了 object,里面保存了成员的属性和提供了访问成员元数据的方法。使用 MemberInfoMethodInfoFieldInfo 或 PropertyInfo 对象获取类型的方法、属性、事件和字段的相关信息。
反射的应用:   

1.   System.Reflection.MemberInfo info = typeof(MyClass); 然后用info的方法获取信息。

2.  Type type = typof(Myclass);    Type 是一个继承menberinfo的类。

3.   Type  t  =  Type.GetType(“System.String”);  例如直接从一个XML钟获取一个类的名字,在根据这个类来实例化。


索引:  

索引相当于重载了 [  ]  运算符 ,来访问自己。  形式如:this[ ]。


委托:

 委托相当于函数指针,声明一个委托类,相当于给一种函数指针typedef一个新名字,然后用来定义所有的该类型的函数指针。

  • public delegate void printString(string s);...
  • printString ps1 = new printString(WriteToScreen);
  • printString ps2 = new printString(WriteToFile);

并且,赋值的时候还得new一下,可能因为为了支持多播,还在new的时候构造了别的东西,重载了运算符之类的。


事件: 

是委托的控制中心点,用来控制什么时候调用委托, 将委托又封装了一层。


匿名方法:

 给一个委托对象 赋值一个没有名字的方法

delegate void NumberChanger(int n);

NumberChanger nc = delegate(int x){ 

Console.WriteLine("Anonymous Method: {0}", x);

};


不安全代码:

unsafe 修饰一个代码块 ,则这个代码块就可以使用指针变量了。不安全代码 也叫 非托管代码

static unsafe void Main(string[] args)
        {
            int var = 20;
            int* p = &var;
            Console.WriteLine("Data is: {0} ",  var);
            Console.WriteLine("Address is: {0}",  (int)p);
            Console.ReadKey();

        }


本地函数:

现场定义一个函数,马上使用。。。。 这个函数是私有的。。不知道有什么意义。

int funA(){
    //使用
    funB();
    //定义
    int funB(){
        //print();   
    }
}

lambda表达式  

(input parameters) => expression  

这和c++没什么太大区别, 但lamdba在应用中大量和委托一起使用,即可以赋值给委托。 还有和专门的委托定义方式一起用,如:有返回值的Fun<T1,T2>,无返回值的Action<T1,T2>。 且连return都省了 ,会直接返回expression,,还可以省略括号。 可读性在哪儿啊?

lambda 语句

(input parameters) => { statement; }  上面没有方括号的叫表达式,这个叫语句。



猜你喜欢

转载自blog.csdn.net/qq_30795577/article/details/79928407