类:类是一个抽象的概念,是对多个对象提取相同的特性的产物,对象是类的一个具体实例化对象,在程序中,要使用得实例化对象来访问类中的成员。
1.三大特性:封装、继承、多态
2 封装:把字段封装成属性,把多个参数封装成一个对象,把代码封装到方法里面调用,多个CS封装成程序集
继承:把几个类相同的特性存在父类里,进行引用,作用:减少代码的重复性, 实现多态(继承的特性:单根性、传递性)
多态:现实中就是事物的多种形态,在程序里,表现为父类的对象指向子类的实例,在调用方法时,调用的是子类重写的方法(多态使程序可扩展,更灵活),举例子,人,中国人,日本人
构造函数:不能被继承,子类中如果有多个构造函数的话,
子类中可以用this调用其他构造函数,子类可以用case调用父类的构造函数,当子类调用构造函数的时候,默认会调用父类中无参的构造函数(解决办法:1父类写一个无参构造函数;2:在子类中写加一个:case去调用有参的构造函数)
虚方法:子类调用父类的虚方法,可以重写也可以不用重写
静态类:不能被继承,不能被实例化。静态类在第一次被使用的时候被调用,并且只调用一次。
静态构造函数:没有访问修饰符,没有参数。
密封类(sealed):不能继承(),不想被继承在前面加一个私有关键字(privete),String类
类型转换
抽象方法:1.抽象方法必须用abstract标记,并且抽象方法不能用任何实现
2.抽象成员必须标记在抽象类中
3.抽象类不能被实例化
4。子类继承抽象类后,必须把父类中的所有抽象成员都重写(除非子类也是一个抽象类,可以不重写)
5.抽象成员的访问修饰符不能是private
6.在抽象类中可以包含实例成员
7.抽象类是有构造函数的。虽然不能被实例化
什么时候需要虚方法,什么时候需要抽象方法
如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法来实现多态。
如果父类中的方法没有默认实现,父类也不需要被实例化,则可以讲该类定义为抽象类
(简单讲就是要实例化的时候可以用虚方法实现多态,不需要的时候可以用抽象类来实现)
接口:1.接口中只能包含方法(方法、属性、索引器、事件)
2.接口中的方法也不能有任何实现(就行抽象方法,直接加一个分号)
3.接口中的成员不能有任何访问修饰符(哪怕是public)默认为public
4.接口也不能被实例化
5.实现接口的类,必须实现接口中所有的成员
1.如果使用virtual和override?
子类要重写父类的方法的时候,可以把父类定义为virtual的虚方法,子类定义用override的重写
。(方法的重写是为了多态,多态多种表现形态,就是进行方法的重写实现多种情况,比如做OA系统的时候,有领导和员工类,然后两个都需要打卡,但打卡的时间不一样,调用的打卡具体方法不一样)
2.如果使用abstract和override?
在抽象类中,父类需要用abstract定义为抽象类,抽象方法也需要用abstract方法来标记并且抽象方法必须在抽象类中,然后子类继承父类使用的时候,调用该方法的时候必须重写用override关键字(除非子类也是抽象类)
3."方法重载overload"、"方法重写override"、"隐藏类new"是同一概念吗?
不是,方法重载只看方法名必须一样,方法的参数列表不一样(个数不一样,类型不一样,顺序不考虑),就叫重载,和方法返回值没有半点关系。
方法重写:子类继承并重写父类的方法的时候用,用这个关键字,比如虚方法和抽象方法的时候重写(然后再讲什么时候用虚方法和抽象方法的时候)
new:子类想隐藏父类中继承下来的方法的时候,可以使用new方法关键字
4.抽象类和接口的区别?
抽象类适用于同一系列,并且有需要继承的的成员
接口适用与不同的系列,具有相同的动作(行为、动作、方法)。
对于不是相同的系列,但具有相同的行为,这个可以考虑有接口实现,接口解决类不能多继承的问题。
所有的引用类型都继承自Object
所有的值类型都继承自System.ValueType[System.ValueType又继承自Object]
结构体:值类型。
值类型、引用类型。
值传递:传递的是栈中的内容
ref引用传递:传递的是栈本身的地址
异常:在运行的时候发生不可预知的错误(用异常捕获try{}catch{}finally)
统计一个字符串中,天安门出现的次数(天安门,我爱北京天安门,天安门上太阳升)
string s="天安门,我爱北京天安门,天安门上太阳升";
int n=s.Split('天安门').Length-1;
面试题:动态显示[]里面的某某某,获取他第一次出现的索引位置(我爱[某某某]哈哈哈哈)
string msg = "我爱[某某某]哈哈哈哈";
msg = msg.Substring(msg.IndexOf("[")+1, (msg.IndexOf("]")-msg.IndexOf("[")-1)); Console.WriteLine(msg);
字符串
1.不可变性:无论对字符串怎么操作,但是开辟一块新内存。
2.留用性:可以把程序中的字符串相同的字符串变量指向同一个地址。
3字符串池:当程序中有多个相同的字符串常量的时候,这时,这些字符串常量都是指向内存中的同一个字符串地址,这个特性叫字符串池。
StringBuilder(字符串拼接)
为什么不都用StringBuilder?
1.一般才字符串参数都是用string类型,stringBuilder还要转换成ToString()
2.字符串有一些特性(比如有不可变、字符串池)
如何比较两个对象是否相同?
两个对象在堆里面使用的是同一块内存,这时是同一个对象。
用object.ReferenceEuals(p1,p2),如果用Equals的话(因为Equals方法是父类Object的一个虚方法,,子类都可以进行重写,所以用这种方法就不准确了)
DotNet为什么有代的概念(分3代,分代可以不用一次性回收,不然会影响程序执行效率,优先回收第0代,第0代的回收几率高,第1代次低,第2代再次之)
若引用:WeakReference,对于创建比较耗时的对象可以使用若引用。(比如创建List集合来存储数据库中一百条数据,当这个List不用的话可以用若引用,如果后来还没回收可以调用若引用调用(创建集合需要时间,连接数据库也需要时间和内存))
垃圾回收。
作用:提高内存的利用率
什么样的对象才可以被垃圾回收?
1引用类型 2没有任何变量应用的对象(什么时候被回收不知道,系统指定的)
(一开始创建对象都是在第0代,当垃圾回收的时候会先回收第0代的对象,把那些可以被释放的释放掉,没有释放的自动移到第1代,然后创建对象的时候还是第0代,当下次回收的时候还是第0代,把没有被回收的自动移到第1代,当第1代满了,把该回收回收了,还是满的时候自动移动第2代,第2代满了才垃圾回收,还是慢了系统就会报错)(为什么要分代垃圾回收,因为垃圾回收会影响程序正常执行的效率)
泛型集合
1 ArrayList object
2 Hashtable key(object),val(object)
(1、2需别:ArrayList查找的时候要循环遍历,Hashtable可以根据键值就可以找到,省得循环遍历,查询速度快)
(为什么要集合,不用数组?因为数组的长度是固定的,只能装同一类型的)
3 List<T>
Dictionary<K,V>
(当对于1 2 ,3 4的数据类型固定了,使用省去各种的类型转换)
string s1 = "a";
string s2 = "b";
int n3 = 10;
double d4 = 99.9;
string result = string.Concat(s1,s2,n3,d4); //Concat发生字符串连接
有没有发生装下和拆箱,如果发生了,发生了几次?(面试题)
用Reflector看把 int double 给object发生两次装箱,没有发生拆箱,只发生类型转换
我产生乱码原因:文本文件存储时采用的编码,与读取时采用的编码不一致,就会造成乱码问题。
解决:采用统一的编码就Ok了
为什么有些对象可以用foreach,有些不行?
能被foreach里面有一个GetEnumerator方法,通过这个方法实现了IEnumerable接口的对象,这个对象就可以对类中的元素进行遍历,foreach通过查看Reflector的il代码,也是通过类调GetEnumerator返回一个接口类型,接口类型MoveNext()也许生成这个代码
为什么要进行序列化?(序列化,对象到byte[]的过程)(步骤:1.创建序列化对象2.创建流,将对象序列化 )
将一个复杂的对象转换成流,方便我们的存储与信息的交换。
问题:为什么反序列化的时候需要原来定义Person类的那个程序集?
反序列化的时候,要返回一个对象,这个对象必须根据原来person所在的程序集才能创建,也就是说person.bin中包含的仅仅是一些数据,根据这些数据是无法在内存中创建对象的。只能是根据原来person类型的程序集来创建对象,然后把perosn.bin中的数据---对应进行赋值。所以反序列化的时候需要添加对原来程序集的引用。
什么样的类型才能被序列化?
1.要被序列化的对象的类型必须标记为可序列化的[Serializable]
2.当前被序列化的对象的父类也要标记为可序列化。
类中字段或者或属性的类型也必须为可序列化的。
正则表达式 通配符
1> .除\n任意的单个字符 如 a.b axb a2b
2> [] 表示[]里面的任意单个字符
a[xys]b
aab
axb
a[0-9]b (表示0-9之间的任意一个字符与ab匹配,如a1b a2b)
a[^xyz]b 表示中间数出xyz之外的任意一个字符
a[^a-zA-Z0-9]b 表示ab之间除了a-z或A-Z或0-9之间的任意一个字符都可以。
3> | :将两个匹配条件进行逻辑“或”运算。‘z|food’ 能匹配 “z” 或 “food”。‘(z|f)ood’ 则匹配 “zood” 或 “food”。 //注意^$问题。
4>( ) :将 () 之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体。改变优先级、定义提取组两个作用。
5> *:匹配0至多个在它之前的子表达式,和通配符*没关系。例如正则表达式“zo*”(等同于z(o)*)能匹配 “z” 、“zo”以及 “zoo”;因此“.*”意味着能够匹配任意字符串。"z(b|c)*"→zb、zbc、zcb、zccc、zbbbccc。"z(ab)*"能匹配z、zab、zabab(用括号改变优先级)。
6> + :匹配前面的子表达式一次或多次,和*对比(0到多次)。例如正则表达式9+匹配9、99、999等。 “zo+”能匹配 “zo”以及 “zoo” ,不能匹配"z"。
7> ? :匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 。一般用来匹配“可选部分”。(终止贪婪模式)
8> {n} :匹配确定的 n 次。“zo{2}”→zoo。例如,“e{2}” 不能匹配“bed”中的“e”,但是能匹配“seed”中的两个“e”。 //seeeed,不可以。
9> {n,} :至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配 “seeeeeeeed”中的所有“e”。
10> {n,m} :最少匹配 n 次且最多匹配 m 次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。 {2,5}//bed,seed,seeed;beeeeed错误。
11> ^(shift+6) :匹配一行的开始。例如正则表达式“^regex”能够匹配字符串“regex我会用”的开始,但是不能匹配“我会用regex”。
^另外一种意思:非!([^0-9])
11> $ :匹配行结束符。例如正则表达式“浮云$” 能够匹配字符串“一切都是浮云”的末尾,但是不能匹配字符串“浮云呀”
^abc,匹配一个正则表达式的开始
abcjflkdsjfkdsjf
888$,匹配一个正则表达式的结束。
积分多少快乐解放路口的手机费888
简写表达式
\d:代表一个数字,等同于[0-9] \\d →\d
\D:代表非数字,等同于[^0-9]
\s:代表换行符、Tab制表符等空白字符 ,(空格、回车、制表符)
\S:代表非空白字符(a0%$@@)
\w:匹配字母或数字或下划线或汉字,即能组成单词的字符,除%&#@!$等字符。[a-zA-Z0-9_汉字]
\W:非\w ,等同于[^\w] %
d:digital;s:space、w:word。大写就是“非”
Regex.IsMatch(); //判断一个字符串是否匹配某个正则表达式
Regex.Match(); //从某个字符串中提取匹配正则表达式的某个子字符串
Regex.Matches(); //字符串提取,可以提取所有匹配的字符串
Regex.Replace(); //字符串替换,把所有匹配正则表达式的字符串替换为对应的字符串
验证邮政编码 string regex = "^\\d{6}$";
验证身份证号码 string iDregex = @"^(\d{15}$|^\d{18})$";
电话号码类型如010-8888888或010-88888888或010xxxxxxx或0335-8888888或0335-88888888(区号-电话号),10086、10000、95595、95588、13245678901
验证电话号码的正则 string reg = @"^(\d{3,4}\-?\d{7,8}|\d{5})$";
邮箱验证: string regEmail = @"^[a-zA-Z0-9_\.]+@[a-zA-Z]+(\.[a-zA-Z]+)+$";
验证IP: @“^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$”。.是正则表达式中的特殊含义,因此需要转义。进一步严谨:^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$ "
合法的日期格式“2008-08-08”。四位数字-两位数字-两位数字。@“^\d{4}\-\d{2}\-\d{2}$”,进一步严谨:^\d{4}\-((0[1-9])|(1[0-2]))-((0[1-9])|(1[0-9])|(2[0-9])|(3[0-1]))$
什么是贪婪模式?
当正则表达式在字符串中找匹配的时候,假如匹配一个也行,多个也行,他会尽量多的匹配最多。(?加在限定符(如+、*等))
委托:委托可以存储一个委托对象,也可以把一个方法存储到存储到委托对象里面,委托类型声明一个委托对象,他指向的必须是一个委托对象,它直接指向一个方法内部也new一个委托对象,在委托对象里面存储了一个方法。(引用类型)
委托使用步骤:
1>定义一个委托类型(public delegate void WeituoDelegate(参数);)
2>声明一个委托变量(WeiTuodelegate wd=new WeiTuoDelegate(方法);)
3>调用委托 (if(wd!=null){//调用委托 //ed(); wd.Invoke();})
委托的作用就是:可以在某个代码内部,嵌入一段外部代码,相当于是:注入,编写这个类的人可以先把这个类先写好,用这个类的人可以随意扩展里面的内容。在自定义控件中的事件会大量使用到委托(写事件的时候会用到委托)
//可以把静态方法或者私有方法赋值给委托变量,赋值后只要使用到该委托变量的地方就能使用该方法,打破了访问修饰符的限制。
匿名方法:当
lamdba表达式:编译的时候会将lamdba表达式编译成一个C#的匿名方法,但是使用lamdba表达式会在很多时候减少代码量
委托的特性:1.具有类似于string一样的不可变性。
2.建议使用的时候尽量少定义自己的委托,使用系统中已经有的委托。减少程序集中定义的类型的个数。
通过委托来实现事件的功能的问题:
1.可以在类的外部来触发。因为委托变量TripleClick的访问修饰符为public的,所以在外部任何地方都可以访问。
2 如果把TripleClick的访问修饰符修改成private的,那么的却不能 在外部触发,但是也不能在外部赋值。
3.由于委托可以使用=来赋值,所以,就有可能将前面的所有的已经注册的事件 处理程序都覆盖掉了
委托和事件的区别:
委托是数据类型,事件是一个委托变量。(事件最终是生成 1.一个私有的委托 2.两个public的方法Add和Remove,分别用来实现事件的+=和-=)
事件:先声明委托 public delegat void MyDelgate(); public Event MyDelegate MyClick
程序集 .dll .exe
XML(extensible markup language)
XML和HTML的且只有一个跟元素
2.XML中元素必须关闭
3.XML中属性值必须 用引号
4.XML大小写敏感(CseSensitive)
深拷贝:
浅拷贝:
Xml序列化:把一个对象写成一个XML过程
把一个对象写成流的过程叫做二进制序列化的过程
DSMS(Database Management System,数据库管理系统)
主键的作用:保证表中的每条数据的唯一性。
========主键的特点============
1.主键不能重复
2.主键不能为空
========主键的分类==============
1.>逻辑主键(选择为表中增加的那些"自动编号"或者"GUID"列作为主键(没有实际业务上的意义)的主键,叫做逻辑主键)
2.业务主键(选择表中那些在业务中有实际意义的列作为主键,叫做业务主键)
===========组合主键(不建议使用)=================
同时选择多列作为一个主键,叫做组合主键。(复合主键) 组合主键一般不建议使用
1>.主键,建议选择那些一般不会被修改的列。
2.>选择单列,不要选择多列(不用组合主键)
3.>选择那些简单列(整数列(自动编号),)
bit数据类型在写程序的时候只能用1(true)或0(false)来表示,但是在设计器中只能用true或false单词来表示。
3.主键,建议选择那些一般不会被修改的列
存储字符串的几种数据类型
char(10)
nchar(10)
varchar(10)
nvarchar(10)
varchar(max)
nvarchar(max)
------不建议使用text和ntext,推荐使用varchar(max)与narchar(max)--------
text
ntext
=================varchar与char的区别=======================
--可变长度,表示该列最多可以存储10个字节,如果实际存储不够10个字节,则会在存储的时候自动计算一下实际的存储个数,而动态的改变长度。【节省空间】
--可变长度
varchar(10)
char(10) 固定长度,表示在数据库中存储的时候占用10个字符的空间,如果超出10个则报错,如果不够则补全
===============nchar(10)、char(10)======================
nchar(10) 可以存储10个字母或者5个汉字
char 用来存储数据的时候,英文占1个字节,中文占2个字节。所以如果是10个长度的char,可以存储10个字母或者是5个汉字,char或者varchar的小括号中的最大长度可以写8000。
nchar(10) 表示可以存储10个字母或10个汉字
nchar 来存储数据的时候无论存储的是中文还是英文都是每个字符占2个字节。 最大可以写4000
SQL全名:结构化查询语言(Structured Query Language)
SQL注意分DDL(数据定义语言,建表建库等语言)、DML(数据操作语言)、和DCL(数据库控制语言)
Create table 、Drop Table、Alter Table 等属于DDL、select insert Update Delete等属兔DML,GRA于EVOKE取消授权属于DCL
SqlDataReader由于每次向前走一条都会将上一条记录销毁,所以DataReader是只进的(不能回头)
SqlDataReader特性2:只能读取数据不能修改数据,因为查询出的数据集(结果集)是一个独立的再服务器内存中的数据, 已经与源表没有关系了。
当使用DataReader的时候必须保证Connection是open状态。
创建了一个连接对象:SqlConnection conn=new SqlConnection();
conn.Open();
conn.Cloese();
conn并没有关闭,一直处于打开状态,当调用Close()方法的时候会把当前的连接对象放入到连接池中。
当下次再创建一个对象,如果该连接对象所使用的连接字符串与上次连接对象的连接字符串完全一致(必须完全一致,包括大小写,空格) 这时,其实并不会真正的再创建一个数据库的连接,而是使用连接池中现有的连接。
Ado.net连接池使用总结:
1.第一次打开连接会创建一个连接对象。
2.当这个连接关闭时。(调用Close()方法时)会将当期那连接对象放入池中。
3.下一个连接对象,如果连接字符串与池中现有连接对象的连接字符串完全一致,则会使用池中的现有连接,而不会重写创建一个。
4.只能对象调用Close()的时候才会放入池中,如果一个连接对象一直在使用,则下次在创建一个连接对象发行池中没有,也会再创建一个新连接对象。
5.在池中的连接对象,如果过一段时间没有被访问则自动销毁。
微软企业库:Enterprise Library
http://www.cnblogs.com/kyo-yo/tag/%E5%BE%AE%E8%BD%AF%E4%BC%81%E4%B8%9A%E5%BA%93/
聚集索引(聚簇索引):当数据实际的存储顺序,与索引的顺序一致就把该索引叫聚簇索引。
非聚集索引(非聚簇索引):当索引中数据的顺序与数据实际存储的顺序不一致的时候,该索引叫非聚集索引。
填充因子
面试题:
单张表A数据量过百万,关联表B数据过千万,如何查询优化?
把A表可能用到数据提到临时表1中,把B表可能用到的数据提取到临时表2中,然后再进行查询(原因:1.放到临时表中数据量变小了,2.临时表只用来查询性能高(减少很多增删改) 3.在内存里面查询速度灰常快)
一般过千万的都不会存在一张表中,用分表来存储(主动分区 和被动分区)
视图 优点:
筛选表中的行\降低数据库的复杂程序
防止未经许可的用户敏感数据
事务: 可以回滚 错误的代码 照成的损失
存储过程:
1.执行速度更快 --在数据库中保存的存储过程语句都是编译过的
2.允许模块化程序设计--类似方法的服用
3.提高系统安全性--防止SQL注入
4.减少网络流量-只要传输 存储过程的名称
存储过程与select对比:1.减少解析编译的过程 2.灵活:业务逻辑编号的时候直接改存储过程就可以,程序不用重新编译部署 3.直接使用存储过程的话,所有业务逻辑都放到存储过程里面了。
呼叫中心(Call Center):
计算机与电信集成技术(CTI)(来电显示等)
CRM(客户关系管理,Customer Relationship Managerment)。 CRM不一定非要和CTI集合。和CTI集成以后就有了自动化的过程。
OA(Office Automation):MIS(Management information System,信息管理系统,什么都是MIS系统)
ERP(Enterprise Resources Planning)
坐席(Seat)→电话后面坐着的客服。
交换机(应用于具有成百上千的坐席的大型的呼叫中心)
PK语音卡(200人以下,相当于共享上网,无需申请业务)
MD5(散列算法)
1.不可逆
2.同一只每次计算出来的ms5值都是相同的。
3.不同的值计算出来的md5值是不同的。(理论上是两个不同的值,是可能计算出相同的md5值)
Excel遇到大数据导出怎么办?
1》1.占内存 2.Excel存储的行有限的。3一个Excel中创建Sheet也有限。
2>太大数据量考虑文本文件(csv)或者xml
面试题:
树的深度遍历和广度遍历
深度遍历就是把一个节点以及子节点都加上出来,然后再加载下一节点
广度遍历就是把每一节点都加载出来,然后在加载每个节点的下一节点。
递归删除
DelegateId(int id)
//1,先根据id,查询当前id下的所有子节点
List<..>list=GetDataByPaRentId(id);
解耦:解除耦合,手机电池和手机就是高耦合(你的手机我不能用,互相的依赖度高),耳机和电脑就是低耦合。不要写delete(TreeNode)
string? n1 = null; //错的,值类型才能用?,引用类型本身就可以为null
三层架构
界面层(UI):用户控件,采集数据,经用户返回数据按某些方式显示出来。(app.config)
业务逻辑层BLL(Business是设数据返回不同的结果,判断用户是否锁定,发帖时候做一些审核
数据访问层DAL(Data Acess layer):拼接sql语句,出现各种数据库的类,比如connection command
作用:
解耦:1.分工合作,开发人员可以专注于某一层。
2.可移植性 3. 支出分布式系统开发(基于网络) 4.扩展性强。MSSQL、Oracle之间切换。
代码生成器: 1. 动软代码生成器 2.CodeSmith(CodeSmith(支持VS2010包含三层模板文件)
partial 关键字:
部分类( partial class),把一个类的定义放到多个cs文件中,类标注“partial ”,多个cs文件中定义的内容不能重复,多个cs文件合在一起构成一个类(文件名任意,因为类的名字不一定要和文件名一致。)。部分类的应用:WinForm、ASPX中自动生成的界面和用户编写的代码cs文件构成部分类,这样就避免用户误修改自动生成的代码。
用部分类可以解决代码生成器的代码的扩展问题,不要修改自动生成的代码文件,因为代码生成器生成的DAL文件是部分类,这样可以编写一个DAL的部分类文件,为DAL增加一个方法。
C# 怎么把 网络流(NetWorkStream) 拷贝 到 内存流(MemoryStream)
//流高级中网络流与内存流中切换读取,读服务器上的excel文件
//作此实验 要建一个excel文件 读取第一行第一列值
//还要用cassiniDev server 建一个小型web服务器
static void simple5()
{
WebClient wc = new WebClient();
//wc.DownloadFile("http://localhost:32768/abc.xls", @"c:\\abc.xls");//因为担心安全问题,所以采用流读取,可以下载下来直接打开
Stream stream= wc.OpenRead("http://localhost:32768/abc.xls");//因返回的是connectstream流,但他不支持来回读取,此流不能用NPOI读,所以把网络流读到内存中
MemoryStream ms;//定义内存流
using (stream)
{
ms = new MemoryStream();//建一个网络流
byte[] bytes = new byte[1024];
int readbytes;
while((readbytes=stream.Read(bytes,0,1024))>0)//把网络流中复制到内存流中
{
ms.Write(bytes, 0, readbytes);//一次读写1K
}
}
using (ms)
{
HSSFWorkbook workbook = new HSSFWorkbook(ms);//用工作薄接收内存流
HSSFSheet sheet = workbook.GetSheetAt(0);//取第一个表
HSSFRow row = sheet.GetRow(0);//取第一行
HSSFCell hc = row.GetCell(0);//取第一列
Console.WriteLine(hc.StringCellValue);//输出 王小明
}
}
中文与拼音转换
D:\Program Files\Microsoft Visual Studio International Pack\Simplified Chinese Pin-Yin Conversion Library\
简繁体转换
D:\Program Files\Microsoft Visual Studio International Pack\Traditional Chinese to Simplified Chinese Conversion Library and Add-In Tool\
为什么不用别人的邮箱,要自己架设?
1 别人的邮箱有垃圾邮件拦截机制。 2. 安全性
使用CSS的三种方式:1.元素内联(h行内样式表:直接写在元素style属性里面);2.页面嵌入:在页面的head加入 ;3.外部引用(外部样式表)
文档流:1.position:absolute;绝对定位,即完全脱离文档流,相对于positio属性非static值的最近元素偏移
2.position:fixed; 固定定位即完全脱离文档流,相对于视区进行偏移
3.position:relative;相对定位,这个属性值保持队形所在文档流中的位置,相对于元素在文档流中的位置进行偏移,但保留原占位。
4.position:static;默认值
布局:表格布局(加载的时候要等tr td全部加载完才能显示,也不利于搜索引擎收入里面的内容)
框架布局(不好控制布局)
div+css布局()
//遇到换行的时候把单词断开
word-break:
normal(中文会换行,普通的英文(带空格的)遇到换行会按单词换行,连续的英文不会换行)
break-all(所有的文字该换行时都会换行,遇到单词也会把单词拆开来换行,不保留单词完整性。)
keep-all(英文还是normal状态,中文也不换行了。)
word-wrap;
normal
break-word(带空格的保留单词完整性,连续的英文也会换行,兼容FF)
overflow:
visible
scroll
hidden
auto
层内文字连续英文不换行的问题,word-break:break-all;
溢出处理。overflow:scroll,overflow:hide
background-color:Red !important; /*强制设置为这个颜色,不过后面颜色有没有改变都不变*/
Visual Studio 2008(支持jQuery智能提示的方法)
安装补丁后js与jQuery都有智能提示
首先安装:Visual Studio 2008 SP1补丁
然后再安装: VS90SP1-KB958502-x86补丁(for jQuery)
使用jQuery的智能提示需要引入jQuery-1.x.x-vsdoc.js(或将该文件放在与jQuery-1.x.x.js的同目录下)
javascript没有块级的作用域。
window.setInterval(code,delay) //每隔一段时间执行指定的代码(第一个参数是指定的代码字符串,第二个参数:时间间隔(毫秒数)) var intervalId=setInterval("alert('hello');",1000)
window.clearInterval(intervalid); //停止计时器
setTimeout
通用的HTML元素的事件:onclick(单击)、ondblclick(双击)、onkeydown(按键按下)、onkeypress(点击按键)、onkeyup(按键释放)、onmousedown(鼠标按下)、onmousemove(鼠标移动)、onmouseout(鼠标离开元素范围)、onmouseover(鼠标移动到元素范围)、onmouseup(鼠标按键释放)、oncontextmenu(在浏览器中单击鼠标右键显示”右键菜单”时触发)等
document.onmousemove = function() {
//document.title = window.event.clientX + "==" + window.event.clientY; //鼠标在浏览器上的位置
//document.title = window.event.screenX + "==" + window.event.screenY; //鼠标在屏幕上的位置;
document.title = window.event.offsetX + "==" + window.event.offsetY; //鼠标相对于事件源的位置
}
动态禁止页面跳转的方法
function btn_click() {
var txt = document.getElementById("txt").value;
if (txt.length == 0) {
alert("请输入用户名");
//让文本框获得光标
document.getElementById("txt").focus();
//取消默认行为的执行 submit action,不适用firefox
window.event.returnValue = false; //fifox是用e.preventDefault();
}
}
//动态注册时间..事件响应函数
//只有在事件响应函数中return false;才可以取消后续内容的执行
window.onload = function() {
//给a标签动态注册事件
document.getElementById("alink").onclick = function() {
alert("无权限");
return false;
};
}
appName 返回浏览器名。IE 返回 'Microsoft Internet Explorer',NN 返回 'Netscape'。
下面的例子显示了 appName 属性的值:
document.write("navigator.appName 的值是 " + navigator.appName)
appVersion 返回浏览器版本,包括了大版本号、小版本号、语言、操作平台等信息。
language 语言
mimeType 以数组表示所支持的MIME类型
platform 返回浏览器的操作平台,对于 Windows 9x 上的浏览器,返回 'Win32'(大小写可能有差异)。
userAgent 返回以上全部信息。例如,IE5.01 返回 'Mozilla/4.0 (compatible; MSIE 5.01; Windows 98)'。
plugins 以数组表示已安装的外挂程序
javaEnabled() 返回一个布尔值,代表当前浏览器允许不允许 Java。
window.event.srcElement指最初引发事件的事件源(对象、元素)
取消事件冒泡: window.event.cancelBubble=true;//IE下的写法。
e.stopPropagation(); Firefox
window.onload与body的onload
1.二者效果完全一样,都是在页面内容都加载完毕后才触发。
2.由于网页中没有window所以在body中写onload
3.建议使用window.onload//使用js脚本的方式高效
4.其实应该是document.onload,但是所有浏览器都实现到了window对象上。
动态创建DOM
=====================常用方法与属性===========================
方法:
createElement(‘element’);
appendChild(node);
removeChild(node);
replaceChild(new,old);
insertBefore(new,参照);
属性:
firstChild
lastChild
//通过js动态创建的元素,直接 右键→查看源码是看不到的,需要通过“开发人员工具”才能看到。s
nodeType
nodeType 属性可返回节点的类型。
nodeValue //只能获取文本节点和注释节点的内容
最重要的节点类型是:元素类型 节点类型元素element 1属性attr 2文本text 3注释comments 8文档document 9
children[] //返回元素节点
childNodes[] //获取所有直接子节点 包括文本节点和属性节点
parentNode() //获取父节点
nextSibling //获取下一个兄弟节点
previouSibling //获取上一个兄弟节点
value 获取 设置 表单元素的值
innerText(FF不支持innerText,在FF下用textContent属性)、innerHTML属性
面试题:说说开发项目的时候不同浏览器的不同点,你是怎么解决的?appendChild,insertCell,px
不同浏览器中对DOM支持的方法不一样
获取网页中那个元素触发了事件:在IE里使用srcElement ;在FireFox里使用target
使用Dom获取和更改网页标签元素内文本:在IE里使用innerText ;在FireFox里使用textContent
动态为网页或元素绑定事件:在IE中绑定事件的方法是attachEvent ;在FireFox中绑定事件的方法是addEventListener (类似于多播委托。使用该方法是还有一些其他的注意事项)
透明度:IE中filter:alpha(opacity=50); firefo中opacity:0.5
动态创建表格的时候Ie是默认往后添加insertCell,而chrome是前往添加,所以在insertCell()后面加参数-1;
动态创建表格tr的时候如果没有写在tbody,在choome可以显示,ie有些版本显示不出来、firefox显示不了
更多http://www.360doc.com/content/09/0319/12/16915_2855107.shtml
en.Attribute() 获取便签的自定义属性,在ie中可以直接img.aa,但是其他浏览器不兼容
label.setAttribute("for","t")
Jquery规则: $(who).when({what}); 例: $('#a').click(function(){});
层次选择器:
(1)$("div p")获取div下的所有p元素(后代,子、子的子……)
(2)$("div > p")获取div下的直接p子元素
(3)$(".menuitem + div")获取样式名为menuitem之后的第一个div元素(不常用)
(4)$(".menuitem ~ div")获取样式名为menuitem之后所有的div元素(不常用)
为什么jQuery中很少有属性的用法,因为属性写法很难实现"链式编程"
:first 选取第一个元素。$("div:first")选取第一个<div>$(".warn:first");
:last 选取最后一个元素。$("div:last")选取最后一个<div>
:not(选择器) 选取不满足“选择器”条件的元素,$("input:not(.myClass)")选取样式名不是myClass的<input>
:even、:odd,选取索引是奇数、偶数的元素:$("input:even")选取索引是奇数的<input>
:eq(索引序号)、:gt(索引序号)、:lt(索引序号) 选取索引等于、大于、小于索引序号的元素,比如$("input:lt(5)")选取索引小于5的<input>
$(":header")选取所有的h1……h6元素(*)
$("div:animated")选取正在执行动画的<div>元素。 (*)
为什么大的网站都是使用一张大图而不是多张小图
因为浏览器去访问服务器上面的一个页面,浏览器返回仅仅是html代码,而这个页面去引用外部的css,js,图片,浏览器要去解析,请求获取图片,如果有多张图片就要获取多次。而是用一张大图只要获取一次就可以了
扩展方法:静态类、静态方法、this
字节数据转换成字符串:String
System.Text.Encoding.UTF8.GetString(byte[])
字符串转换成字节数组:byte[]
System.Text.Encoding.UTF8.GetBites(String)
一个进程可以有多个应用程序域,一个应用程序域可以执行多个线程,但是同一时间线程只能在一个应用程序域中执行。
应用程序域含:异常处理、代码安全
AddDel del=new AddDel();
del.BeginInvoke(1,2,回调函数,回调函数状态)
第一步:从线程池里获取一个线程
第二步:执行委托执行的方法(在工作线程里面执行)
第三步:调用回调函数(可以为null)
FIFO(普通列先进先出) 。FILO(本地工作项的队列是先进后出)
工作任务请求队列的时间是不确定的,
解决死锁:从代码级别:操作资源的顺序一致。
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
应用层 (Application):应用层是个很广泛的概念,有一些基本相同的系统级 TCP/IP 应用以及应用协议,也有许多的企业商业应用和互联网应用。
传输层 (Transport):传输层包括 UDP 和 TCP,UDP 几乎不对报文进行检查,而 TCP 提供传输保证。
网络层 (Network):网络层协议由一系列协议组成,包括 ICMP、IGMP、RIP、OSPF、IP(v4,v6) 等。
链路层 (Link):又称为物理数据网络接口层,负责报文传输。
socket的三次握手
第1次:程序1发了一小段消息给程序2
第2次:程序2解析程序1发送来的消息,发送指定的消息给程序1
第3次:程序1发送确认消息
Socket (): 创建一个Socket
Bind(): 绑定一个本地的IP和端口号(IPEndPoint)
Listen(): 让Socket侦听传入的连接尝试,并指定侦听队列容量
Connect(): 初始化与另一个Socket的连接
Accept(): 接收连接并返回一个新的socket
Send(): 输出数据到Socket
Receive(): 从Socket中读取数据
Close(): 关闭Socket (销毁连接)
端口查询 netstat -a -n
网络编程帮助 netstat /?
端口分为以下三类:
(1)公认端口(Well Known Ports):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯 明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯。
(2)注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于 这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。
(3)动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端 口。实际上,机器通常从1024起分配动态端口。但也有例外:SUN的RPC端口从32768开
始。
用httpwatch查看访问一个网站的响应情况。敲入一个网址后,浏览器向服务器发出请求。页面中的图片、js、css在单独的请求中。
GET / HTTP/1.1表示向服务器用GET方式请求首页,使用HTTP/1.1协议
Accept-Encoding gzip, deflate表示浏览器支持gzip、deflate两种压缩算法
Accept-Language zh-cn 表示浏览器支持的语言,很多进入后自动就是中文界面的国际网站就是通过读取这个头的值实现的。
Connection Keep-Alive。一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,
然后如果浏览器或者服务器在其头信息加入了Connection:keep-alive,则TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
Cookie是浏览器向服务器发送和当前网站关联的Cookie,这样在服务器端也能读取浏览器端的Cookie了。
User-Agent为浏览器的版本信息。通过这个信息可以读取浏览器是IE还是FireFox、支持的插件、.Net版本等。
异步委托的作用:异步委托用来bicom -t
telnet www.baidu.com 80
编译的原理
浏览器==>服务器==>服务器软件(IIS)==》.NET FrameWork==》请求页面(判断是否在内存中是否有机器码,判断C盘中是否有中间代码文件,将domo.aspx和制定的Demo.aspx.cs页面类进行合并用中间语言(IL)编译成一个类,默认存储在C盘中)
第一次请求网页的时候为什么慢?因为第一次在内存中没有机器码、C盘中没有中间代码,要将页面的代码和页面的.cs页面类进行合并用中间语言,编译成一个类。默认存储在C盘中
表单提交数据:input texteare select 可以提交到后台,必须有name属性才回提交,而且提交数据的时候以name为key,以value属性为值 ,如果这个标签是disable的那么也不会提交到后台
优化dome:比如做报警系统的时候,表可能进行大量的增删改的时候,本身有加索引的会影响增删改的速度。把一个表拆分成两个表,一个是当前表,一个是历史表,因为当前表可能进行大量的增删改,而历史数据一般进行查询适合见索引,然后使用数据库里面一个照,每天让他自动导数据
//ctrl+m+l 快速展开 ctr+m+o 快速折叠
淘宝图片存放的原理:图片用名用GUID命名,给服务器请求获取图片,客户端发过来的是图片的Id(由GUID生成的),后台handler拿到Id,然后在图片表里面找图片的相对路径地址,然后图片表把图片的存放的服务器ID编号传给数据库表,在图片服务器表根据服务器ID编号进行查询服务器IP和具体路径,然后把图片的目录与图片的相对路径结合,根据服务器IP地址进行查询获取图片
集群技术
LVS
NLB
网络负载均衡(nlbmanager.msc技术)
F5:硬件
Myspbeis
多IIS、多主库多从库(数据库),主库用来写入,从库用来读取
垂直分库(模块间的低耦合:用户模块、新闻模块、博客模块)
水平分库(表分区:把同一个表的数据文件分派到不同的数据库文件里面,这样不同的文件可以放到不同的磁盘上面,这样可以利用多个磁头增加数据库的访问速度)
不行在把数据放到服务器的缓存里面,用空间换时间
NOccode(如新浪,把多个列转换为一个列) nonjoadb
Context-Type
应用程序池:HttpApplication实例的创建是根据Gloable.asax文件编译后的类型,再通过反射的方式创建的实例,所以创建实例都灰常消耗时间和资源,则使用对象池技术
页面周期: 1.创建控件树 2初始化页面控件(帮控件赋值默认值) 3处理viewstate(创建控件树的实例)
4 load(把表单提交过来的新值放到控件上) 5调用事件响应方法 6保存viewState 7渲染html
Response其他成员
响应的缓冲输出:为了提高服务器的性能,ASP.Net向浏览器Write的时候默认并不会每Write一次都会立即输出到浏览器,而是会缓存数据,到合适的时机或者响应结束才会将缓冲区中的数据一起发送到浏览器。
Response对象的主要成员:
1、Response.Buffer、Response.BufferOutput:经过Reflector反编译,发现两个属性是一样的,Buffer内部就是调用的BufferOutput。这个属性用来控制是否采用响应缓存,默认是true。
2、Response.Flush()将缓冲区中的数据发送给浏览器。这在需要将Write出来的内容立即输出到浏览器的场合非常适用。案例:大批量数据的导入,显示正在导入第*条数据,用Thread.Sleep模拟耗时。
3、Response.Clear()清空缓存区中的数据,这样在缓存区中的没有发送到浏览器端的数据被清空,不会被发送到浏览器。
4、Response.ContentEncoding输出流的编码。
5、Response.ContentType 输出流的内容类型,比如是html(text/html)还是普通文本(text/plain)还是JPEG图片(image/JPEG)。
Request其他成员:
1、Request.UrlReferrer 请求的来源,可以根据这个判断从百度搜的哪个关键词、防下载盗链、防图片盗链,可以伪造(比如迅雷)。 (使用全局一般处理程序)
2、Request.UserHostAddress获得访问者的IP地址
3、Request.MapPath(virtulPath)将虚拟路径转换为磁盘上的物理路径,Request.MapPath("./a/b.aspx")就会得到D:\2008\WebSites\WebSite4\a\b.aspx
Server.MapPath里就是调用的Request.MapPath
HttpUtility.HtmlDecode(); //将html进行编码
HttpUtility.HtmlEncode(); //将html js进行转换为字符串
HttpUtility.UrlDecode(); //将url编码数组转换为字符串
HttpUtility.UrlEncode(); //将字符串数组转换为url编码字符串
<% Server.Execute("a.aspx"); %>
<hr />
<% Server.Execute("b.aspx"); %> <!--Execute:执行另外一个页面的脚本-->
<%Server.Transfer("a.aspx"); %> <!--Transfer:服务器获取新的url地址->
ViewState保存状态:适合当前页面多次跟服务器交互,非表单控件,不能把数据提交到后台,只能通过ViewState
如果服务器两次都输出同一个名称的Cookie,浏览器会怎么办? 覆盖
如果服务器输出两个不同名的Cookie,浏览器怎么办? 添加
如何删除浏览器Cookie? 服务器设置过期时间,response给用户
cookie.Path(为指定的文件夹生成Cookie)
cookie.Domain (域/域名)
Response.Cookies和Request.Cookies中间的关系 – 有共用部分
四种 弹出登录失败提示
1. Response.Write("<script>alert('登录成功!')</script>");
2. <script type="text/javascript">
<%=JsScriptData %>
</script>
public string JsScriptData;
JsScriptData = "alert('登录鸟人了...吧')";
3. this.RegisterStartupScript("key1", "<script>alert('登录鸟人了...吧')</script>");
4. Page.ClientScript.RegisterClientScriptBlock(GetType(), "key3", "alert('登录成功')", true);
思考:怎么来模拟实现session:先通过静态变量来存储session
后面项目:分布式缓存+cookie id
session在维护灰常消耗性能
在webconfig中禁用cookie来传递sessionid可以通过url的方式传递sessionid,如果浏览器把cookie禁用了,这时候session每次都是新建的。
AJAX:”Asynchronous JavaScript and XML”
中文意思:异步JavaScript和XML。
指一种创建交互式网页应用的网页开发技术。
不是指一种单一的技术,而是有机地利用了一系列相关的技术:
简单理解为:JavaScript + XMLHttpRequest + CSS +服务器端 的集合.
Ajax request和response
$(function() {
$("#btnGetDate").click(function() {
var xhr;
//第一步:创建异步请求的核心的对象
if (XMLHttpRequest) {
xhr = new XMLHttpRequest(); //运行:ie8 ie9,chrom,ff
}
else { //ie6 ie5
xhr = new ActiveXObject("XMLHttpRequest");
}
//第二步:设置请求对象跟后台哪个页面进行交互
//HTTP请求方法名 请求的页面 是否是异步
xhr.open("Get", "ProcessAjax.ashx?p=3", true);
//第三步:发送请求
xhr.send();
//第四步:后台返回数据后,会调用此方法,回调函数
xhr.onreadystatechange = function(data) {
//4标识:前台已经接收完了后台发送来的响应报文
if (xhr.readyState == 4) {
//if (xhr.status == 200) {
//alert(data);
alert(xhr.responseText);
}
};
/*//post请求
xhr.open("Post", "ProcessAjax.ashx", true);
//post通过此来传递参数
xhr.send("ip=3&enp=100");
//Post请求要设置一下请求头部
xhr.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onreadystatechange = function(data) {
//4标识:前台已经接收完了后台发送来的响应报文
if (xhr.readyState == 4) {
//if (xhr.status == 200) {
//alert(data);
alert(xhr.responseText);
}
}; */
});
})C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data
四种数据提交后台的方法
$(function() {
$("#btnGetJSon").click(function() {
$.getJSON("ResponJSon.ashx", "a=3&b=4", function(data) {
alert(data[1].CityName);
});
});
$("#btnJQGet").click(function() {
$.get("ResponJSon.ashx", "dd=33", function(data) {
alert(data);
});
});
/*$("#btnJQPost").click(function() {
$.post("ResponJSon.ashx", {dd:33,demo:'shit'}, function(data) {
alert(data);
})
}); */
$("#btnJQPost").click(function() {
$.post("ResponJSon.ashx", { dd: 33, demo: 'shit' }, function(data) {
alert(data[0].CityName);
}, "json");
});
$("#btnAjax").click(function() {
$.ajax({ url: "ResponJSon.ashx",
data: "a=3&b=4",
type: "Post",
success: function(data) {
alert(data);
// $("#divDemo").text(data);
},
errot: function() {
alert("错误");
}
});
});
$("#btnLoad").click(function() {
$("#divDemo").load("ResponJSon.ashx", { id: 333 }, function(data) {
alert(data);
});
});
})
上传图片到服务器
//下载官网 http://jquery.malsup.com/form/#download 下载地址
$("@form1").ajaxSubmit({
success:function(str){
},
error:function(error){alert(error);},
url: '/ggodManaGer/Goods/ImageHandler.ashx', //设置post提交到的也你按
type:"post", //设置表单以post方法提交
dataType:"json" //设置返回值类型为文本
})
在index.aspx页面头部写上AutoEventWireup="false" ,Page_Load, ***事件都不执行
在index.aspx页面头部写上Trace="true",开始页面追踪
在Refleact,Search上System.Web.UI.Page,找到ProcessRequest方法,在找到 this.ProcessRequest(true, true);, this.FrameworkInitialize();用来是初始化页面控件数, this.ProcessRequestMain()处理页面控件数的过程
获取服务器控件生成在客户端的ID:alert("<%=this.Button1.ClientID %>");
解决多个上下文乱的问题:1.单例模式(缺陷:因为会帮我们缓存的是实体,实体随着查询的增多后,占用内存会疯长) 2.使用线程唯一的方法。也就是:每次请求一个新的实例(指的是aspnet webform mvc不包括winform) 3、只要用就新建一个新的实例(在方法内就new一个实例,性能最差,当前请求内不能共享查阅出来的实体 的缓存)。
//面向接口编程
//第7-8事件,创建IHttpHandler的实例:一般处理程序给接口,也可以把Page类给它
//第11-12事件之间执行IhttpHandler的实例ProcessRequest方法
HttpApplication和HttpModule一般是在Init方法里面注册事件。
服务器端控件高效率分页
Repeater:CRUD
第一步:到BLL层服务对象里面去添加两个方法,返回一共多少条,返回当前当前页的数据
第二步:设置数据源,设置到我们添加的方法crud的方法,然后删除
<SelectParameters>
<asp:Parameter DefaultValue=" " Name="start" Type="Int32" />
<asp:Parameter DefaultValue=" " Name="count" Type="Int32" />
</SelectParameters>
第三步:设置ListView;设置删除需要的配置:DataKeyNames="Id",不要启动分页
第四步:设置分页控件DataPage,将当前的分页控件指向ListView
第五步:设置数据源的方法
EF 跨数据库支持
目前已有数个数据库厂商或元件开发商宣布要支持 ADO.NET Entity Framework:
(1) Core Lab,支持Oracle、MySQL、PostgreSQL 与 SQLite 数据库。
(2) IBM,实现 DB2 使用的 LINQ Provider。
(3) MySQL,发展 MySQL Server 所用的 Provider。
(4) Npqsql,发展 PostgreSQL 所用的 Provider。
(5) OpenLink Software,发展支持多种数据库所用的 Provider。
(6) Phoenix Software International,发展支持 SQLite 数据库的 Provider。
(7) Sybase,将支持 Anywhere 数据库。
(8) VistaDB Software,将支持 VistaDB 数据库。
(9) DataDirect Technologies,发展支持多种数据库所用的 Provider。
(10) Firebird,支持 Firebird 数据库。
学习资料:http://www.cnblogs.com/xray2005/category/189491.html
英文参考书
我的BLOG: http://www.cnblogs.com/fly_dragon/
CallContext和多线程(http://www.cnblogs.com/vwxyzh/archive/2009/02/21/1395416.html
):当对另一个 AppDomain 中的对象进行远程方法调用时,当前的 CallContext 类生成一个将与该调用一起传播到远程位置的 LogicalCallContext。CallContext 是类似于方法调用的线程本地存储区的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽。数据槽不在其他逻辑线程上的调用上下文之间共享。当 CallContext 沿执行代码路径往返传播并且由该路径中的各个对象检查时,可将对象添加到其中。只有公开 ILogicalThreadAffinative 接口并存储在 CallContext 中的对象被传播到 AppDomain 外部。
MVC
Controller:
必须以Controller结尾
//控制器下面的所有的 方法都称作Action
控制器必须实现Icontroller
控制器不能是静态类
View:每个控制器都对应自己一个文件夹
如果IIS出问题:两个命令 cmd里面aspnet_regiis -i vs命令行里面也执行下
如果W3WP.EXE还是不行没启动的话(查看你发布那个网站的基本设置,然后进行编辑网站,点击测试设置“身份验证”和“授权”都成功才可以(如果是授权不成功则在编辑网站里面点击"连接为"设置特定用户,如"Administrator(不能没有密码)"),设置成功之后在重启下整个站点,然后浏览当前项目所在的网站里面有个"浏览",在进程里面有出现W3WP.EXE就行了), 在VS的Debug里面把 显示所有用户的进程和显示所有session的进程都勾上就可以看到W3WP.EXE了。
EF上下文实例的管理:就是帮我们生成sql脚本,EF上下文实例的管理是通过线程内唯一的方式实现的,其实他就是跟EF上下文应用程序跟数据库一次会话的边界。
NH:Session
DatimeTime-DateTime=TimeSpan;
网站的SEO基本原则:所有希望搜索引擎抓取的内容都应该是通过超链接(Get请求)获得的,Post获得的内容、js脚本打开的页面是无法被搜索引擎抓取的,所以尽量不要JS、Post来进行页面导航、内容的生成。搜索引擎一般不会执行JS、不会发Post请求。
因为LinkButton是执行JavaScript向服务器发请求来进行Redirect,而蜘蛛不会执行JS,所以尽量不要用LinkButton。
内嵌js生成的超链接是搜索引擎看不到的。服务器端动态生成的内容是可以被蜘蛛看到的,客户端浏览器(蜘蛛)不知道服务器是动态生成的还是静态文件,只有Response。蜘蛛只分析静态的HTML内容,不会去执行JS。
SEO友好的AJAX:做一个简单的根据参数来获得1、2、3三个文章的AJAX效果。
蜘蛛程序是下载Get请求的结果,而不是下载aspx源码。
聊SEO的时候说的一个很牛的技巧:<a href=“GetArticle.ashx?Id=1” οnclick=“ShowArticle(1);return false;”>文章1</a>,也对不支持JavaScript的浏览器提供友好的使用。
1.用户上传视频文件
注意:调整运行文件的大小:
ASP.NET为了防止过大的http恶意请求阻塞网站,所有每次上传文件最大4M,ASP.NET1.1中把用户上传的文件先放到内存中,2.0后如果上传的文件过大(默认256K)则会把文件保存到磁盘中。
不要修改全局的web.config来解除限制,保证安全,只对视频上传的ashx文件夹添加独立的web.config
<system.web>
<httpRuntime maxRequestLength="204800" requestLengthDiskThreshold="1024"/>
</system.web>
maxRequestLength表示最大上传文件的长度(KB为单位)。requestLengthDiskThreshold表示最多上传204800k(200M),大于1024K以后保存到磁盘上,防止暂用内存空间。
通过根文件夹和子文件夹中设置不同的AppSettings值来看待:子文件夹中的Web.Config,可以覆盖父文件夹中的设置,这样对于上传的文件夹才把上传限制放开200MB
2.启动FFMepg进行转码、抓缩略图
最牛的:利用ddmpeg让用户上传任意格式的视频、生成预览图片、动态gif预览图片,然后转换为flv、多线程。
//创建并启动一个新进程
Process p = new Process();
//设置进程启动信息属性StartInfo,这是ProcessStartInfo类,包括了一些属性和方法
p.StartInfo.FileName = Server.MapPath("/ffmpeg/ffmpeg.exe"); //程序名
p.StartInfo.UseShellExecute = false;
//-y选项的意思是当输出文件存在的时候自动覆盖输出文件,不提示"y/n"这样才能自动化
//string srcFileName = Server.MapPath("/Video/aa.avi");
//string destFile = Server.MapPath("/Video/1.jpg");
//p.StartInfo.Arguments = "-i" + srcFileName + " -y -f image2 -ss 53 -t 0.001 -s 600x500 " + destFile; //执行参数
string srcFileName = Server.MapPath("Video/aa.avi");
string destFileName = Server.MapPath("Video/a.flv");
p.StartInfo.Arguments = "-i" + srcFileName + " -y -ab 56 -ar 22050 -b 800 -r 29.97 -s 420x340" + destFileName; //执行参数
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true; //把外部程序错误输出写到StandardError流中
p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.Start();
p.BeginErrorReadLine(); //开始异步读取
p.WaitForExit(); //阻塞等待进程结束
p.Close(); //关闭进程
转码结束后p.WaitForExit*( 才会返回
这样在转码、抓图结束后在数据库中添加一条记录(建一个和视频表:Id、Title、FlvPath、Flv的路径、ThumPath:缩略图的路径)
3.做一个页面展示所有的视频,点击某个视频后打开页面,使用OsFLVPlayer播放视频
VidieoList.aspx。ViewVideo.aspx?Id=5
Winphone
WP项目生成的是XAP格式,XAP的安装和卸载由系统控制,避免流氓软件。
XAP会安装到系统为每个应用分配的以ProductID为文件夹,必须放到这个文件夹下。
XAP其实是压缩包,安装过程据说把XAP解压到ProductID文件夹的过程。
XAP原理
“生成操作=Content”是放到XAP压缩包中,"生成操作=Resource,资源"是放在dll中的。Content效率高
XAML是编译生成到dll的资源中,然后允许时通过LoadComponent加载xaml文件,不像asp.net中aspx和cs
那样的继承关系
xaml就是严格的xaml文件格式,每一个标签都是一个元素,有的标签还可以父容器
布局(Layout)就是控制子元素控件大小和位置的技术
Silverlight中Canvas、StackPanel、Grid三种基本布局容器,放在布局容器中的控件按照布局容器的特点进行布局。
winphone设置起始页Properties下面的<tasks> 下面的<DefaultTask> 里面的NaviigationPage
Marketplace的审核
不要以为能运行通过微软就会审核通过,盗版:使用未经授权的图片音乐等,明显的抄袭,海天学院事件,通过ProductID,微软发现以后就把以后就把所有的海天出品软件"下架":普通下架和召回。苹果也有UUID事件!API限制:微软限制如果有读取GPS的功能,必须提供关闭读取GPS的选项:软件启动时也要允许读取GPS,XAP最大90MB;
ISAPIRUNTIME中的ProcessRequest方法查看管道流程
System.Web.Routing 查看路由的流程。
Httpapplication 的ApplicationStepManager方法中的BuildSteps的方法查看application管道的具体工作,而 MapIntegratedHttpHandler则查看怎么要映射.
asp.net mvc是怎么进入管道的(管道模型)
区域功能:通过 区域功能实现,将多个项目部署到一个站点
项目生成的时候,可以知道生成的目录的路径,另外可以控制生成后的事件来帮我们做copy 子项目文件夹到主站点的工作
分卷压缩(MvcThreeLayer)
这是类型参数约束,.NET支持的类型参数约束有以下五种:
where T : struct | T必须是一个结构类型
where T : class
where T : new() | T必须要有一个无参构造函数
where T : NameOfBaseClass | T必须继承名为NameOfBaseClass的类
where T : NameOfInterface | T必须实现名为NameOfInterface的接口
(如 public interface IBaseRepository<T> where T : class, new() )
路由配置,过滤器
sqlutility
查询某个数据库里面的所有的表:exec sp_tables
查询某个表的有哪些列 :exec sp_columns '表名'
VSS 2005及VSS教程
svn
Visual SourceSafe
memcache(分布式缓存)
mongodb :使用场景并不是来取代关系型数据库的,互相补充,互相辅助
key-value:
为什么快:1.所有的操作几乎都是在内存里面进行的。然后他会选择合适的时机进行持久化到磁盘上。2.nosql就一个列,key-value,也没有表和表的关系。
memcache:搭建使用。
J2EE:SSH=Spring+Struts+Hibernate
NET:Spring.Net+Aspnet mvc+NHibernate
(http://www.cnblogs.com/GoodHelper/tag/Spring.NET/
开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo
)
Spring.NET is an application framework that provides comprehensive infrastructual support for developing infrastructural support for developing enterprise .NET applications.
ORM:所有实际实现了ORM框架,都是实现一个综艺的入口,开发人员通过这个综艺入口对表实体进行Crud操作,然后ORM框架自动帮我们监控实体状态的变化,然后根据实体的状态生成相依的sql脚本,然后调用底层的ADONET执行到数据库里面去影响到表的变化。
练习Htmlhelper的控件的使用
ActionLink 超级链接
BeginForm form提交
CheckBox 多选框
DropDownList 下来列表框
Hidden 隐藏域
ListBox 列表
Password 密码框
RadioButton 单选
TextArea 文本域
TextBox 文本框
MvcContrib
开源地址:http://mvccontrib.codeplex.com/
Html.Grid(Model)扩展方法介绍
View中添加:<%@ Import Namespace="MvcContrib.UI.Grid" %>
获取Asp.Net MVC3.0安装包http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=4211
获取源码(代码发给大家)http://aspnet.codeplex.com/wikipage?title=MVC&referringTitle=Home
Web Forms Vs MVC
MVC优点
1、很容易将复杂的应用分成M、V、C三个组件模型
通过model、view和controller有效的简化了复杂的架构,体现了很好的隔离原则
2、因为没有使用server-based forms 。所以我们程序员控 制的更加灵活,页面加干净
3、可以控制生成自定义的url。对于seo友好的url更是不在话下
4、强类型View实现,更安全、更可靠、更高效。
5、让web开发可以专注于某一层。更利于分工配合适用于大型架构开发
6、很多企业已经使用MVC作为项目开发框架,招聘明确要求熟悉MVC开发模式,我现在做的项目架构就是mvc+ef+wcf+…
(马伦:。http://www.cnblogs.com/fly_dragon/
malun666@126.com QQ:515154084
)
HTML5中的结构标签:
<section>标签:定义文档中的节
<article>:独立的、完整的相关内容块
nav标签:页面导航的链接组
aside:标签用来装载非正文的内容
<header>标签定义文档的页眉
footer标签定义section或document的页脚
演示绘制圆形
演示绘制三角形
演示绘制图片
http://www.cnblogs.com/lhb25/archive/2011/06/03/great-examples-of-html5-power.html
VS扩展插件的地址:http://visualstudiogallery.msdn.microsoft.com/
WCF中的ABC :
Endpoints是WCF实现通信的核心要素。一个WCF Service由一个Endpoints集合组成,每个Endpoint就是用于通信的入口,客户端和服务端通过Endpoint交换信息。
Endpoint由三部分组成:Address,Binding,Contract。便于记忆,我们往往将这三部分称为是Endpoint的WCF ABC。
Address: Address通过一个URI唯一地标识一个Endpoint,并告诉潜在的WCF service的调用者如何找到这个Endpoint。所以Address解决了Where to locate the WCF Service?
Binding: Binding实现在Client和Service通信的所有底层细节。比如Client与Service之间传递的Message是如何编码的—— text/XML, binary,MTOM;这种Message的传递是采用的哪种Transport——TCP, Http, Named Pipe, MSMQ; 以及采用怎样的机制解决Secure Messaging的问题——SSL,Message Level Security。所以Binding解决的是How to communicate with service?
Co ntract: Contract的主要的作用是暴露某个WCF Service所提供的所有有效的Functionality。从Message Exchange的层面上讲,Contract实际上是抱每个Operation转化成为相对应的Message Exchange Pattern——MEP(Request/Response; One-way; Duplex)。所以Contract解决的是What functionalities do the Service provide?
在HTML5中,window.navigator对象添加了一个geolocation属性。通过geolocation的API对此属性进行操作,就可以处理浏览器的地理信息
获取当前地理信息:navigator.geolocation.getCurrentPosition(successCallback, errorCallback);//参数一:获取成功的 相应方法,第二:出错处理函数
函数: function successCallback(position) {}
position:代表position对象实例,属性:latitude(经度);longitude(经度的精度)altitude(纬度);accuracy(纬度的精度);altitudeAccuracy;heading;speed;verticalSpeed;
WP项目生成的是XAP格式,XAP的安装和卸载由系统控制,避免浏览软件。XAP会安装到系统为每个应用分配的以ProductID为文件夹下,必须放到这个文件夹下。 XAP其实就是压缩包。安装过程就是把XAP解压到ProductID文件夹的过程。
"生成操作=Content(内容)"是放到XAP压缩包中的,"生成操作=Resource(资源)"是放到dll中。
XAML是编译生成到dll的资源中的,然后允许时通过LoadComponent加载xaml文件。
XAML就是严格xml格式,每一个标签就是一个元素。 有的标签就是可以是父容器
WP 开放常去的网站:wpxap.com,xda(国外是正版,xda.cn)
dft:dark force team,黑暗军团、qdppc
ROM:Ghost
Silverlight的界面都是使用画刷(Brush)画出来的,可以改变不同的画刷画不同的内容:
SolidColorBrush:实心颜色画刷
LinearGradientBrush:渐变画刷
RadialGradientBrush:径向渐变画刷(以圆心散射)
ImageBrush:图片画刷
Brush类型的属性都可以指定各种Brush,比如Button的Foreground属性、Rectangle(矩形图形)的Fill属性。
<Rectangle>
<Rectangle.Fill>
<SolidColorBrush>Red</SolidColorBrush>
</Rectangle.Fill>
</Rectangle>
变换Transform:
RotateTransform:旋转变换。
ScaleTransform:缩放变换。
SkewTransform:倾斜变换。
TranslateTransform:平移变换。
Silverlight推荐用Tap(点击) 、DoubleTap(双击)、Hold(长按保持一段时间)
用户控件实现等待控件:继承自UserControl,使用的时候先在头部引用所在的命名空间和程序集,并且给一个别名:xmlns:ctrls="clr-namespace:PhoneApp1.Strls" 然后就可以
<ctrls:WaitingControl x:Name="wc1"></ctrls:WaitingControl>使用了。
自定义控件:继承现有的控件,给控件加更多功能。
用户控件 是组合现有控件,自定义控件是继承现有控件增加更多功能。
1.XAML 中所有的属性都能当样式使用。
2. 可以在根节点的Resources属性中Style:
<phone:PhoneApplicationPage.Resources>
<Style TargetType="TextBox" x:Name="defaultText">
<Setter Property="Background" Value="Yellow"></Setter>
<Setter Property="BorderBrush" Value="SteelBlue"></Setter>
</Style>
</phone:PhoneApplicationPage.Resources>
如果没有设定x:Name或者x:Key,那么则应用于作用范围之内的所有同类型的控件,否则需要
<TextBox Height="154" Style="{StaticResource txtSuper1}" 来引用样式
3. 样式文件
新建一个xaml文件(没有向导),模版:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="Button" x:Key="rb1">
<Setter Property="Foreground" Value="Red"></Setter>
</Style>
<Style TargetType="TextBox" x:Key="tbStyle1">
<Setter Property="Background" Value="Gold"></Setter>
<Setter Property="BorderBrush" Value="Green"></Setter>
</Style>
</ResourceDictionary>
然后再页面中
<phone:PhoneApplicationPage.Resources>
<ResourceDictionary Source="DefaultStyle.xaml">
</ResourceDictionary>
</phone:PhoneApplicationPage.Resources>
4. 如果说整个程序的样式就一分,那么可以声明到App.xaml的Resources中,整个应用程序全局共享。
<Application.Resources>
<Style TargetType="CheckBox">
<Setter Property="Foreground" Value="Yellow"></Setter>
</Style>
<Style TargetType="CheckBox" x:Key="checkboxStyle2">
<Setter Property="Foreground" Value="Yellow"></Setter>
</Style>
</Application.Resources>
1.动态修改图片地址:image1.Source = new BitmapImage(new Uri("Images/00_09.jpg", UriKind.Relative));
1.如何通过代码修改元素的Cavans.Top、Grid.Row
Canvas.SetTop(btn1, Canvas.GetTop(btn1) + 30);
后台修改皮肤
ResourceDictionary newStyle = new ResourceDictionary();
newStyle.Source = new Uri("/PhoneApp1;component/换肤/小清新.xaml", UriKind.RelativeOrAbsolute);
ApplySkin(newStyle); //程序集重点资源的Uri路径格式: "程序集名:component/路径"
private static void ApplySkin(ResourceDictionary newStyle)
{
//就是动态把"资源字典"加载到app.xaml中。
App.Current.Resources.MergedDictionaries.Clear();
App.Current.Resources.MergedDictionaries.Add(newStyle);
}
如果要求界面随着Model变,则需要继承DependencyObject或者实现INotifyPropertyChanged
public class Person : DependencyObject
{
//静态的、DependencyProperty类型、属性名+Property=DependencyProperty.Register("属性名",typeof(属性类型),typeof(所属类),null);
public static DependencyProperty NameProperty = DependencyProperty.Register("Name",typeof(string),typeof(Person),null);
public String Name
{
get { return (string)GetValue(NameProperty); }
set
{
//name = value;
SetValue(NameProperty,value);
}
}
public class Person:INotifyPropertyChanged
{
private string name;
public String Name
{
get { return name; }
set
{
name = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
2.给控件设定DataContext
<TextBox Height="72" Name="textBox1" Text="{Binding Name}" DataContext="{StaticResource p1}" />
3.上下文DataContext可以设定到父节点上,子节点默认继承父容器DataContext。
子控件可以单独设置DataContext覆盖父容器继承的DataContext
4.Text="{Binding}"表示属性值把绑定到DataContext本身,而不是某个属性。
5.手机访问PC时是两个系统的访问,因为不能够127.0.0.1,要使用PC的IP或者机器名。手机和PC连接后位于一个虚拟机网络中。Windows Phone连接到PC以后就能够通过PC的网络上网、
6.Silverlight 中不能在非UI线程中访问UI线程的控件。继承自DependencyObject的类都是UI线程的东东,都必须在UI线程创建。
要使用 this.Dispatcher.BeginInvoke(() => { textBlock1.Text = "hello"; });来在非UI线程中更新UI线程。
7.要求集合的数据变化反映到UI上,则集合对象要实现INotifyCollectionChanged接口,一般使用系统预定义的ObservableCollection<Book> 类
Winphone三种绑定模式:
OneTime:一次绑定,绑定创建时使用源数据更新控件。(可以是普通的set、get属性)。
OneWay (默认值):单向绑定,在绑定创建时使用源数据更新控件,当源数据发生变化的时候也更新控件。(必须实现INotifyPropertyChanged接口或者继承自DependencyObject)。相当于Eval
TwoWay:双向绑定,数据源的变化会更新控件,控件的变化也会更新到数据源。(必须实现INotifyPropertyChanged接口或者继承自DependencyObject)。相当于Bind
Winphone手机方向(*)
手机有Landscape(横放)、Portrait(直立)两个基本方向。可以设置页面的SupportedOrientations属性来设置当方向发生变化的时候页面是否自动调整。Orientation属性为当前手机方向。覆盖页面的OnOrientationChanged方法来编写当页面方向改变时的代码。模拟器中如何翻转手机
ApplicationBar
ApplicationBarIconButton是图片按钮,IconUri指向项目中的图片,图片的“生成操作( BuildAction )”要设置为“内容(Content)”,有Click事件;思考:没有Command属性,怎么MVVM绑定Command?ApplicationBarMenuItem是菜单项,Text属性为菜单文本,有Click事件。图片必须是PNG格式,图片的大小48*48,不需要自己画圈。WPDT中有一些常用的图片(需要改系统的默认背景颜色),路径见备注,傻瓜制作工具:Metro Studio
如何在代码中动态修改ApplicationBar:ApplicationBar中的按钮、菜单无法用FindName找到,所以即使给控件Name,也为null
ApplicationBarIconButton btn = (ApplicationBarIconButton)ApplicationBar.Buttons[1];
btn.IconUri = new Uri("/Images/appbar.check.rest.png",UriKind.Relative);
SIP:SoftInputPanel,软键盘
点击“abcd”、“&123”可以在数字键盘和字母键盘之间切换。如何设置不同中文输入法(九宫格、手写等)
设置文本框的InputScope属性(由于模拟器条件所限,在传智播客WP7模拟器中,要设置phone:TextBoxEx.InputScope属性),可选值:Number、TelephoneNumber、EmailNameOrAddress等(所有可选值见InputScopeNameValue枚举)
await async
VisualTree:可视化树
windows phone 页面导航
WP7中是没有对话框的概念的,不同的界面是不同的页,类似于网页,通过NavigationService.Navigate(new Uri(“/RadioTestPage.xaml”,UriKind.Relative))来在不同的页面间导航。
NavigationService属性的方法:GoBack()后退;GoForward()前进;CanGoBack属性判断是否可以后退(是否有之前的页面,如果没有之前页面,再调用GoBack() 会报错)。
页面三个和页面导航相关的四个虚方法:
OnNavigatedTo:当页面成为活动页面时调用。e.NavigationMode得知是新来的(New)还是后退进来的(Back)还是前进来的(forward)
OnNavigatedFrom:当页面不再是活动页面时调用
OnNavigatingFrom:在页面即将不再是活动页面时调用,实现确认是否退出
OnBackKeyPress:当用户按下手机上的后退键的时候调用,也可以实现点击图片在Popup中显示大图,然后按后退键关闭大图Popup的功能。
WP页面的生命周期:每次导航回来的时候还会复用之前的页面对象(不会构造多个对象,构造函数只调用一次),之前动态创建的元素也都有(和DOM一样),但每次都会先后触发OnNavigatedTo和Loaded,在OnNavigatedTo 中可以通过e. NavigationMode得知是后退进入还是第一次进入(IsPostBack),因此可以更好的控制逻辑,建议把所有初始化代码放到OnNavigatedTo ,并考虑NavigationMode 。
通过ListPicker的使用不当的Bug看为什么应该把初始化写到OnNavigatedTo
如何给页面添加翻转动画
使用Silverlight Toolkit,app.xaml.cs里面RootFrame = new PhoneApplicationFrame();改成 RootFrame = new TransitionFrame();
页面xaml中添加toolkit的xmlns
在页面的<phone:PhoneApplicationPage>元素下添加备注中的代码
如果页面比较多每个页面都想要效果,那么可以将效果作为样式添加到全局样式中。
<toolkit:NavigationInTransition.Backward>等地方切换不同的切换动画效果。
(备注:<toolkit:TransitionService.NavigationInTransition><toolkit:NavigationInTransition><toolkit:NavigationInTransition.Backward><toolkit:TurnstileTransition Mode="BackwardIn"/></toolkit:NavigationInTransition.Backward><toolkit:NavigationInTransition.Forward><toolkit:TurnstileTransition Mode="ForwardIn"/></toolkit:NavigationInTransition.Forward></toolkit:NavigationInTransition></toolkit:TransitionService.NavigationInTransition><toolkit:TransitionService.NavigationOutTransition><toolkit:NavigationOutTransition><toolkit:NavigationOutTransition.Backward><toolkit:TurnstileTransition Mode="BackwardOut"/></toolkit:NavigationOutTransition.Backward><toolkit:NavigationOutTransition.Forward><toolkit:TurnstileTransition Mode="ForwardOut"/></toolkit:NavigationOutTransition.Forward></toolkit:NavigationOutTransition></toolkit:TransitionService.NavigationOutTransition>
)
常用的Task
所有Task都有Show方法,调用Show方法启动任务,任务执行完毕一般会返回应用。所有任务都不是自动启动,而是需要用户手动点击启动,是WP7基于安全考虑,防止泄密、吸费等问题。无法用来实现批量发短信。所有Task都需要用户手动触发执行。这些Task监视工具都看不到,通过电脑摄像头看。
SmsComposeTask:启动发送短信的任务,可以通过To、Body两个属性设置对方号码和短信内容。注意Show以后只是显示发送界面。
EmailComposeTask:发邮件的任务,可以通过Subject 、 Body 、To 、 Cc属性设置标题、内容、收件人、抄送。
WebBrowserTask:打开网页的任务,可以通过URL属性设置要打开网页的地址。实现二维码软件的“在线购买”功能
PhoneCallTask:拨打电话的任务,可以通过PhoneNumber、DisplayName属性设置拨打的号码和显示的名称。实现“在软件。
有一些需要得到执行结果的任务,这些任务一般都从ChooserBase继承,监听Completed事件,从e中可以获得执行结果,所有e任务都有属性TaskResult表示执行结果(OK执行成功,Cancel任务被取消),Error表示执行过程中的异常信息(如果没有异常就是null)。
SavePhoneNumberTask:保存联系人(People)号码。
PhoneNumberChooserTask:选择电话号码,e. PhoneNumber为选择的电话号码。可以实现支付宝手机客户端的“给手机充值”功能中让用户选择用户,自动填充手机号码。
以下CameraCaptureTask等和摄像头、音乐、图片等和媒体相关的要用WPConnect连接,不能用Zune连接。
CameraCaptureTask启动拍照任务,e. ChosenPhoto为拍照的图片流。(代码在备注中)。模拟器用电脑摄像头模拟手机摄像头,如果电脑没有摄像头可以拖入图片或者wmv视频。
PhotoChooserTask选择图片的任务, e. ChosenPhoto为拍照的图片流。PixelHeight、PixelWidth属性为要选择图片的尺寸,如果设置了这两个属性则会提供图片截取的功能(可以用来实现上传QQ头像的功能),ShowCamera为是否允许用户拍照。实现微博的插入图片功能。
户拍照。实现微博的插入图片功能。
系统信息(*)
DeviceStatus类可以获得一些系统、硬件的信息。DeviceManufacturer:设备生产商、DeviceName:设备名称、DeviceUniqueId:设备唯一编号、DeviceFirmwareVersion:设备固件版本、DeviceHardwareVersion:设备硬件版本、DeviceTotalMemory:设备总内存、ApplicationCurrentMemoryUsage(应用当前内存占用)、ApplicationPeakMemoryUsage(应用峰值内存占用)、PowerSource是否连了充电器,PowerSourceChanged可以获得充电器连上、断掉的事件。
无法获得手机号、sim卡编号、ip地址等信息。防止应用偷偷手机用户手机号,比如一个免费的炒股软件手机用户手机号,然后再打电话推销。
NetworkInterface类(注意是Microsoft.Phone.Net.NetworkInformation命名空间下)可以获得网络信息,NetworkInterface. GetInternetInterface()可以获得实例对象,NetworkInterfaceType属性可以获得当前网络类型(Wifi、GSM或CDMA等),GetIsNetworkAvailable()方法(bool类型返回值)判断当前是否有可用网络。UCWeb的Wifi网络下的优化、手机版迅雷当处于非wifi网络会提示用户:真的要下载吗:墨迹天气也是检查GetIsNetworkAvailable告诉用户“没有可用网络”。API很简单,可以实现的功能不简单。
WIFI;通过无线路由器上网。
获取屏幕大小:可以通过Application.Current.RootVisual.RenderSize获得屏幕尺寸,但是在首页面的NavigatedTo方法中取到的是0,因为RootVisual还没有加载。因此最好使用Application.Current.Host.Content.ActualWidth、Application.Current.Host.Content.ActualHeight获得尺寸
windoows phone手机浏览器项目
WMAppManifest.xml和配置,添加图标、配置启动画面等
浏览器内核使用WebBrowser,核心是IE,PC上很多浏览器也是使用IE内核。Windows Phone上只有IE浏览器内核,UC等都是使用它。在Microsoft.Phone.dll的Microsoft.Phone.Controls命名空间的WebBrowser下。Navigate方法用户导航到指定页面。
本机测试自己搭建一个网站就可以,由于是跨网络,因此使用IIS或者CassiniDev 4等当服务器。
WebBrowser属性:IsScriptEnabled是否启用脚本执行,默认是False;Source当前地址。
WebBrowser的事件:LoadCompleted页面所有元素加载完毕;Navigated已经完成加载网页;Navigating正在导航;NavigationFailed导航失败,比如服务器无法连接等;ScriptNotify,网页内调用window.external.notify会触发ScriptNotify,实现网页调用.Net的方法。这就是用JS写网页应用的PhoneGap原理(example下是实例,templates下是模板)。
windowsphone 浏览器的窗口大小控制
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no;" />
width - viewport的宽度 height - viewport的高度 initial-scale - 初始的缩放比例 minimum-scale - 允许用户缩放到的最小比例 maximum-scale - 允许用户缩放到的最大比例 user-scalable - 用户是否可以手动缩放
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, user-scalable=no;" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
WebBrowser控件方法
InvokeScript调用页面中的js方法,第一个参数为方法名,可以通过第二个参数传递参数,返回值为string类型。注意:方法必须明确的返回string类型,否则都是返回””,不能return 1;而是return “1”;toString()方法
执行一段JS代码的方法:IE中的系统函数execScript可以接受传递一段JS代码去执行;拿不到返回值。应用:前进后退:history.back()、history.forward()。案例:3g.baidu.com自动填表提交。
思考:编写一个无污染的执行一段带返回值的JS代码的通用方法。答案见备注。应用:获得标题、获得文本框的值。
NavigateToString在浏览器中显示一段html代码。如果中文可能会乱码,使用备注中的代码ConvertExtendedAscii把中文转码即可
SaveToString得到浏览器中的HTML内容。
自定义浏览器端错误页:响应NavigationFailed方法,动态生成内容(从Content中读取模板),NavigationFailed中直接NavigateToString在模拟器中会闪退,多线程解决。错误页中可以点击重试,也可以访问推荐的站点。
/// <summary>
/// 解决NavigateToString乱码问题
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
private static string ConvertExtendedAscii(string html)
{
StringBuilder sb = new StringBuilder();
foreach (var c in html)
{
int charInt = Convert.ToInt32(c);
if (charInt > 127)
sb.AppendFormat("&#{0};", charInt);
else
sb.Append(c);
}
return sb.ToString();
}
public void ExecuteScript(string js)
{
browser.InvokeScript("execScript", new string[] { js });
}
/// <summary>
/// 调用方法
/// </summary>
/// <param name="methodName"></param>
/// <param name="args"></param>
/// <returns></returns>
public string InvokeFunction(string methodName, params string[] args)
{
return (string)browser.InvokeScript(methodName, args);
}
/// <summary>
/// 执行一个带返回值的代码段,返回值必须是string类型
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public string ExecuteReturnableScript(string code)
{
//生成一个临时的方法,采用Guid作为方法名,避免冲突
string tempFuncName = "f" + Guid.NewGuid().ToString("N");
//生成方法定义
ExecuteScript("window."+tempFuncName+"=function(){"+code+"}");
//调用临时方法
string retVal = InvokeFunction(tempFuncName);
//销毁临时方法
ExecuteScript("window." + tempFuncName + "=undefined;");
return retVal;
}
winphone
1、URL的正则表达式:@"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?"
2、FocusManager.GetFocusedElement()获得当前焦点空间
3、放置图标到桌面
/// <summary>
/// 放置图标到桌面
/// </summary>
/// <param name="title"></param>
/// <param name="image"></param>
/// <param name="backTitle"></param>
/// <param name="backContent"></param>
/// <param name="backImage"></param>
/// <param name="url"></param>
public static void PinToStart(string title, string image, string backTitle, string backContent, string backImage, string url)
{
//如果存在则删除,并在下面重新Pin到桌面
ShellTile oldTile = ShellTile.ActiveTiles.FirstOrDefault
(e => e.NavigationUri.ToString().Contains(url)); //引用System.linq;
if (oldTile != null)
{
oldTile.Delete();
}
//生成Tile
StandardTileData myTile = new StandardTileData
{
BackgroundImage = new Uri(image, UriKind.Relative),
Title = title,
Count = 0,
BackTitle = backTitle,
BackContent = backContent,
BackBackgroundImage = new Uri(backImage, UriKind.Relative)
};
//固定到开始界面
ShellTile.Create(new Uri(url, UriKind.Relative), myTile);
}
CommonHelper.PinToStart(title,
"/Contents/BgIcon.png", title, title,
"", "/MainPage.xaml?starturl=" + Uri.EscapeDataString(url));
Windows phone 7 读取xml的方法
/// <summary>
/// 从XML文件中加载历史记录
/// </summary>
public void Load()
{
IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
if (isf.FileExists("History.xml")) //如果文件不存在(第一次),则不加载!
{
return;
}
//加载xml
using (Stream stream = isf.OpenFile("History.xml",FileMode.Open))
{
//添加System.Xml.Linq;
XDocument xdoc = XDocument.Load(stream);
foreach (var elementItem in xdoc.Root.Elements())
{
string Title = elementItem.Attribute("Title").Value;
string url= elementItem.Attribute("Url").Value;
string LastVisitDateTime = elementItem.Attribute("LastVisitDateTime").Value;
HistoryItem item = new HistoryItem();
item.Title = Title;
item.Url = url;
item.LastVisitDateTime = Convert.ToDateTime(LastVisitDateTime);
Items.Add(item);
}
}
}
//Windows phone 7 保存xml的方法
/// 保存历史记录
/// </summary>
public void Save()
{
IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
if (isf.FileExists("History.xml"))
{
isf.CreateFile("History.xml").Close();
}
using (Stream stream = isf.OpenFile("History.xml",FileMode.Open))
{
XDocument xdocument = new XDocument(new XElement("Items"));
foreach (var item in Items)
{
XElement element = new XElement("Item");
element.SetAttributeValue("Title",item.Title);
element.SetAttributeValue("Url",item.Url);
element.SetAttributeValue("LastVisitDateTime",item.LastVisitDateTime);
xdocument.Root.Add(element);
}
xdocument.Save(stream);
}
}
SEO
对于开发人员来讲:搜索引擎只认get请求获得的原始代码;制人页面中的a标签,并且不能是href="javascript:";
案例
不要用<a href="javascript:document.location='http://www.rupeng.com'">如鹏网</a>
不要用LinkButton的Onclick中来做Response.Redirect,因为生成的是js
不要在页面找中动态通过js生成超链接,而应该像“车品汇”一样先把连接都生成都页面中,只是隐藏,然后通过js来控制不同称的显示。
实现AJax,通过指定onclick和href,让普通用户走onclick的ajax效果,搜索引擎蜘蛛走href。
Lucenet.net(下载地址:https://lucenenet.apache.org/)
盘古分词(下载地址:http://pangusegment.codeplex.com/releases/view/46545)
盘古使用:
1.把PanGu4Lucene_V2.3.1.0.zip的PanGu.Lucene.Analyzer.dll、PanGu.dll添加到项目引用
2.把分词算法改成Analyzer analyzer = new PanGuAnalyzer(); ,根据报错信息把PanGuDictionaries.zip中的文件解压到相应目录。
如果需要修改词库,使用DictManage.exe打开Dict.dct进行修改(如果说找不到'XXX\Dict.dct',原因是这个文件默认是在\bin文件夹下面(bin的子文件夹也可以))
Analyzer analyzer = new PanGuAnalyzer();
TokenStream tokenStream = analyzer.TokenStream("", new StringReader("北京,Hi欢迎你们大家情人节快到了,大家去哈姆拉多了,--哈默拉多。"));
Lucene.Net.Analysis.Token token = null;
while ((token = tokenStream.Next()) != null) //只要还有词,就不返回null //高版本不支持
{
//Console.WriteLine(token.TermText());
string word = token.TermText(); //tokenStream.Next()为当前分的词。
Response.Write(word+" <br/>");
}
队列(先入先出): Queue、ConcurrentQueue(*线程安全,多线程中用这个) 。 栈(*):Stack:先进后出
发邮件、发短信偶尔会遇见半个小时才收到的情况就是在排队处理。
C# 信号量(Semaphore)
ManualResetEvent
Redis分布式队列
Quartz.Net是一个定时任务框架,可以实现异常灵活的定时任务,开发人员只要编写少量代码就可以实现"每隔1小时执行任务"、"每月18日的下午执行8次"等各种定时任务。
OCR图片识别软件
session喜欢丢值且占内存,Cookie不安全 (Profile)
unity多开的方法
比如本来在桌面有一个快捷键,然后复制一份,Windows上: 修改快捷方式的属性。 在后面加上个 -projectPath, 例如: "D:\Program Files\Unity\Editor\Unity.exe" -projectPath 。注意-projectPath前面还有个空格符。 有时候运行的时候窗口底部会报一个找不到路径的错误,无所谓,clear一次就行
flex(在线编辑器,如在线股票波动,在线ps编辑器等)
问题2 如何通过代码动态添加控件?
TextBox tb = new TextBox();
sp1.Children.Add(tb);
问题3 以及动态定位控件?
TextBox tb1=(TextBox)FindName("动态TXT1"); //相当于GetElementById()
问题4:winform 或者wp7 WebBrowser空间 如何控制在打开网页之前我就禁止图片或者媒体?
如果类从FrameworkElement(有Name属性,所有可使控件都是从FrameworkElement继承),则可以使用Name为元素命名,如果不是从FrameworkElement继承,就用x:Name类命名。
问题:RepeaterDemo.aspx 绑定数据 显,
问题:实体数据模型向导 连接 中的从数据库生成,“是在连接字符串中包括敏感数据” 没办法选中
问题:纯静态的 网页 会 缓存 不能获取到最新的 数据(http://zhidao.baidu.com/question/535148546.html) IE会出现,可以让html不缓存
解决:使用“Last-Modified和ETag”(http://www.itlearner.com/article/4228)
如何远程数据库下载东西回本地
如何使用新浪微博、QQ等第三方帐号进行登录
购物车不用登陆页也能添加到购物车里面,用的是cookie
DataSet DataAdapter DataTable 区别
如何配置错误页面
用分布式缓存模拟session
攻击类型:IIS,注入式攻击,xxs(跨站脚本攻击),CSRF(跨站请求伪造)
ViewStateDecoder2.zip
jqzoom_v2.2
win 7 没语言功能(Text To Speech)
验证正则表达式(传智 马伦)
slideToggle();
dht(网络爬虫)
IndentGuilde.vsix JSEnhancements.vsix JsParser_pachage_3,5.vsix
Httpwatch、debug
Test Socket 工具
请求管道中国的19个事件
function window_load(){
var str = "Test String";
//将字串放进剪贴板,执行完这个html页面后,你可以打开一个文本文件,按ctr+v看看.
clipboardData.setData("text",str);
//从剪贴板取值的方法,
//clipboardData.getData("text");
//清空剪贴板的方法
//clipboardData.clearData();
}
流媒体:做在线学习网站、视频网站
浏览器IE会自动弹出打印窗口
ASP.NET中的正则表达式.mht
WebRTC
蒋金楠
李建忠 设计模式21种 webcast视频 ireaper
电脑没办法点击 处理程序映射
异联网的项目 html .net
执行带参数的方法(摇奖机)
webcast 视频
www.aa25.cn/layout/
asp.net页面生命周期.chm
jq怎么获取当前节点的父节点 用js然后再转换
为什么添加a 超链接没有出现 innerText
ocr 图文识别
lis[j].removeAttribute("class", ""); 无法移除
jquery 1.6_EN.chm jquery帮助文档
第一是《structure and interpretation of computer programs》这本书,用 scheme (lisp 的一种)
另一个就是上课编译原理,还有写类似 yacc 的 compiler-compiler
Websaver.exe或则debugar可以看到网址禁止复制的文字
HTML、JS压缩和混淆。去掉空格、缩短变量名,让html尺寸更小,提高下载速度(Googlr Closure Compiler、YUI Compressor、JsPacker)
DirectX编程
Lucene.NET(搜索引擎:http://home.cnblogs.com/group/topic/4683.html)
SharePoint (团队开发 部署)
TCP网络编程、
Wecservice 、WCF
ISA Server
ArcGIS()地理空间信息技术)
lanp架构(淘宝初期:LAMP)
robots.txt(搜索引擎公约)
INFORMATIC(信息)
amCharts股票走势图
使用 jQuery 和 KnockoutJS 开发在线股票走势图应用
内涵图的制作(把两个文件的Stream合在一起)
GDI(using System.Drawing)
node.js (一个后端的Javascript运行环境(支持的系统包括*nux、Windows))
V8 JavaScript 引擎(能阅读执行JavaScript源代码的解释器)
Windows Phone 7高级编程(超级实用的的WP7教程 经典红皮书)
windows Phone 7程序设计
(Windows Phone 7(含7.8)SDK 下载地址
Windows Phone 7.1
http://go.microsoft.com/fwlink/?LinkID=226694
Windows Phone 7.1.1
英文版
http://download.microsoft.com/download/5/6/C/56C12272-31DA-44CD-BBA3-603AA47FE564/WPSDK-7.1.1-KB2669191-x86.exe
中文版
http://download.microsoft.com/download/9/B/1/9B1EAE94-B328-451E-AF9D-89BD73CDA9E0/WPSDK-7.1.1-KB2669187-x86.exe
Windows Phone 7.8
英文版
http://www.microsoft.com/en-us/download/details.aspx?id=36474
中文版
http://www.microsoft.com/zh-cn/download/details.aspx?id=36474
系统要求:
支持的操作系统: Windows 7, Windows Vista
Windows Vista(x86 和 x64)Service Pack 2 - 除 Starter Edition 之外的所有版本
Windows 7(x86 和 x64)- 除 Starter Edition 之外的所有版本
安装需要系统驱动器上有 4 GB 可用磁盘空间。
3 GB 内存
Windows Phone Emulator 要求有使用 WDDM 1.1 驱动程序的支持 DirectX 10 或更高版本的图形卡
Windows Phone SDK 7.1 与 Visual Studio 2010 SP1 的最终版本兼容。
)
SDK(WPDT:Windows Phone Develop Toolkit)
《windows phone 7高级编程》
《windows phone 7程序设计》
ZONE下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=27163
微软为开发者:WPConnect(Program Files\Microsoft SDKs\Windows Phone\v7.1\Tools)
Windows Developer Toolkit
微软地址:http://www.microsoft.com/en-us/download/details.aspx?id=13890
(我安装完Windows Developer Toolkit会把vs2010 sp1把删除某些功能,而导致不能打开vs,有重装安装vs 2010 sp1,所以最好在安装sp1之前安装)
reflector插件下载地址:http://reflectoraddins.codeplex.com/releases
coding4fun下载地址:http://coding4fun.codeplex.com/
silverlight toolkit for window phone 下载:http://silverlight.codeplex.com/releases
数据库优化的实现
第一步:
《海量数据库解决方案》
第二步:
《数据库系统实现》
第三步
google的三大论文(bigtable ,hdfs,map reduce)
算法类型:递归、回朔、八皇后问题
博客园 job.cnblogs.com
前程无忧 51job.com 智联
广深地区 www.cjol.com/shenzhen/ 人才热线
-------版权声明:笔记大部分传智博客的历史培训内容(但是建议大家自学就好了,不要报什么培训机构)
转载于:https://www.cnblogs.com/zhian/p/3580153.html