1.下面*包含()个正方形?40
计算规律,设大长方形长是5,宽是4,小正方形边长是1,那么图中.小正方形的个数是,4*5个,边长是2的正方形的个数是3*4个,边长是3的正方形的个数是2*3个,边长是4的正方形的个数是1*2
所以总共:4*5+3*4+2*3+1*2=20+12+6+2=40
2. CLI:通用语言基础结构(Common Language Infrastructure,CLI)是CLR的一个子集,也就是.NET中最终对编译成MSIL代码的应用程序的运行环境进行管理的那一部分。(command-line interface,命令行界面)
CLR:公共语言运行库(Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。
IL:同MSIL(Microsoft Intermediate Language),是将.NET代码转化为机器语言的一个中间语言,因此又把IL语言称之为伪汇编语言。
JIT:Just-in-time 即时编译
GC:Garbage Collection,.NETCLR发觉内存资源紧张的时候,就会自动地去清理无用对象(没有被引用到的对象)所占用的内存空间(事实上何时清理内存是个复杂的策略)。可以在程序中显式地使用System.gc()/System.GC.Collect()来强制进行一次立即的内存清理。
3. 类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些结构?在自定义类型时,您如何选择是类还是结构?
class是引用类型,struct是值类型;Struct有性能优势,Class有面向对象的扩展优势。
class可以继承类、接口和被继承,struct只能继承接口,不能被继承;
class有默认的无参构造函数,有析构函数,struct没有默认的无参构造函数,且只能声明有参的构造函数,没有析构函数;
class可以使用abstract和sealed,有protected修饰符,struct不可以用abstract和sealed,没有protected修饰符;
class必须使用new初始化,结构可以不用new初始化;当你实例化一个class,它将创建在堆上。而你实例化一个struct,它将创建在栈上
class实例由垃圾回收机制来保证内存的回收处理,而struct变量使用完后立即自动解除内存分配;
从职能观点来看,class表现为行为,而struct常用于存储数据;
作为参数传递时,class变量以按址方式传递,而struct变量是以按值方式传递的。
BCL(Base Class Library)是Dot Net Framework下所有语言使用的类库,DateTime是一个结构体。
struct 类型适于表示 Point、Rectangle 和 Color 等轻量对象。尽管使用自动实现的属性将一个点表示为类同样方便,但在某些情况下使用结构更加有效。例如,如果声明一个 1000 个 Point 对象组成的数组,为了引用每个对象,则需分配更多内存;这种情况下,使用结构可以节约资源。
如何选择使用结构还是类:
).堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
).结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低
).在表现抽象和多级别的对象层次时,类是最好的选择
).大多数情况下该类型只是一些数据时,结构是最佳的选择
4. 泛型的作用是什么?它有什么优势?它对性能有影响吗?它在执行时的行为是什么?.NET BCL中有哪些泛型类型?
泛型的作用在于"算法的重用"。优势1.源代码保护。2.类型安全3.更清晰地代码。4.更好的性能,因为值类型可以避免装箱和拆箱所带来的损耗(垃圾回收的次数也会减少); 对性能有积极的影响,因为值类型可以避免装箱和拆箱所带来的负面影响,避免了垃圾回收,使得性能显著提高。但是对引用类型这种影响就不明显了;使用泛型类型参数的一个方法在进行JIT编译时,CLR获取IL,用指定的类型实参进行替换,然后创建本地代码。需要特别注意的是引用类型是共享代码的,而对值类型就会为每一种生成独立的一份类型代码;List、Dictionary、Queue、Stack、SortedList和SortedDictionary、LinkedList等
5. 用扩展方法为c#中的string类型增加一个字符转换为数组的方法
namespace 扩展方法
{
public static class String//扩展方法必须是静态的
{
public static char[] toCharArr(this string _input)//扩展方法必须是静态的,第一个参数必须加上this
{
char[] charA = new char[_input.len()];
for(int i = 0 ;i<_input.len();i++)
{
charA[i]=_input[i];
}
return charA;
}
public static string Quot(this string _input, string _quot)//带多个参数的扩展方法//在原始字符串前后加上指定的字符
{
return _quot + _input + _quot;
}
}
class Program
{
static void Main(string[] args)
{
string _myString = "abc";//这里就可以直接使用string类的扩展方法IsEmail了
Console.WriteLine(_myString.toCharArr());
Console.WriteLine(_myString.Quot("!"));//调用接收参数的扩展方法
Console.ReadLine();
}
}
}
6简述数组,链表,哈希(HASH)各自特点
数组:通过从0开始的索引,可以顺序存取/查找或者随机存取/查找,而链表只能顺序存取/查找;
链表:一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。它通过每个结点中的下一个结点的地址的指针域来查找\定位
哈希:根据关键码值(Key value)而直接进行访问的数据结构。
7. 简述一下C#中的Invoke和BeginInvoke的意思,并简述它们的使用场景
多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。
通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。
Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托。
Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄所在线程上异步执行指定委托。
Control的Invoke和BeginInvoke 是相对于支线线程(因为一般在支线线程中调用,用来更新主线程ui)Invoke立即插入主线程中执行,而BeginInvoke 要等主线程结束才执行
8. C#中的委托是什么?事件是不是一种委托?
委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针。(类似于C语言中的函数指针,可以把一个方法名作为参数代入另一个方法。);事件是一种特殊的委托,对于事件来讲,外部只能"注册自己+=、注销自己-=",外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能= 。
9.接口和抽象类有什么区别,选择的依据是什么?
抽象类里面可以有非抽象方法但接口里只能有抽象方法,一个类一次可以实现若干个接口,但是只能扩展一个父类;接口是对动作的抽象,抽象类是对根源的抽象。
10. mvc是什么
MVC(模型Model-视图View-控制器Controller)是一种设计模式,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
11. IOC是什么?有哪些IOC框架
Inversion of Control,即反转控制,或许说为依赖注入更为合适。是一种设计模式。
12. 简述 private、 protected、 public、 internal 修饰符的访问权限。
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。
13. 页面之间值传递常用的几种方式
1.QuerySting在页面间传递值
2.Session变量
3.Cookie对象变量
4.使用Application 对象变量
14. c#中const与readonly区别
const 的概念就是一个包含不能修改的值的变量。readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值。
1. const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。
2. const 字段是编译时常数,而 readonly 字段可用于运行时常数。
3. const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。
.const 对于引用类型的常数,可能的值只能是 string 和 null。readonly可以是任何类型
总结,const只能在初期就使用常量初始化好。对于每一次编译后的结果,const的值是固定的,而readonly的值是可以在运行的时候才确定值的。
15. public void test(object ii) {
lock(this){
if (i>10){
i--;
test(i);
}
}
},简述死锁的理由:
你在test中lock了,这时代码走到test(i);还是调用test,到lock(this) 是发现已经锁住了 ,所以就等待
16. 简述一下GC算法,微软提供的比较好的对象释放方式是什么,.net可以用析构函数吗?
既然GC负责垃圾回收,所有的算法无外乎都做两件事:(1)找到所有不再使用的对象。(2)回收这些对象的空间。
如:1. 引用计数器;2. 遍历搜索器;3. 碎片整理器;4. 分代收集算法;
2.Dispose 方法(实现 IDisposable 接口);using 语句;try、catch 和 finally 块
3.可以
17. 迭代器的好处(yield)
yield关键字在迭代器中,用于向枚举对象返回元素值或发出迭代结束信号。
迭代器能够在类或结构中支持foreach迭代,而不必实现IEnumerable接口。
创建迭代器最常用的方法是对IEnumerable接口实现GetEnumerator方法。
18. C#中的特性(Attribute)用途,好处,弊端
Attribute:一个类,公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attribute被用来处理多种问题,比如序列化、程序的安全特征、防止即时编译器对程序代码进行优化从而代码容易调试等等。
19. string是值类型还是引用类型?string str1 = str2 ="12345";str1 = "abc"; str2=?
String是一种特殊的引用类型,str2="12345",str1的改变不会影响str2
20. C#构造函数关键字是private,确通过一个public方法内部new了一个实例
public class Singlton
{
private static Singleton _Instance;
provate static readonly object syslocker = new object();
//私有化构造函数
private Sinalton()
{
}
public static Singlton GetInstance()
{
if(_Instance == null)
{
lock(syslocker)
{
if(_Instance == null)
{
_Instance = new Singlton();
}
}
}
return _Instance;
}
}
使用private将构造私有化,然后通过GetInstance()方法获得实例。这样能保存生成的实例是单一的。不允许用户使用构造函数重新构造。
21. 数据库索引类型有哪些?
Single column 单行索引
Concatenated 多行索引
Unique 唯一索引
NonUnique 非唯一索引
Function-based函数索引
Domain 域索引
物理上:
Partitioned 分区索引
NonPartitioned 非分区索引
B-tree:
Normal 正常型B树
Rever Key 反转型B树
Bitmap 位图索引
索引结构:
B-tree:适合与大量的增、删、改(OLTP);
不能用包含OR操作符的查询;
适合高基数的列(唯一值多)
典型的树状结构;
每个结点都是数据块;
大多都是物理上一层、两层或三层不定,逻辑上三层;
叶子块数据是排序的,从左向右递增;
在分支块和根块中放的是索引的范围;
Bitmap:
适合与决策支持系统;
做UPDATE代价非常高;
非常适合OR操作符的查询;
基数比较少的时候才能建位图索引;
树型结构:索引头
开始ROWID,结束ROWID(先列出索引的最大范围)
22. NoSQL是什么,优点?
NoSQL(Not Only SQL),泛指非关系型的数据库。四大分类:键值(Key-Value)存储数据库;列存储数据库;文档型数据库;图形(Graph)数据库;
弹性可扩展,异步复制,可以处理超大量的数据
23.求斐波那契数列(递归算法)
Public static long F(int n){if(n==1||n==2)return (1L);else return F(n-2)+F(n-1);} //main中计算F(30);
24.猫叫,老鼠跑,主人醒事件
public class Cat// 猫类,发布者
{
private string _name;
public event EventHandler<CatCryEventArgs> CatCryEvent;//猫叫事件
public Cat(string name)// 构造函数
{_name = name;}
public void CatCry()/// 触发事件
{
CatCryEventArgs args =new CatCryEventArgs(_name);
Console.WriteLine(_name +" 叫");//猫叫
CatCryEvent(this,args);
}
}
public class CatCryEventArgs:EventArgs// 猫叫事件参数,委托
{
privatestring _catname;
public CatCryEventArgs(string catname):base()
{_catname = catname;}
}
public class Mouse //老鼠类,订阅者
{
private string _name;
public Mouse(string name,Cat cat)
{
_name = name;
cat.CatCryEvent += CatCryHandle;//订阅猫叫事件
}
private void CatCryHandle(object sender,CatCryEventArgs args)// 猫叫事件处理
{
Console.WriteLine(_name +"跑");//老鼠跑
}
}
public class Master//主人类,订阅者
{
private string _name;
public Master(string name,Cat cat)// 构造函数,订阅事件
{
_name = name;
cat.CatCryEvent += CatCryHandler;//订阅猫叫事件
}
private void CatCryHandler(object sender,CatCryEventArgs args)// 猫叫事件处理
{
Console.WriteLine(_name+" 醒") ;
}
}
Cat cat =new Cat("cat");//主函数调用
Mouse mouse =new Mouse("mouse", cat);
Master master =new Master("master", cat);
cat.CatCry();