当然在看之前,别忘常按点赞,一键三连哦!!!
类:对象的模板,用于封装定义的成员变量和构造方法,属于引用类型。
对象:类当中的一个具体实例
通俗来讲就是像描述现实生活中的情况进行程序开发,针对某一件事务来设计相对应的功能。
例如我们要开发个售票系统,则会想到要设计用户登录,购票,票数统计等等一系列用户可能会需要的功能。从而让程序设计的更完善。
面向对象的三大基本特征:封装、继承、多态
定义方法:方法类型 返回类型 方法名(参数列表){ }
也可以使用virtual重写方法、abstract在抽象类中重写方法、override重写基类方法。
成员变量、构造方法、引用的命名空间
在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或方法声明上。
在内存中的位置不同
成员变量:在堆内存中
局部变量:在栈内存中
初始化值不同
成员变量:有默认值
局部变量:没有默认值,必须定义,赋值,然后才能使用
生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
private:私有的,仅本类中可访问
protected:受保护的,在类的继承过程中可访问
internal:此程序集可访问
public:共有的
基本数据类型(值类型)
整数类型:byte、short、int、long
浮点类型:float、double、decimal
字符型:char
布尔类型:bool
引用类型
字符串:string
对象:object
程序运行时产生的错误称为异常。
try:对可能抛出异常的代码进行包裹
catch:用于指定要捕获的异常类型,从而进行相应处理
finally:无论是否抛出异常都会执行的代码块
11.String与StringBuffer的区别
string是基本类型,是不可改变对象,一旦被创建就不能修改它的值。对已经存在的string对象的修改都是重新创建一个新的对象,然后将新值保存进去。而StringBuffer是一个可变对象,当对它进行修改时不会像string那样重新建立对象。它只能通过构造函数来建立。对象被建立后,在内存中就会分配内存空间,并初始保存一个null,向StringBuffer中赋值的时候可以通过它的append()方法。字符串连接操作中StringBuffer的效率要比stirng高。
“重写”父类方法就是修改它的实现方式或者说在子类对它进行重新编写。
好处就是代码的重用性集扩充性更强。
只需要定义,而不需要实现的方法称为抽象方法。
区别:抽象方法没有方法体,没有方法具体实现、抽象方法只能在抽象类中声明、派生类必须重写抽象类中的抽象方法。
connection、command、reader、adapter、dataset
视图层(ui):负责显示和采取用户操作,不包含任何业务相关的逻辑处理。
业务逻辑层(BLL):通过获取Ui传来的用户指令,执行业务逻辑,在需要访问数据时,直接交给DAL进行处理,然后返回数据给Ui层。
数据访问层(DAL):只提供基本的数据访问,不包含任何的业务逻辑。
装箱:将值类型转换成引用类型(Object)
拆箱:将引用类型转换成值类型
两个;一个可以被引用的“s”对象,一个括号里面的值。
值类型存储在栈内存,长度都是固定的;引用类型存储在堆内存,可以动态扩展长度。
会执行;在return语句之前被执行。
new运算符:用于创建对象和调用构造函数。
new修饰符:在用作修饰符时候,new关键字可以显式隐藏从基类继承的成员。
new约束:用于在泛型声明中约束可能用作类型参数的参数类型。
null在内存中没有分配内存空间,“”则分配了空间。
为null的字符串没有被实例化,而为“”的字符串则已经被实例化。
Class可以被实例化,属于引用类型,分配在堆内存中,可以实现接口和单继承其他类。
struct属于值类型,分配在栈内存中,可以实现接口,不能作为基类型,而Class可以。
进程指运行中的应用程序,每个进程都有自己独立的内存空间,而线程是属于进程中的一个实体,没有独立的内存空间,寄生在进程当中。
DataReader在使用时会始终占用SQLConnection,任何对SQLConnection的操作都会引发DataReader的异常,且每次读取时只在内存中加载一条数据,占用的内存相对较小。
DataSet则会将数据一次性的加载到内存中,读取完毕后会放弃数据库连接,相对来说会比较消耗内存。但会比DataReader更灵活,可以动态的添加行、列数据,对数据库进行回传更新操作。
virtual:字面意思为虚拟,用于将类中成员定义成虚拟的,表示这些成员会在继承后重写其中的内容。
sealed:字面意思为密封的,用此修饰符修饰的类或方法不能被继承。
override:用于重写继承的父类当中的方法。
abstract:用于将类、方法、属性、事件和索引器定义为抽象的。
40.什么是成员变量?什么是局部变量?
成员变量是类中定义的变量、局部变量是在方法内定义的变量。
产生对象并对成员默认初始化。
对构造方法中的形式参数赋值。
检查构造方法中是否有this语句。
super调用或隐式调用父类的构造方法。
对当前类中的变量显式初始化。
执行当前构造方法中的代码。
this关键字可以访问当前类中定义的字段、属性、和方法。
base关键字可以调用当前类继承的父类中的字段、属性和方法。
不可以,因为一个对象的一个synchronized方法只能由一个线程访问。
答:使用C#派生类中的构造函数时,需要注意关键字base和this的区别,关键字base表示调用基类中的构造函数,而this表示调用本类中的构造函数.
属于一种方法,用于在创建对象时初始化对象,给对象成员变量赋初始值。并且构造函数的命名也必须要与类名完全相同,构造函数也不能被直接调用,需要通过new运算符在创建对象时才会进行自动调用。
1、封装
被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。
2.什么是封装性?好处是什么
封装是将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
封装的好处:隐藏类的实现细节、只能通过规定方法访问数据、方便加入控制语句及修改实现。
答:密封类使用sealed关键字进行修饰,他不能用作其他类的基类,并且他没有派生类.密封类的作用是防止其他类继承该类密封方法是使用sealed关键字进行修饰的方法,它并不影响类的继承,但它可以防止重写基类中特定的虚方法.
继承是允许根据一个类来定义另一个类。当创建一个类时,可以不用重新编写新的数据成员及成员函数,只需要设计一个新的类,然后继承已有类的成员即可,已有的类称为基类,新的类则称为派生类。关键字是:符号。
优点:简化了子类的定义及扩展了父类的定义。
可以使用方法重写或者方法重载进行处理。
不可以继承。因为String类有final修饰符,使用final修饰的类时不允许被继承的。
构造器不能被继承,也不可以被重写(override)
答:注意:当使用virtual关键字修饰符后,不允许再同时使用abstract,static,或override关键字进行修饰使用virtual关键字修饰的方法就是虚方法,虚方法的关键字用于修饰属性方法.索引器或事件声明,并使他们可以在派生类中被重写.虚方法必须并提供派生类覆盖该方法的选项,并且必须有实现部分,虚方法的作用是可以在派生类中被重写.
答:注意:静态构造方法,是在构造方法的名字前使用static关键字修饰符的构造方法.
C#中静态类构造方法最主要的特点是:静态的构造方法是最先被执行的构造方法,并且在一个类里只允许有一个无参的静态构造方法.
4个特点如下:只允许有一个无参的静态构造方法在一个类中存在.
静态的构造方法不会被继承
在所有的静态成员被引用之前执行静态构造方法
在所有的构造方法中最先被执行的是静态的构造方法.
答:C#中接口具有9中特性:
1.接口只定义,不包含方法的实现
2.接口可以包含方法,属性.事件和索引器
3.接口成员必须是公共的
4.接口不能直接实例化
5,接口不能包含任何字段
6.接口描述可属于任何类或结构的一组相关行为.
7.接口自身均可以从多个接口继承
8.类和结构可以从多个接口继承
9.接口类似于抽象类,但继承接口的类型必须实现接口中的所有定义成员对象.
接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合.当定义了接口,就必须在继承类中实现它,这样类就支持接口中所
指定的所有属性和成员.
●静态的变量在类之间是共享的,非静态的是类的实例化对象独享的,
●静态方法可以通过类名.方法名的形式进行调用,不会产生内存开销,非静态的方法,需要实例化类的对象, 将方法保存到代码区中个,然后通过对象.方法名的方式进行调用。
●静态方法中调用非静态方法,需要先实例化非静态的方法对象,再通过对象.方法名的方式进行调用。
●非静态方法中可以直接调用静态方法与非静态方法。
方法名相同,参数类型或参数个数不同
同一操作作用于不同的对象,可以有不同的解释,产生不同的效果,这就是多态性。
多态具有可替换性、可扩充性、接口性、灵活性及简化性这些好处。
要有继承、重写、父类引用指向子类对象三个条件。
包含抽象方法的类称为抽象类。
接口是一种用来定义程序的协议,它描述可属于任何类型或结构的一组相关行为。接口可有方法、属性、事件和索引器或这四种成员的任何组合类型,但不能包含字段。
● 接口可以多继承,抽象类不能实现多继承。
● 接口只能定义抽象规则,抽象类即能定义抽象规则也能提供已实现的成员。
● 接口是一组行为规范,抽象类时一个不完全的类,着重于族的概念。
● 接口支持回调,抽象类不能实现回调,因为继承不支持。
● 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性、字段、包含有实现的方法。
● 接口多定义对象的行为,抽象类多定义对象的属性。
● 接口可以作用于值类型和引用类型,抽象类只能作用于引用类型。
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。
而抽象类在代码实现方面发挥作用,可以实现代码的重用。
override是重写方法,方法名,返回值以及参数相同,存在于父类和子类之间。
override是重载方法,参数类型、个数、顺序至少要有一个不相同,存在于父类及子类中。
接口可以继承接口、抽象类不能继承接口,但可以实现接口、抽象类可以继承普通类。
用virtual关键字修饰的成员函数称为虚函数,用于实现多态性。
没有执行代码,只定义了的函数称为抽象函数。
答:事件是.net程序员中经常使用的一个机制,事件是一种使对象或类能够提供通知的成员,客户端可以通过提供事件处理程序为相应的
事件添加可执行代码,事件可以理解为一种特殊的委托.
答:本质上,委托的调用就是执行了在定义委托时所生成的Invoke()方法
C#中的委托类都继承自Systen.Delegate类型,委托类型的声明与方法签名相似,有一个返回值和任意数目类型的参数.
委托是一种可用于封装命名或匿名方法的引用类型.委托类似于函数指针,但是委托是类型安全和可靠的.
答:通过上面的分析读者可以清晰地判别,委托不仅能绑定静态方法,同时也可绑定实例方法.当绑定实例方法时,Delegate.Target属性将会设置成指向该实例方法所属类型的一个实例对象,当绑定静态方法时,Delegate.Target属性将会设置成null;
事务是指为单个逻辑单元执行的一系列操作。
执行步骤:
创建事务所使用的一些对象(SqlConnection、SQL语句、SqlCommand)。
实例化SqlTransaction类。
使用这个事务所使用的con连接。
使用BeginTransaction方法执行这个事务。
在try{ }块里执行SQLCommand命令。
如果执行成功则执行commit()提交,否则执行rollback()回滚操作。
事务具备原子性、一致性、隔离性、持久性4大特性。
原子性(atomic):
事务中包含的各项操作必须全部执行或全部不执行。任何一项操作失败都会导致整个事务失败,其他已执行的任务所做的数据操作都会被撤销。只有所有的操作全部成功了,整个事务才算执行完成。
一致性(consistent):
保证了当事务结束后,系统状态是一致的。
隔离性(isolated):
使得并发执行的事务,彼此无法看到对方的中间状态。保证了并发事务的顺序执行,而不会导致系统状态不一致。
持久性(durable):
保证了事务完成后所作的改动都会被持久化。如果资源发生故障,可以通过日志将数据重建起来。
CTS:通用类型系统、CLR:公共语言运行时、CLS:公共语言规范
这三个是.NET Framework 3C 标准
GC是一种垃圾回收机制;用于回收堆内存中没有使用过的对象或变量,从而释放内存。
SELECT TOP * 1 FROM user
ORDER BY 创建时间 DESC
启动一个线程是使用start()方法。
Sql函数可以被select调用,而存储过程不可以存储过程返回多样化,sql函数只能返回值或者表对象
他们都支持Procedure cache模式
视图是一组查询的封装,是属于虚拟表(Create View)
作用包括:
外键是参照关系表的主键,体现的是表之间的关系,主键是表中实体的唯一标识(表中外键可以重复,主键内容必须唯一)。