应用程序域: 公共语言运行库围绕同一应用程序范围内创建的对象建立(即,从应用程序入口点开始,沿着对象激活的序列的
任何位置)。应用程序域有助于将在一个应用程序中创建的对象与在其他应用程序中创建的对象隔离,以使运行
时行为可以预知。在一个单独的进程中可以存在多个应用程序域。
受管制的代码:
*******在.net环境中运行的代码都称之为受管制的代码
在.net环境之外,在Windows上运行的代码称之为不受管制的代码
********装箱就是把值类型转成引用类型,好像是boxing,把值从堆栈转到堆中.拆箱相反
****************************************************************************
什么是受管制的代码? 在CLR虚拟机中运行的代码
什么是非受管制的代码? 除了上面那些,剩下的都是.
什么是装箱和封箱? 值类型和引用类型在内存中是位于不同地方的,装箱和拆箱就是在这两个地方间搬运来搬运去,从值类
型这边复制到引用那边,从引用又复制回来这边. 表面看就是值类型和引用类型的转换,其实里面仔细分开来内容很多的.
这是很耗的工作,尽量减少装箱拆箱的次数.比如
1+ "3 "+ DateTime.Now
这上面就是一个很不好的代码例子.
***********************************************************
RTTI (Run-Time Type Identification) :类型识别系统 (强类型系统)
一般说强类型或弱类型语言,像c#,c++等是强制类型定义的语言,所有变量先定义再使用,数据类型不可变等
而javascript则是弱类型语言
多态:覆盖、重载
重载:
1、同一个类
2、方法名相同
3、参数列表不同(个数、类型、ref、out)
每个类型成员都有一个唯一的签名。
方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。
只要签名不同,就可以在一种类型内定义具有相同名称的多种方法。
当定义两种或多种具有相同名称的方法时,就称作重载。
CTS通用类型系统 (common type system) :
一种确定公共语言运行库如何定义、使用和管理类型的规范。
CLR公共语言运行库:
.NET Framework 提供了一个称为公共语言运行库的运行时环境.
它运行代码并提供使开发过程更轻松的服务。
CLS公共语言规范:
要和其他对象完全交互,而不管这些对象是以何种语言实现的.
对象必须只向调用方公开那些它们必须与之互用的所有语言的通用功能。
为此定义了公共语言规范 (CLS),它是许多应用程序所需的一套基本语言功能。
**************************
值类型和引用类型的区别,就在于当函数参数传递的时候.
值类型是把自己的值复制一份传递给别的函数操作.无论复制的值怎么被改变.其自身的值是不会改变的
而引用类型是把自己的内存地址传递给别的函数操作.操作的就是引用类型值的本身.所以值被函数改变了.
这就是传值和传址的区别
***************************************
ADO.net中常用的对象有哪些?分别描述一下
Connection:连接对象. 传递连接字符串,以连接数据库。
Command:命令对象 传递 T-sql语句或者存储过程,以执行对数据库的查询与操作。
DataAdpater:适配器对象 管理 Command对像。主要用于查询或更新数据。
DataReader:数据读取器对象 快速、以向前、不断开连接的情况下读取数据。
DataSet:数据集对象 从数据库中取出数据,保存到内存,即可断开连接。
*****************************************
params 的用法:对于不确定的参数,用params int【】num
ref的用法: 值传递时传递值的地址
out的用法:参数传入之前不赋值
***************************
析构函数:
当对象不再被应用程序使用时,垃圾回收站会自动调用析构方法,进行资源释放。
析构方法与构造方法的格式:前用~
构造函数的性质:
1、必须和类同名;类不写构造函数,系统默认写一个无参构造函数
2、可以带参,可以不带参。没有返回值
3、对对象的初始化时的赋值,提供初始化的方法
4、类对象初始化,必须调用构造函数(构造函数不能显式调用)
5、构造函数可以重载(相同的方法名,参数不一样)
class Student
{
public Student(int n,string s){}
public Student(int m):this(n,s){}
}
>>>>>>>>静态构造函数:对类本身进行初始化
1、静态函数无参,没有可访问性修饰,最多调用一次
2、只能系统调用,不能显式调用;调用类时自动调用该方法
***********************
Main()方法是程序的入口,可以返回int或void
接受参数
值类型:
数据类型(int,long,double,bool,char,float)
struct,enum
引用类型:
object,string,class,interface,数组
******************************************
被sealed关键字修饰的类称为密封类,密封类不能被继承
**************************
关键字:
可访问修饰符:
public:对任何类和对象都公开,无限制访问
protected:仅仅对该类以及该类的派生类公开
private:仅仅对该类公开
internal:内部的,只能只包含该类的程序集中访问该类
protected internal :只能在本类和派生类或者包含该类的程序集中
static 静态函数不需要创建类的实例
const 定义常量
readonly 可以是任何类型,运行时是只读的一个常量(必须直接赋值,或在构造函数里赋值)
隐含static,可以由实例直接调用
>>>>>>>>>>>>>>>
namespace 默认为public
class 默认为internal
struct-->值类型-->与继承无关-->protected有关的 对struct不合适
interface,enum-->public
对interface中的成员,可访问性无效(不需要定义)
*******************************************************
索引器:是属性的一种都是方法。
格式: public string this【int n】
{
get{return name[n];}
set{name[n]=value;}
}
#region可以把一组代码标注为一个有名称的可伸缩的块,提供一种近似大纲的注释
****************************************************************8
委托:delegate为系统关键字,创建委托类型
委托返回值类型和参数列表决定了委托能够代表的方法
**********************************************************************
1、进程和线程的区别
进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,
一个进程可以有多个线程,这些线程共享这个进程的资源
*****************************************************
成员变量和成员函数前加static的作用
它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。
分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,
类成员函数负责这种统计的动作。
*********************************************************
malloc和new的区别
new是C++的关键字。malloc在分配内存时必须按给出的字节分配,new可以按照对象
的大小自动分配,并且能调用构造函数。可以说new是对象的对象,而malloc不是。
本质上new分配内存时,还会在实际内存块的前后加上附加信息,
所以new所使用的内存大小比malloc多。
*********************************************************
堆和栈的区别
栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。
堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。
栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的
栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,
特点是灵活方便,数据适应面广泛,但是效率有一定降低。栈是系统数据结构,对于进程/线程是
唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态
分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca
函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动
态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放
回系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。
*********************************************************
类------
| ---状态
| ---操作 的数据结构
字段:是类与类的实例关联的变量。
静态字段 用static 声明,一个静态字段只表示一个存储位置
无论一个类创建了多少实例,其静态字段只有一个副本
实例字段 不用static,类的每个实例都只包含该类所有实例字段的一个单独副本
********************************************************
虚方法与抽象方法的区别:
从类这种机制看,你覆盖是把东西换了,对于这个类来说,以前的方法不存在了。重写是你在这个类的
虚函数表里增加了一项,并没有覆盖,是一种动态性的调整。例子,类A和类B的继承关系是类
B继承类A,然后有一个函数FUNC。假如FUNC是普通函数,类B覆盖了,那么把一个类B的实例转换为类A时,你调用
这个FUNC仍然是覆盖后的函数,如果是虚函数,得到的确实类A的FUNC。
这两个东西或许你从感觉觉得区别不大,但是这两个有根本性区别,虚函数实现了一个函数一对多的关系,可以通
过同个名字但是不同地址(类型转换,C++里的指针等)去操作不同的函数,这种特性用覆盖是实现不了的,因为普
通函数编译的时候已经确定了调用的位置,而虚函数的调用是运行时才确定的(函数地址)。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1. 虚方法必须有实现部分,并为派生类提供了覆盖该方法的选项 抽象方法没有提供实现部分,抽象方法是一种强制
派生类覆盖的方法,否则派生类将不能被实例化
2. 抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写 虚方法不是 也不必要重写。其实如果类包含抽象
方法,那么该类也是抽象的,也必须声明为抽象的。
3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。抽象方法不能声明方法实体 而虚方法可以
包含抽象方法的类不能实例化 ,而包含虚方法的类可以实例化
*******************************************************