回顾基础知识
1,C#扩展方法
对于密封类我们想给该类增加一个扩展方法,可以使用这种方法,比如用string类来做例子:
创建一个类ExtensionString:
添加一个GetExtensionString方法,
public static class ExtensionString
{ //用this关键字修饰了string 关键字,表示这个方法是string的扩展方法 public static string GetExtensionString(this string source) { return source + "...."; } } 在调用时候:static void Main(string[] args) { string str = "12312312"; str = str.SpaceToUnderLine(); Console.WriteLine(str); Console.Read(); } 方法GetExtensionString里面没做什么特别的操作,这里只做演示.
2,c#用递归方法实现n阶乘
static void Main(string[] args) {Console.WriteLine(frac(3)); Console.Read(); } public static double frac(int n) { if (n == 1) return 1; else return n * frac(n - 1); } }
3,用Linq实现集合排序
static void Main(string[] args) { List<int> list = new List<int>() { 1,2,4,3,5,6 }; //倒序List<int> lide = list.OrderByDescending(i => i).ToList(); //正序 //List<int> lide = list.OrderBy(i => i).ToList(); for (int i = 0; i < lide.Count; i++) { Console.WriteLine(lide[i]); } Console.Read(); }
4,C# []、List、Array、ArrayList 区别及应用
[] 数组: 特定类型,固定长度的
List : 特定类型,任意长度的.
ArrayList : 任意类型(不固定类型),任意长度的.
Array : 任意类型,固定长度的.
如果类型为值类型, List,ArrayList,[],Array 提供的性能差不多,
如果类型为引用类型 List提供更好的性能,ArrayList需要装箱和拆箱.
5,StringBuilder和String的区别
String: String对象是不可变的,也就是每次使用System.String 类中一个方法时都要在内存中分配一个地址.所以每次创建新的字符串时对内存开销很大.
StringBuilder: StringBuilder是动态对象,并且在修改字符串时候不重新创建对象,还可以为它容纳的最大字符串设定一个值,当达到分配空间最大时,它会自动使空间容量翻倍, 比如我们在执行一些字符串连接会提供更好的性能.
6,SQL Nvarchar与varchar的区别
NVarchar: 是可变长度 Unicode 数据(字符型数据),其最大长度为 4,000 字符.所以他比varchar 要占空间.
varchar: 变长型字符数据类型,存储最长长度为8,000 个字符.
7,理解索引,以及SQLServer中聚集索引和非聚集索引
索引:简单的说索引就是为了能够更快的检索到想要的信息.类似于书的目录.在数据库关系中, 可以为指定的表和列创建索引.索引会占用磁盘空间,并且降低添加,删除,更新的速度.不过索引的好处远远大于他的坏处,可以适当的限制索引的数量.
sqlserver中的几种索引类型,聚集索引,非聚集索引,唯一索引,包含性列索引,全文索引,
聚集索引:聚集索引基于数据行的键值在表内排序和存储这些数据行。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。聚集索引功能:可用于经常查询的字段,提供唯一性(主键),可用于范围查询.聚集索引不使用与频繁更改的列.
非聚集索引:非聚集索引包含索引键值和指向表数据存储位置的行定位器,可以对表和视图建立多个非聚集索引.对于Join 或Group by 和不返回大量结果集,以及经常包含在where条件中的字段建立非聚集索引.如果有大量的重复值比如0,1不用建索引.
对这两种索引理解比较模糊..参考msdn文档.
8,ASP.NET MVC生命周期
当一个页面收到请求时,主要分8个步骤呈现:
1)RouteTable(路由表)的创建---RouteTable把URL映射到Handler。
2)UrlRoutingModule 请求拦截---拦截请求,创建合适的Handler
3)Routing engine 确定route
4)route handler 创建相关的IHttpHandler实例
5)IHttpHandler实例确定Controller(控制器)
6)Controller执行
7)一个视图引擎创建呈现视图..
10,List、Hashtable、Dictionary
List:可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法,在决定使用 List 还是使用 ArrayList 类(两者具有类似的功能)时,记住 List 类在大多数情况下执行得更好并且是类型安全的。如果对 List 类的类型 T 使用引用类型,则两个类的行为是完全相同的。但是,如果对类型 T 使用值类型,则需要考虑实现和装箱问题。
如果对类型 T 使用值类型,则编译器将特别针对该值类型生成 List 类的实现。这意味着不必对 List 对象的列表元素进行装箱就可以使用该元素,并且在创建大约 500 个列表元素之后,不对列表元素装箱所节省的内存将大于生成该类实现所使用的内存。
Dictionary:表示键和值的集合。Dictionary遍历输出的顺序,就是加入的顺序,这点与Hashtable不同
Hashtable:哈希表,名-值对。类似于字典(比数组更强大)。哈希表是经过优化的,访问下标的对象先散列过。如果以任意类型键值访问其中元素会快于其他集合。
HashTable中的key/value均为object类型,由包含集合元素的存储桶组成。存储桶是 HashTable中各元素的虚拟子组,与大多数集合中进行的搜索和检索相比,存储桶可令搜索和检索更为便捷。每一存储桶都与一个哈希代码关联,该哈希代码是使用哈希函数生成的并基于该元素的键。HashTable的优点就在于其索引的方式,速度非常快。如果以任意类型键值访问其中元素会快于其他集合,特别是当数据量特别大的时候,效率差别尤其大。
HashTable的应用场合有:做对象缓存,树递归算法的替代,和各种需提升效率的场合。
Hashtable 和 Dictionary <K, V> 类型 区别
1:单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
2:多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
3:Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.
11,修饰符
访问修饰符
private 关键字是一个成员访问修饰符。 私有访问是允许的最低访问级别。 私有成员只有在声明它们的类和结构体中才是可访问的.
protected 关键字是一个成员访问修饰符。 受保护成员在其所在的类中可由派生类实例访问.
public 关键字是类型和类型成员的访问修饰符。 公共访问是允许的最高访问级别.
internal 关键字是类型和类型成员的访问修饰符。 只有在同一程序集的文件中,内部类型或成员才是可访问的.
关键词
partial 分部类型定义允许将类、结构或接口的定义拆分到多个文件中。
sealed 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承.
unsafe 关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。
fixed 语句禁止垃圾回收器重定位可移动的变量。 fixed 语句只在不安全的上下文中是允许的。
volatile 关键字指示一个字段可以由多个同时执行的线程修改。 声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。 这样可以确保该字段在任何时间呈现的都是最新的值。volatile 修饰符通常用于由多个线程访问但不使用 lock 语句对访问进行序列化的字段。
virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。
override 要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。
extern 修饰符用于声明在外部实现的方法。 extern 修饰符的常见用法是在使用 Interop 服务调入非托管代码时与 DllImport 特性一起使用。 在这种情况下,还必须将方法声明为 static,如下示例所示:
[DllImport("avifil32.dll")]
private static extern void AVIFileInit();abstract 修饰符指示所修饰的内容缺少实现或未完全实现。 abstract 修饰符可用于类、方法、属性、索引器和事件。 在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。 标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查, 改为在运行时解析这些操作。 dynamic类型简化了对 COM api (如 Office 的自动化 api 还 IronPython 库之类的动态 api 和到 HTML 文档对象模型 (DOM) 的访问.
var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型 var。 隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。
看来总结是很重要的,一些知识平时不注意是很容易忘记的..