您的位置:首页 > 编程语言 > C#

C#学习笔记(二)

2016-08-09 09:36 176 查看
上次看的都是OOP之前的东西,这次看到了OOP,感觉和C++的思路还是很不同的,不过和Java似乎有点像。

类的生命周期: 构造析构什么的和C++一模一样,唯一不同的是不需要自己释放内存了(这种自己new却让别人delete的感觉让我很心虚啊...)

interface: 这个我个人理解就是C++的纯虚类, interface的意思是定义接口但不去实现,class可以继承这个interface但必须实现这个接口里面的函数(或者抛出一个未实现的异常)这一点和C++的纯虚类不同,C++中继承一个纯虚类可以不全部实现其中的纯虚函数,但是代价是不能实例化这个对象。但是C#中干脆就没法通过编译。

class: internal(默认)/public abstract/sealed/(none) class ClassName{ ... } 对比C++令我感到轻松的是类定义不需要最后的分号了!(虽然C++的IDE也会自动补齐最后的分号) internal是默认的访问控制状态, public可以由其他项目访问(大概类似于Java的jar包...?) 接下来是类属性描述字,可以设定为abstract(抽象的),即不能实例化只能继承。看到这我在想那abstract class和interface是不是也没什么区别了,后来百度了一下发现还是有点区别的。首先interface不能有private成员,而作为class是可以有private和protected的。其次interface只能定义接口而abstract除了定义还可以实现一部分(如果愿意的话)。于是我又在想既然abstract
class这么强大为什么还需要interface呢,原因还是有很多的(就像 C++里面虚函数那么强大为什么不把所有函数定义成虚函数呢,因为虚函数的跳转表相对于非虚函数来说太大太耗时不符合C/C++的设计理念啊!)其一可能就是C#的class只允许单一继承(其实这样比C++允许多继承稍微好一些,C++的基类为了允许多继承是需要虚化基类的.)因而有的时候就需要interface而不只是abstract class。具体可以看这篇转载(点击打开链接)关于类的继承,若需要同时继承类和接口需要把继承类放在前面,接口在后。另外和C++不同的是继承的时候不能有访问控制符(C++:
class DerivedClass : public BaseClass { ... }; C#: public class PublicDerivedClass : BaseClass { ... } )在类中abstract 就相当于C++的virtual = 0,sealed相当于C++或Java的final。

struct: C++中struct和class除了默认访问控制不同外没有任何区别。而在C#中,"class是引用类型,而struct是值类型",这意味着同样是浅复制(operator =), class中的值指向的是同一个值(C/C++中类似于地址相同的指针) 而struct的值对应的是不同的值(类似于深拷贝) 若希望深拷贝class需要继承ICloneable接口并实现Clone()方法。(说实话这种引用既不像指针又不像C++的左值引用... 尤其是operator =的操作,居然只是复制引用,大概是Clone()中类复刻一个自己然后return吧,但是C++惯有的思维总是让我思考Clone()返回之后值是如何到达operator
 =的左边的... 难道是右值(&&)么?? 后来仔细研究了一下感觉 和C++里面shared_ptr unique_ptr的工作方式有点像,也许能帮助理解...)

类中的方法: public/private(默认)/internal/protected static/virtual/abstract/override/extern/none ReturnType MethodName(...){...} 此处还是要注意一下static这个关键字。C++在这方面做的不是很好,若一个class定义了static方法可以使用className::StaticMethod()访问也可以用classObject.StaticMethod()访问.

补充: 一般进行的都是浅度复制,使用ICloneable接口可以进行深度拷贝。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C# 入门