C#学习笔记(二)

本文探讨了C#中的OOP特性,包括类的生命周期、interface、class的区别、struct与class的值类型差异以及方法的访问修饰符。对比C++,C#在内存管理、接口实现、类继承等方面展现出独特的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上次看的都是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接口可以进行深度拷贝。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值