各种知识点--C#提升
继承: 对象的隐式转换和显示转换
例: 父类: Person 子类:Chinese : Person 子类:Japanese : Person
Person p=new Person();
Chinese c=new Chinese(); Japanese j=new Japanese();
可以Person p1=c; 但不可以Chinese c1=p1;
可以Chinese c1=( Chinese)p1;或者Chinese c1=p1 as Chinese;
如果用as转换失败不报错, 而是null
p1 is Japanese 返回bool类型 如:if(p1 is Japanese)
类与类的关系: 继承和组合
组合:一个类利用另一个类的某些方法,组合使用.
常量在其他类中使用时直接通过类名来调用,例 double d = Program.PI; 无须声明(new)
static 静态变量, 可以理解为全局变量
虚方法:关键字:virtual 子类继承时可以重写也可以不重写
重写关键字:override
虚方法不可以被实例化,实例化没意义
抽象类,关键字:abstract
抽象类不能被实例化,抽象类中可以不全是抽象成员,也可以有实例成员
CTS、CLS、CLR分别解释:
CTS:Common Type System 通用系统类型。Int32、Int16→int、String→string、Boolean→bool
CLS:Common Language Specification 通用语言规范。不同语言语法的不同。
CLR:Common Language RunTime 公共语言运行时,就是GC、JIT等这些。
OA、MIS、HRM、CRM、KM解释:
OA(Office Automation):办公自动化;
MIS(Managment Information System):管理信息系统;
HRM(Human Resource Managment):人力资源管理,包括员工管理、薪资管理、入职管理、离职管理、报销管理、请假管理等;
CRM(Customer Relation Managment):客户关系管理系统、包括客户管理、客户关怀、客户回访、投诉管理、咨询管理、保修管理等;
KM(Knowledge Management):只是管理。
堆和栈的区别:
栈,是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义:局部值类型变量、值类型参数等都在栈内存中。
堆,是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
类和结构体的异同:
类Class 可以被实例化,属于引用类型,是分配到内存堆上的。类是引用传递的。
结构体Struct 属于值类型是分配在内存栈上的。结构体是复制传递的。
加分:Int32、Boolean等都属于结构体
使用foreach遍历访问对象需要实现IEnumerable接口或声明GetEnumerator方法的类型
String s=new String(“abc”);创建了几个对象?
两个。一个是“abc”,一个是指向“abc”的引用对象。
string s1=”abc”; //是一个对象
string s2=”abc”;
如果两个字符串“内容”一样,则还是一个string对象(字符串拘留池),因为字符串是不可变的
String类是sealed(密闭)类,不可以被继承。
StringBuilder 和 String 的区别:
String在运算时(如赋值、拼接)会产生一个新实例,而StringBuilder则不会。所以在大量进行字符串拼接或频繁对某一个字符串进行操作时最好使用StringBuilder。StringBuilder只会在最后ToString();时会产生一个字符串对象;
接口: 关键字interface
接口内可以有属性,可以有方法,但不能有访问级别的修饰符(public,private等,)也不能有实体{} ,接口内不能有字段.子类实现接口时必须实现接口内的所有成员,
类似抽象类抽象方法,需要重写方法
子类可以实现多个接口,但类不能继承多个父类
Public interface IName()
{
Int Age { get; set; }
Void Fly();
}
接口和类的异同:
不同点:
接口不能实例化,不能实现接口;
接口不包括方法的实现;
接口可以多继承,类只能单继承;
类定义可以在不同的源文件之间进行拆分(部分类-partial)。
相同点:
接口、类和结构都可以从多个接口继承;
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员;
接口和类都可以包含事件、索引器、方法和属性。
常用的类、接口举例:
常用的类:StreamReader、WebClient、Dictionary<key,value>、SqlConnection、FileStream、File、Regex、List<T>
常用的接口:IDisposable、IEnumerable、IDbConnection、IComparable、ICollection、IList、IDictionary
常用集合类:
List、Dictionary、Set、Stack(先入后出)、Queue、Tree等
抽象类(abstract)和接口(interface)的区别:
相同点:
都不能被直接实例化,可以通过继承实现其抽象方法。
不同点:
接口支持多继承;抽象类不能实现多继承;
接口只能定义行为;抽象类既可以定义行为,还可能提供实现;
接口可以用于支持回调(CallBack);抽象类不能实现回调,因为继承不支持。
接口只包含方法(Method)、属性(Porperty)、索引器(Index)、事件(Event)的签名,但不能定义方法;
抽象类可以定义字段、属性、包含有实现的方法。
接口可以用作值类型(Struct)和引用类型(Class);抽象类只能作用于应用类型。例如:Struct就可以继承接口,而类就不可以。
int i=1;
try
{
return i;
}
finally
{
Console.WriteLine(“Hello”);
i++;
}
即使try内有return,finally内的代码仍会执行。try只是先标记了return的值,执行
完finally内的代码就会返回try内的返回值(返回1不是2),即使finally内修改了返回值也是无效的。换为对象就不同了。
new关键字的几种用法:
new 运算符,用于创建对象和调用构造函数;
new 修饰符,用于向基类成员隐藏继承成员。表示“我的这个方法和父类方法的同名没关系” new只是不让编译器警告而已;
new 约束,用于在泛型声明中约束可能用作类型参数的 参数的类型
反射:
程序集包含模块,模块又包含类型,类型下有成员,反射就是管理程序集、模块、类型的对象,它能够动态的创建类型的实例,设置或获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例。
int、DateTime、string是否可以为null?
int、DateTime不能,因为它们是Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值为null,string可以为null;
using关键字有什么用?什么是IDisposable?
using 可以声明namespace的引入,还可以实现非托管资源的释放,实现了IDisposable的类在using中创建,using结束后会自动调用该对象的Dispose()方法,释放资源,等价于try{…} finally{…}
C#中的委托是什么?事件是不是一种委托?委托和事件的关系
委托可以把一个方法作为参数代入另一个方法
委托可以理解为指向一个函数的指针
委托和事件没有可比性,因为委托是类型,事件是对象。
事件的内部是用委托实现的。因为对于事件来讲,外部只能“注册自己+= 注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此诞生了事件这种语法,事件是用来阉割委托实例的,类比用一个自定义类阉割List。
事件只能add、remove自己,不能赋值,事件只能+=、-=不能= 。加分:事件内部就是一个private的委托 和add、remove两个方法,类似属性的get set
URL重定向: 实现接口:IHttpModle
Context.下有一个BeginRequest事件委托 ,
Context.ReWriter方法.重写URL
向浏览器输出一句话:
用Response.Write();会输出在<html>标签外
用Page.ClientScript.RegisterClientScriptBlock (
Type type, string key, string script, bool addScriptTags);
这样输出的代码在<form>内最前, 执行这句话时网页上form内的元素还没有显示.
用 Page.ClientScript.RegisterStartupScript(Type type, string key, string script, bool addScriptTags);
这样输出的代码在<form>内最后,执行这句话时,网页上form内的元素都已经显示完毕
注: 如果是JS脚本,如果带上<script></script>标签,则最后一个参数可以省略或为false,如果不带<script></script>则最后一个参数(addScriptTags )必须是true
页面传值的集中方式:
- 使用QueryString 如:….id=1; response.Redirect()…
- 使用Session变量
- 使用Server.Transfer重写URL
- 使用Cookie传值
- 使用Application传值
- PreviosPage
Sql语句分阶段查询数据:
Select * from
(select *,Row_Number() over(order by id) RowNumber from TableName) t where t.RowNumber >= 1 and t.RowNumber <= 10
ObjectDataSource控件绑定数据时, 如果用<%#Eval(“Id”)%>来绑定数据时不会自动回发给ObjectDataSource可以用FindControl找到控件或者使用<%#Bind(“Id”)%>来绑定Bind绑定可以自动回发数据
使用Bind或者Eval绑定数据时可以指定格式: Eval(“Id”,”List.aspx?Id={0}”),
{0}表示占位符,代替前面的”Id”也可以指定时间或金钱格式:Bind(“Money”,”{0:0.00}”),表示显示为两位小数的钱数.Bind(“DateTime”,”0:yyyy-MM-dd”)
“ 0: “表示代替前面的值,冒号后为指定的格式
发布网站所需步骤(4步):
- 需要一个域名,可买
- 需要一个空间.可买
- 把网站放到web服务器上并绑定域名,
- 把域名指向网站,等待域名生效就可以了.
自定义错误页面,(Web.Config配置文件)
<customErrors mode=”RemoteOnly” <!-表示只有远程访问时显示自定义错误->defaultRedirect=”ErrorPage.htm” <!-自定义的默认错误页面->
<error statusCode=”404” redirect=”FileNotFond.htm” <!-自定义的”404”错误页面-> </ customErrors>
允许调试
<compilation debug=”true”/>
应用程序运行时配置
<httpRuntime enable=”true” execution Timeout=”90” maxRequestLength=”4096”/> <!-最长时间90秒,客户端向服务器发送的最大请求数据(KB), 只有在debug为true时.这里的设置才有效->
XML于HTML的主要区别:
- XML是区分大小写的,HTML不区分。
- 在HTML中,如果清楚的显示出段落列表建在何处结尾,可以省略-</p>或</li>之类的结束标签。在XML中绝对不可以省略结束标记
HTML:<img src=”1.jpg”><br/>
XML:<img src=”1.jpg”></img><br/>
- 在XML中可以用单个标记必须加“/”字符作为结尾<img src=”2.jpg”/>;
- 在XML中,属性值必须分装在引号中,HTML中引号是可用可不用的;
- 在HTML中,可以拥有不带值的属性名,XML中所有属性必须都带有相应的值;
XML是用来存储和传输数据的;
HTML是用来显示数据的。
搜索:
HTML解析:推荐使用微软的,需要添加引用Microsoft.mshtml
输出json 格式的数组:
先声明一个泛型: List<string> list =new List<string>();
再声明一个json对象: JavaScriptSerializer jss = new JavaScriptSerializer();
调用jss的Serialize(List)方法序列化成字符串写回浏览器:
string json = jss. Serialize(list);
context.Response.Write(json);//使用一般处理程序
Jquery AJAX效果:
$.post(“/filename/PageName.aspx”,{”id”:4},function(data){……});
Web.config配置文件.配置用户级别:
<location path=”PageName.aspx”>
<system.web>
<authorization>
<alow roles=”SysAdmin,ChiefEditor” />
<deny users=”*” />
</authorization>
</system.web>
</location>
在一般处理程序中设置报文头,用来保存文件:
context.Response.ContentType=”text/plain”;
context.Response.AddHeader(“Content-Disposition”, “attachment; filename=123.txt”);
//告诉浏览器这是一个附件,弹出窗口提示用户保存.
常用开源项目:
Lucene.net、NPOI、JQuery、AJAX toolkit、Quartz.Net、JqueryUI、MVC……
在CodePlex、SourceForge等网站上有很多的开源项目。