LINQ(Language Integrated Query,语言集成查询)提供了一种跨数据源和数据格式的统一模型,实现查询。主要包括三个部分:LINQ to Objects、LINQ to XML、LINQ enabled ADO.NET,而在LINQ enabled ADO.NET中又包括LINQ to DataSet、LINQ to SQL 和 LINQ to Entities。
“Lambda 表达式”是一种简化的匿名函数,在C#3.0中引入的,可用于创建委托或表达式目录树。也可以将 Lambda 表达式作为参数或者返回值使用。它的语法形式是: 输入参数 => 表达式或语句块,其中,=> 读作“goes to”,在LINQ查询中大量的使用到。
GC就是垃圾回收器,一般来说系统会自动检测不会使用的对象或变量进行内存的释放,不需要手动调用,用Collect()就是强制进行垃圾回收,使内存得到及时的释放,让程序效率更高。
无需复杂学习过程即可上手。
编写更少代码即可创建完整应用。
更快开发错误更少的应用程序。
无需求助奇怪的编程技巧就可合并数据源。
让新开发者开发效率更高。
任何对象或数据源都可以定制实现Linq适配器,为数据交互带来真正方便。
在面向对象中,一切皆为对象,面向对象的三大特征:
1)封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部,程序的其他部分只 有通过被授权的操作(成员方法)才能对数据进行操作。。
2)继承:继承可以解决代码复用问题,子类可以沿用父类方法和属性的一种方式。
3)多态:继承同一父类的不同子类,对父类方法的不同实现。分为方法的隐藏和重写。
从形态层面上:
相同点:抽象类和接口的都是抽象的,不能实例化,需要子类实现其抽象成员。
不同点:
1)抽象类是类的部分实现,可以包含已实现的成员,而接口不能包含任何成员的实现。
2)抽象类与普通类一样,可以继承类和实现接口,而接口只能继承接口,不能实现接口。
从设计层面上:
不同点:
1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性行为,但是接口却是对类局部(行为)进行抽象。
2)抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
3)抽象类一般作为父类使用,和实现类往往属于同一类事物,而接口和实现类则不然,只是一种实现关系,例如:演员和角色的关系。
装箱就是把值类型到引用类型的转换
拆箱就是引用类型到值类型的转换
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
internal: 在同一程序集内可以访问。
public : 公共成员,完全公开,没有访问限制。
C#中的委托是一种引用类型,表示具有相同方法签名的方法的引用。类似于函数指针,也就是说它们是指向函数的“引用”,更加安全。
事件不是委托,是委托类型的变量。
一般来说,为了在.NET Framework中处理可能的错误,会采用try-catch-finally这样的代码结构,其中,try块包含了程序正常的操作部分,但可能会出现异常,catch块包含的代码用于处理try中产生的异常,而finally块主要用于清理资源或执行要在try块或catch块末尾执行的其他操作,值得注意的是,无论是否产生异常,finally块中的代码总是要执行的。
在.NET中提供了许多预定义的异常类,所有的异常类都是派生于Exception类,只有当产生的异常与catch块中声明的异常类型匹配时,才能对异常进行处理。若catch块不能处理当前的异常,则会默认向方法的调用上一层抛出异常,层层上抛,直到找到匹配的catch块为止,若不存在匹配的catch块,则程序将异常终止。
最根本区别:进程是操作系统资源分配的基本单位,而线程是CPU调度和执行的基本单位
1)在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,线程之间切换的开销小。
2)所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
3)内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
4)包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
WCF:Windows Communication Foundation,是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。它是.NET框架的一部分,由 .NET Framework 3.0 开始引入。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。是Windows平台上开发分布式应用最佳的实践方式。
WPF:Windows Presentation Foundation,WPF是微软新一代图形系统,运行在.NET Framework 3.0架构下,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法。
WF: Windows Workflow Foundation,它是微软在.NET3.0之后推出的一套工作流开发框架,其主要的目的在于为现有的.NET应用程序嵌入工作流应用。
WebService:一种跨编程语言和跨操作系统平台的远程调用技术。
1)远程调用,就是一台计算机的应用可以调用其他计算机上的应用。
2)跨编程语言:是指服务端、客户端程序的编程语言可以不同
3)跨操作系统平台:是指服务端、客户端可在不同的操作系统上运行
例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以WebService服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。
答案:2
创建Thread实例并调用Start方法启动线程
能用foreach遍历访问的对象需要实现 IEnumerable 接口或声明GetEnumerator 方法的类型
const为静态常量,所谓静态常量就是在编译期间会对变量进行解析,再将常量的值替换成初始化的值。
readonly为动态常量,所谓动态常量就是编译期间会将变量标记只读常量,而不用常量的值代替,这样在声明时可以不初始化,可以延迟到构造函数初始化。
C#中有一个三元运算符”?:”,语法为:条件表达式?表达式1:表达式2;
该操作首先求出条件表达式的值(bool类型),为true时调用表达式1,为false时调用表达式2。其逻辑为:”如果为真执行第一个,否则执行第二个。”
装箱。
const成员都是static所以应该去掉static
重载了“==” 就必须重载 “!=”
delegate
该类为密封类,不可被继承
使用Serializable特性标记
using System;
class A
{
public virtual void F(){
Console.WriteLine(“A.F”);
}
}
abstract class B:A
{
public abstract override void F();
}
答案:abstract override 是不可以一起修饰方法
显式实现接口:实现类在实现接口中方法时,方法名前必须添加接口名,且不能添加访问修饰符。在调用时,显式实现接口的方法只能通过接口访问,不能通过类访问。
这样做的好处:
1)若一个类实现接口,而接口中的方法只需要在类的内部实现,则可以使用显式实现接口的方式,这样类的实例这无法使用该接口成员。
2)显式接口成员可以避免了成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式实现接口方式。
.net中的委托概念java中没有相同的,只有事件模式是一样的,java中有一个叫Obserable接口,可以添加IEventListener,使用内部类可以构建类似于委托的概念
Button是按钮控件,具有按钮所有的属性和事件方法,在客户端被渲染为表单元素提交按钮。
Linkbutton是链接按钮,用于创建超链接样式的按钮。该控件的外观与 HyperLink 控件相同,但其功能与 Button 控件一样。它的主要作用是就是在ASP.NET页面中显示一个超链接。当点击链接时,页面就会往服务器端传递信息,并且在服务器端来处理相应的事件。在客户端被渲染为超链接以及一段用于提交数据的JS代码。
ImageButton 是图片按钮,它以一张图片来代替按钮,来执行按钮的功能,显示为图片,具有按钮的所有功能,在客户端被渲染为表单元素图片按钮。
Hyperlink是超链接控件,用于创建超链接,点击超链接可以使用户转移到同一页面的不同部分或另一个页面.不具有按钮的功能。
Override:方法重写,子类对父类中的方法进行重新实现,要求,父类与子类之间、方法名和参数类型,数量,顺序一致。在C#允许子类对父类的抽象方法或虚方法进行重写,以适应新的需求。
重载:在同一类中,存在多个具有相同方法名,而不同参数列表的方法,在调用时根据实际参数确定执行哪个重载方法。
ref和out:
相同点:
1)在实参和形参上都必须添加关键字
2)在方法中对参数的设置和改变将会被保留。
不同点:
1)ref修饰的参数在方法调用前必须初始化,而out修饰的参数在方法调用时候可以不初始化。
2)在方法中out修饰的参数必须进行赋值,而ref修饰的参数不需要。
3)out修饰的参数主要用于返回值,ref修饰的参数主要用于修改。
GAC:Global Assembly Cache,全局程序集缓存,它的作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。这样,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。举例而言,如果没有GAC,那么势必每个WinForm程序的目录下就都要从C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705下面拷贝一份System.Windows.Forms.dll,这样显然不如都从GAC里面取用方便,也有利于Assembly的升级和版本控制。GAC中的所有的Assembly都会存放在系统目录"%winroot%\assembly下面。放在系统目录下的好处之一是可以让系统管理员通过用户权限来控制Assembly的访问。
.Net中所有类型的基类是System.Object
for:一般用于循环次数已知的循环
while: 一般用于循环次数未知的循环,工作原理:先判断后执行
do...while:一般用于循环次数未知的循环,工作原理:先执行一次后判断
foreach:当一个序列实现IEnumerable接口或者GetEnumerator()方法时,可以用该循环方法,一般用于遍历集合或数组,更加安全。
namespace Wolfy.RandomDemo
{
class Program
{
static void Main(string[] args)
{
int[] result = GetRandom(100);
for (int i = 0; i < result.Length; i++)
{
Console.WriteLine(result[i]);
}
Console.WriteLine("over:" + result.Length);
Console.Read();
}
///
/// 获得无重复随机数组
///
/// 上限n
///
static int[] GetRandom(int n)
{
//容器A和B
int[] arryA = new int[n];
int[] arryB = new int[n];
//填充容器a
for (int i = 0; i < arryA.Length; i++)
{
arryA[i] = i + 1;
}
//随机对象
Random r = new Random();
//最后一个元素的索引 如n=100,end=99
int end = n - 1;
for (int i = 0; i < n; i++)
{
//生成随机数 因为随机的是索引 所以从0到100取,end=100
//一个大于等于 minValue 且小于 maxValue 的 32 位带符号整数,即:返回的值范围包括 minValue 但不包括 maxValue。
//如果 minValue 等于 maxValue,则返回 minValue
//
int minValue = 0;
int maxValue = end + 1;
int ranIndex = r.Next(minValue, maxValue);
//把随机数放在容器B中
arryB[i] = arryA[ranIndex];
//用最后一个元素覆盖取出的元素
arryA[ranIndex] = arryA[end];
//缩减随机数生成的范围
end--;
}
//返回生成的随机数组
return arryB;
}
}
}
WebService特点: 平台独立性(Platform-independent)、跨语言(只要能支持XML的语言都可以)以及穿透企业防火墙;Webservice是基于http的是无状态的;但是它的缺点也很明显,就是需要部署一台Web Server;而且速度比较慢;
.Net Remoting的特点是:用户既可以使用TCP信道进行二进制流方式通信,也可以使用HTTP信道进行SOAP格式的通信,效率相对WebService要高不少;Remoting可以用于有状态的情况;但是它的缺点也很明显,.Net Remoting只能应用于MS的.Net Framework之下。
使用场合:
如果互动双方都是支持.NET技术的环境,并且在操作系统上能提供一致的验证机制,而且很重视沟通双方作业的效率,就是.NET Remoting上场的时机。
相反的,如果沟通双方是异质环境,又或沟通的模式就是无状态的情况,持续进行的互动作业前后是没有关联的,Web Service就是理想选择了。
public void test(int i)
{
lock(this)
{
if (i〉10)
{
i--;
test(i);
}
}
}
不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)
namespace test
{
public delegate void OnDBOperate();
public class UserControlBase : System.Windows.Forms.UserControl
{
public event OnDBOperate OnNew;
privatevoidtoolBar_ButtonClick(object sender,System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if(e.Button.Equals(BtnNew))
{
//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。
}
}
}
}
if( OnNew != null ){
OnNew( );
}
在Remoting中是通过通道(channel)来实现两个应用程序域之间对象的通信。首先,客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为客户端对象。这就提供一种可能性,即以服务的方式来发布服务器对象。远程对象代码可以运行在服务器上(如服务器激活的对象和客户端激活的对象),然后客户端再通过Remoting连接服务器,获得该服务对象并通过序列化在客户端运行。
配件就是Assembly(程序集),程序集由程序集清单,类型元数据,MSIL代码和资源组成。
1)File类:
使用场合:当读写文件大小不大,同时可以一次性进行读写操作的时候使用
使用方式:不同的方式可以读写文件类型不一样。
ReadAllBytes() WriteAllByte():可以读写任意类型的文件
ReadAllLines() ReadAllText():只能读写文本类型文件
2)FileStream类:
使用场合:当读写大文件的时候使用,它可以自定义读写的数组大小
使用方式:一个流对象只能做一个事情:如果需要读和写那么就需要创建两个流
读取:将数据读取到数组
写入:将数组的数据再写入到文件
3)StreamReader/StreamWrite类:
使用场合:只能对文本文件进行读写操作
使用方式:它可以按行、按字符以及按块进行读取和写入
System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-US");
//System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-GB");为英 国 货币类型decimal y = 9999999999999999999999999999m;
string str = String.Format(MyCulture,"My amount = {0:c}",y);
using 关键字有两个主要用途:
1)作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。
2)作为语句,用于定义一个范围,在此范围的末尾将释放对象。
在 C# 中,new 关键字可用作运算符、修饰符或约束。
1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。
2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。
using System;
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine(“x={0},y={1}”,x,y);
}
当使用new B()创建B的实例时,产生什么输出?
创建子类对象时,先调用父类构造方法,再调用子类构造方法,当调用父类构造方法时,由于还未调用子类构造方法,因此,x=1,y=0,当调用父类构造方法时,在父类构造方法中将调用PrintFields()方法,而该方法为虚方法且被子类重写,由于目前为子类对象,因此,调用子类重写后的PrintFields()方法,故输出:X=1,Y=0。
int Num = this.TextBox1.Text.ToString() ;
int Sum = 0 ;
for (int i = 0 ; i 〈 Num + 1 ; i++)
{
if((i%2) == 1)
{
Sum += i ;
}
else
{
Sum -=i ;
}
}
System.Console.WriteLine(Sum.ToString());
System.Console.ReadLine() ;
不是。可以用任意类型。
答:System.Xml
CLR:Common Language Runtime,公共语言运行时,是一套完整的、高级的虚拟机,它被设计为用来支持不同的编程语言,并支持它们之间的互操作。
IL,中间语言,也称MSIL,微软中间语言,或CIL,通用中间语言;所有.NET源代码在进行编译时都被编译成IL,IL独立于CPU的指令集,与平台无关。在应用程序运行时被即时(Just-In-Time,JIT)编译器处理成为机器码,被解释及执行。
(1)进程是动态的,而程序是静态的。
(2)进程有一定的生命期,而程序是指令的集合,本身无“运动”的含义。没有建立进程的程序不能作为1个独立单位得到操作系统的认可。
(3)1个程序可以对应多个进程,但1个进程只能对应1个程序。进程和程序的关系犹如演出和剧本的关系。
一个私有程序集通常为单个应用程序所使用,并且存储于这个应用程序所在的目录之中,或此目录下面的一个子目录中。
共享程序集通常存储在全局程序集缓存(Global Assembly Cache)之中,这是一个由.NET运行时所维护的程序集仓库。共享程序集通常是对许多应用程序都有用的代码库,比如.NET Framework类。
在 C# 中,new 关键字可用作运算符、修饰符或约束。
1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。
2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。
在C#中,接口可以继承接口,但不是实现接口,因为,接口中不能存在实现的成员。
抽象类与普通类无差异,只是不能被实例化而已,因此,抽象可以实现接口,也可以继承类,但抽象类一般作为父类使用。
对象:一种具有状态(属性)和行为(方法)的编程实体,用于描述现实世界的某个具体事物。
类:具用一系列对象共同特征和行为的通用类型。
对象和类的关系:
类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类,类描述了一组有相同属性和相同方法的对象。
当一个实例方法被调用时,需要通过实例对象来访问,绑定一个实例方法到委托必须同时让委托得到实例方法的代码段和实例对象的信息,这样在委托被回调时候.NET才能成功地执行该实例方法。委托内部的对象成员变量_target是一个指向目标实例的引用。当委托绑定静态方法时,内部的对象成员变量_target将会被设置成null,而当委托绑定实例方法时,_target将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法。
链式委托是指一个由委托串成的链表,当链表上的一个委托被回调时,所有链表上该委托的后续委托将会被顺序执行。在委托中存在内部的对象成员变量_prev,该指针指向委托链中的下一个委托。
GetHashCode方法就是一个判断对象是否相等的快速检查器,当把一个对象添加到一个散列表中时,会先判断这个对象是不是在其中,因为散列表是不允许出现碰撞的。在判断时,并不是直接上来就调用Equals方法,而是会先调用GetHashCode方法,计算出待添加对象的一个散列值:
如果这个散列值不命中,那就说明这个对象一定不在散列中,可以添加;
如果这个散列值命中了,那也不能说明这个对象一定在散列中,因为可能散列值冲突了,所以,要继续调用Equals方法,来看看这个散列值命中的对象,到底在不在散列表里。
委托可以是带有返回值的方法,但多于一个带返回值的方法被添加到委托链中时,程序员需要手动的调用委托链上的每一个方法,否则委托使用者将只能得到委托链上最后一个被执行方法的返回值。
foreach( object o in array ){
arrayList.Add(o);
}
应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小
受管制的代码:unsafe:非托管代码。不经过CLR运行。
强类型系统 RTTI:类型识别系统。
string str = null 是不分配内存空间,而string str = ““ 给它分配长度为空字符串的内存空间。
反射就是为了在程序的运行过程中动态的获取类的方法和属性, 优点就是可以实现动态创建对象和编译,体现出很大的灵活性,缺点是对性能有影响。
序列化是将对象状态转换为容易传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
委托是一种特殊的引用类型,允许将方法作为参数进行传递。
委托在使用过程中的一般步骤:类型定义、对象创建和方法绑定,方法调用。
委托是一种引用方法类型,一旦委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看作是对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数。
能,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式直接操作内存,这样就可以使用指针了。
表示层(UI),业务逻辑层(BLL),数据访问层(DAL)。
xml一般是用来做数据传输格式、软件配置的。可以用来做网页(xslt)、可以当作数据库、可以用于配置,用于保存静态数据类型,使用最多的是web Services和config。
C#数据类型分为两大类:值类型(数据存放在栈stack中)和引用类型(数据存放在堆heap中,地址存放在栈stack中)。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。声明一个引用类时,只在栈中分配内存,用于存放地址,而并没有为其分配堆上的内存空间。
Constructor不可以被继承,因此不能被重写(Overriding),但可以被重载(Overloading).
因为String类是密封类所以不可以继承string类。
取决于是否进行线程同步。如果进行了线程同步,只能一个线程进入。
2<<3
C#是可以对内存进行直接操作的,虽然很少用到指针,但是C#是可以使用指针的,在用的时候需要在前边加unsafe。
unsafe:非托管代码。不经过CLR运行。
sleep()方法是将当前线程挂起指定的时间。
wait()释放对象上的锁并阻塞当前线程,直到它重新获取该锁。
short s1 =1; s1 = s1 + 1;有错,
s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1=(short)(s1 + 1) 。short s1 = 1;s1 += 1正确。
虚函数:可由子类继承并重写的函数。
抽象函数:规定其非虚子类必须实现的函数,必须被重写。
XML即可扩展标记语言,主要用来做数据传输格式、软件配置。
一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质
.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and).
单例模式: static属性里面new ,构造函数private
public class Singleton{
//静态私有变量
private static Singleton singleton = new Singleton();
//私有构造方法
private Singleton(){
System.out.println("生成了一个实例!!!");
}
//外部类通过Singleton.getInstance()获取这个类的对象。
public static Singleton getInstance(){
return singleton;
}
}
using 引入名称空间或者使用非托管资源
new 新建实例或者隐藏父类方法
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
i++是使用完 i 之后再使 i 加一
++i是在使用 i 之前便使 i 加一
public class MainClass {
public static void Main(){
Console.WriteLine(Foo(30));
}
public static int Foo(int i) {
if (i <= 0) return 0;
else if(i > 0 && i <= 2) return 1;
else return Foo(i -1) + Foo(i - 2);
}
}
C#通过提供索引器,可以像处理数组一样处理对象。特别是属性,每一个元素都以一个get或set方法暴露。索引器不单能索引数字(数组下标),还能索引一些HASHMAP的字符串,所以,通常来说,C#中类的索引器通常只有一个,就是THIS,但也可以有无数个,只要你的参数列表不同就可以了索引器和返回值无关, 索引器最大的好处是使代码看上去更自然,更符合实际的思考模式。
code-Behind技术就是代码后置,在ASP.NET中通过ASPX页面指向CS文件的方法实现显示逻辑和处理逻辑的分离,这样有助于web应用程序的创建。
int、DateTime不能,因为其为值类型,值类型不能为null,只有引用类型才能被赋值null。string可以为null。
value,它的类型和属性所声名的类型相同。
String、Int32、Boolean等都属于.Net中定义的类,而string、int、bool相当于C#中对这些类定义的别名。
String是不可变的在这段代码中,s原先指向一个String对象,内容是 "abc",然后我们将s指向"123",那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"123",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。
常用的类:StreamReader、WebClient、Dictionary
常用的接口:IDisposable、IEnumerable、IDbConnection、IComparable、ICollection、IList、IDictionary
csc.exe。
泛型:“泛型”的字面意思就是广泛的类型。通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用 好处是——可以复用代码,降低耦合性,而且还提高了代码的可读性以及安全性。
有问题,当myString不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse()
1. XML是区分大小写字母的,HTML不区分。
2. 在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略结束标记。在XML中,绝对不能省略掉结束标记。
3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用 查找结束标记了。
4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。
1、类型不同:结构是一种值类型,而类是引用类型。
2、存储不同:结构使用栈存储,而类使用堆存储。栈的空间相对较小.但是访问效率相对较高.堆的空间相对较大.但是访问效率相对较低。
3、作用不同:类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,结构体不具备类的继承多态特性。
4、初始化不同:类可以在声明的时候初始化,结构不能在申明的时候初始化(不能在结构中初始化字段),否则报错。
IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。而Shadow复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是Object.MemberWiseClone().
深度复制(Deep Copy)与浅表复制(Shadow Copy)
接口或父类作为参数,所有继承了此接口或父类的类都可以使用,即你给此方法传参数的时候,可以把继承了这个接口或父类的类的实例传给这个方法。可以一次性传入多种字段、方法等而不用定义多个形参,接口作为返回值,返回的是实现接口的对象。
= 是赋值运算符, ==是关系运算符,用于等值判断
数组是没有length()这个方法的,有length这个属性,可以计算数组的长度。
String是有length()这个方法的,用来计算字符串的长度。
泛型集合只能放定义类型的元素,会自动增大,取出时不用做类型转换。
数组只能放定义类型的元素,不会自动增大,取出时不用做类型转换。
1.ToString():是获取对象的字符串表示的一种快捷方式
2.Finalize():允许对象在垃圾回收该对象之前尝试并执行释放资源并执行其他清理操作
3.GetType():获取当前实例的确切运行时类型
4.GetHashCode():用作特定类型的哈希函数
5.构造函数方法:主要用来在创建对象时初始化对象
Concat :连接两个序列。
Union : 通过使用默认的相等比较器生成两个序列的并集。
Intersect : 通过使用默认的相等比较器对值进行比较生成两个序列的交集。
以哈希表的形式存储数据,数据的形式是键值对。
CLR公共语言运行库
CLS通用语言规范
CTS通用类型系统
.NET一般指.Net Framework框架,是Microsoft为开发应用程序而创建的一个具有革命意义的平台,C#运行在.NET(CLR)上的,用于创建应用程序的一种高级编程语言。
1.单例设计模式
2.工厂设计模式
3.代理设计模式
4.观察者设计模式
5.适配器模式
6.原型模式
String是不可变化的字符,它只能赋值一次,每一次内容发生改变,都会生成一个新的对象。
StringBuilder是可以变化的字符,每次操作都是对自身对象进行操作,而不是生成新的对象,其所占空间会随着内容的增加而扩充。
SQL语句的执行速度更快
优点:一是可以实现平台无关性,既与特定CPU无关;二是只要把.NET矿建某种语言编译成IL代码,就实现.NET矿建中语言之间的交互操作。
IL是.NET矿建中的中间语言(Intermediate Language)的缩写。
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel=true;
}
Process.Start("cmd");
Appplication.Exit()是退出整个应用程序,Form.Close()是关闭其中一个form。
第一种:
DataSet ds=new DataSet ();
this.dataGridView1.DataSource=ds.Tables[索引或表名];
第二种:
ArrayList al = new ArrayList();
this.dataGridView1.DataSource = al;
第三种:
Dictionary
this.dataGridView1.DataSource = dic;
第四种:
DataView dv = new DataView();
this.dataGridView1.DataSource = dv;
通过判断IsPostBack属性判断是否首次加载。在页面首次加载时,编写控件初始化代码和页面变量初始化代码
Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
1.session 在服务器端,cookie 在客户端(浏览器)
2.session 默认被存在服务器的一个文件里(不是内存)
3.session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4.session 可以放在 文件、数据库、或内存中都可以。
5.用户验证这种场合一般会用 session 因此,维持一个会话的核心就是客户端的唯一标识,即 session id
初始化-》加载视图状态-》处理回发数据-》加载-》发送回发更改通知-》处理回发事件-》预呈现-》保存状态-》呈现-》处置-》卸载
页面间传值:
1.使用QueryString变量。
2.PostBackUrl()方法。
3.使用Server.Transfer方法。
应用程序范围内传值:
1.使用Cookie对象变量。
2.使用Session变量。
3.使用Application对象变量。
使用AJAX实现异步刷新就是在用户“无察觉”的情况下“偷偷”访问了远程服务器进行工作,然后将结果返回后由JS提供在客户端,让用户感受好像B/S架构的程序和C/S的差不多的感觉。
1.打开IIS管理器。
2.展开“本地计算机”-“网站”目录,选中“默认网站”节点,右键“属性”,设置主目录。
3.右键“默认网站”图标,选择“新建”-“虚拟目录”命令。IIS将启动“虚拟目录创建向导”对话框帮助我们完成创建虚拟目录的步骤。
4.单击对话框的“下一步”按钮以显示虚拟目录别名页,如HelloWorld。别名是我们用来标识该目录中的资源的名称。在VS.NET中,别名是用来指定项目位置的名称。
5.单击“下一步”按钮,以显示Web站点内容目录页。在此,输入包含此网站内容的目录的路径。
6.单击“下一步”按钮,打开虚拟目录访问权限设置页面。选中“读取”复选框和“运行脚本”复选框。
7.单击“下一步”按钮,再单击“完成”按钮创建虚拟目录并终止向导。查看IIS管理器中虚拟目录的创建结果,可以发现,默认网站中多了一个齿轮状图标的HelloWorld节点。
如果当前还不是齿轮状,右键节点,打开属性页,在虚拟目录中的应用程序设置中创建应用程序名为HelloWorld的应用程序就可以了
MVC是三个单词的首字母缩写,它们是Model(模型)、View(视图)和Controller(控制)
从结构上看,可以分成三层,
1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。
2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。
3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。
这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。这样一来,软件就可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。
所谓 “状态管理”,是指使用ASP.NET中的ViewState、Cookie、Session和Application等对象实现页面数据缓存和传递的技术。
1. get/post均可向服务器传送页面数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
1.aspx页面中的page_load
2.UserCtrl1中的page_load
3.用户控件uiAdd()
4.Button1点击后将触发Button1_Click事件
foreach (System.Windows.Forms.Control control in this.Controls)
{
if (control is System.Windows.Forms.TextBox)
{
System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ;
tb.Text = String.Empty ;
}
}
上边的方法只是针对于桌面软件类的,如果要针对于web开发中怎么实现呢?
首先.aspx文件一定会包含一个: