c# 类和成员的修饰详细介绍_C#教程

基本概念
一.类是对于业务处理对象的封装, 包括状态和行为的封装.
二.类的成员种类:
1.常量: 数据值恒定不变的一个符号
2.字段: 字段表示一个只读或者可读写的数据值. 通常用字段来标识一个类或者类产生对象的某种状态,
在实践中,通常将字段标识为private, 避免从类/对象外破坏类/对象的状态。
3.实例构造器(Constructor):将新对象的实例字段初始化为良好初始状态的一种特殊方法。
4.类型构造器,也就是静态的Constructor, 用来初始化类的静态字段。
5.方法:一个特殊的函数,用来更改或者查询一个类型或者对象的状态。
6.属性:用来封装字段在外部的访问,避免直接访问字段。
7.事件:封装一个委托链,通过某种触发机制,通知委托链中的方法执行。
8.子类型:嵌套在类型中的类型,作用是分离复杂性。
9.操作符重载:重新定义在类所产生对象之间的特定操作:例如 +, -, ++等。
10.转换操作符:定义如何显示或者隐式的将类转换为另外一种类型。

类的修饰关键字
一. 可访问性修饰
1. public:用于非嵌套类,访问无限制。
2.internal:用于非嵌套类,仅对定义程序集的所有代码可见。
3.private:用于嵌套类,仅对包含它的类的成员可见。
4.protected:用于嵌套类,仅对包含它的类A以及A的派生类A_Derived中的成员可见。
二.静态类修饰符
1.static:用于定义永远不需要实例化的类,例如Console, Math, Environment等。
2.静态类不能继承除System.Object以外的基类,也不能实现接口
3.静态类只能定义静态成员
4.静态类不能作为字段,方法参数或者局部变量使用,因为它们都代表引用了一个实例的变量。
三.分部类修饰符
1.Partial: 用于将一个类或者结构分解成不同的逻辑单元,目的在于分解类型的复杂性。
2.常见场景在Winform定义窗体或者控件时,自动生成的前端单元和逻辑单元。
四.组件与多态修饰符
1.abstract: 表明一个抽象类,不能直接生成该类的实例,只能通过继承的方式实现。
2.sealed: 表明该类型不能用于基类型。
3.new:用于在衍生类中定义的嵌套类型,表明该嵌套类型与基类中的同名嵌套类型无关。

类成员的修饰关键字
一.可访问性:不详细解释,与类的修饰大同小异
1.public
2.private
3.protected
4.internal
二.静态成员:不详细解释
三.组件与多态修饰:
1.abstract: 用于基类成员,表示为了构造派生类型的实例,派生类型必须实现并且重写这个方法。
2.virtual: 用于基类成员,表示这个成员可由派生类型重写
3.override: 用于派生类成员,表示派生类型重写了基类型的成员。
4.sealed: 用于基类成员,表示这个成员不能被派生类型重写,只能用于方法。
5.new:用于派生类成员,表示这个成员与基类中的同名成员不存在重载关系。

本章知识最佳实践
一.设计类和成员的可访问性的最佳实践:
1.定义类时,除非确定它将作为基类使用,不然应该讲它指定为Sealed。
原因是:派生类型的行为不可预测,如果基类没有进行密封,在后续版本中或者其他团队成员定义的派生类有可能会破坏基类的状态或者预期行为。
2.定义类时,如果不确定将在程序集外公布这个类,则应该将类指定为internal。
原因也是出于安全性方面的考虑。
3.在类的内部,所有数据字段都应该定义为private,原因是出于对状态的保护。每个类/对象的状态都应该只能由自己本身来控制。
4.在类的内部,除非确定某个方法,属性需要在子类中重写,不然不要使用virtual。
原因有两个,一是调用虚方法在CLR中会消耗更多性能;二是虚方法会丧失基类对自身行为的控制权。
5.在类中定义嵌套类时,应将嵌套类修饰为private。这个规则在VS中会被强制检查。
二.静态类与单例模式的异同:
1.相同之处:都为类型成员提供单一入口
2.不同之处:
a.静态类难以控制初始化时机
b.静态类不支持基类,派生类,也不支持实现接口,对多态的支持性较差。
c.静态类的实现较为简单,不支持多态的情况下安全性较高

时间: 2024-11-01 15:53:34

c# 类和成员的修饰详细介绍_C#教程的相关文章

C# 写入XML文档三种方法详细介绍_C#教程

我在以前的博客中介绍了如何使用XmlDocument类对XML进行操作,以及如何使用LINQ to XML对XML进行操作.它们分别使用了XmlDocument类和XDocument类.在本文中,我再介绍一个类,XmlTextWriter.我们分别用这三个类将同样的xml内容写入文档,看一看哪种写法最直观.简便. 我们要写入的XML文档内容为 复制代码 代码如下: <?xml version="1.0" encoding="UTF-8"?> <Co

ADO.NET实体数据模型详细介绍_C#教程

OleDbConnection,OracleConnection 或者SqlConnection这种连接,直接执行sql语句.现在的连接方式执行sql语句有了很大的不同,下面先看看简单的单表的增删改查操作,然后再看多表的关联查询,带参数查询等.一.ADO.NET Entity对单表的增删改查有一个表,即在工程中是一个实体user,为了测试方便,所有字段为string型. 1.增加新记录增加一条记录如下: [csharp] using (OracleEntities entities = new

c#设计模式 适配器模式详细介绍_C#教程

后续内容将包括以下结构模式: 适配器模式(Adapter):Match interfaces of different classes合成模式(Composite):A tree structure of simple and composite objects装饰模式(Decorator):Add responsibilities to objects dynamically代理模式(Proxy):An object representing another object享元模式(Flywei

C# 中的var关键字详细介绍_C#教程

C# var关键字详解 var 是3.5新出的一个定义变量的类型 其实也就是弱化类型的定义 VAR可代替任何类型 编译器会根据上下文来判断你到底是想用什么类型的 至于什么情况下用到VAR 我想就是你无法确定自己将用的是什么类型 就可以使用VAR 类似 OBJECT 但是效率比OBJECT高点. 或者通俗的讲:   var可以理解为匿名类型,我们可以认为它是一个声明变量的占位符.它主要用于在声明变量时,无法确定数据类型时使用. 使用var定义变量时有以下四个特点: 1. 必须在定义时初始化.也就是

C++开发:为什么多线程读写shared_ptr要加锁的详细介绍_C 语言

我在<Linux 多线程服务端编程:使用 muduo C++ 网络库>第 1.9 节"再论 shared_ptr 的线程安全"中写道: (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化.根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的线程

链接库动态链接库详细介绍_C 语言

windows中,链接库分为两种类型:静态链接库.lib和动态链接库.dll.其中动态链接库在被使用的时候,通常还提供一个.lib,称为引入库,它主要提供被Dll导出的函数和符号名称,使得链接的时候能够找到dll中对应的函数映射. 静态链接库和动态链接库的作用相似,都是提供给其他程序进行调用的资源.其中,动态链接库的调用方法分隐式调用(静态导入调用)和显示调用(动态导入调用).  编译环境: Microsoft Visual Stdio 2010 ------------------------

C++ Qt属性系统详细介绍_C 语言

C++ Qt属性系统详细介绍 Qt提供了一个绝妙的属性系统.跟那些由编译器提供的属性差不多.然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译特性,比如__property 或[property].Qt可以在任何平台上的标准编译器下编译.Qt属性系统基于元数据对象系统--就是那个提供了对象内置信号和槽通讯机制的家伙. 声明属性需要什么 要声明一个属性,需在继承自QObject的类中使用Q_PROPERTY()宏. Q_PROPERTY(type name READ getFuncti

C语言 位段的详细介绍_C 语言

C语言中的位段       位段(bit-field)是以位为单位来定义结构体(或联合体)中的成员变量所占的空间.含有位段的结构体(联合体)称为位段结构.采用位段结构既能够节省空间,又方便于操作.      位段的定义格式为:      type  [var]: digits     其中type只能为int,unsigned int,signed int三种类型(int型能不能表示负数视编译器而定,比如VC中int就默认是signed int,能够表示负数).位段名称var是可选参数,即可以省

C++ const修饰变量和修饰函数介绍_C 语言

const修饰变量 关于const最常见的一个面试题是这样的:char *const和const char*有什么区别,大家都知道const修饰符代表的是常量,即const修饰的变量一旦被初始化是不能被更改的,这两个类型一个代表的是指针不可变,一个代表指针指向内容不可变,但具体哪个对应哪个,很多人一直搞不清楚. 有这样一个规律,const修饰的是它前面所有的数据类型,如果const在最前面,那么把它和它后面第一个数据类行交换.比如上面的const char*交换之后就是char const *,