C#学习摘记

1,Microsoft .NET Framework是用于Windows的新托 管代码编程模型。它将强大的功能与新技术结合起来,用于构建具有视觉上引人注目的用户体验的应用程序,实现跨技术边界的无缝通信,并且能支持各种业务流程。

托管代码 (managed code)同受管制的代码,由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。

简单点说,托管代码是一microsoft的 中间语言,他主要的作用是在.NET FRAMEWORK的CLR执行代码前去编译 源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段:
1>源代码编译为托管代码;(所以源代码可以有很多种,如VB,C#,J#)
2>托管代码编译为microsoft系统的.net平台专用文件(如类库、 可执行文件等)。


2,C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。


3,VS是Microsoft Visual Studio的简称。VS是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。


4,三种注释类型:/×   ×/, //  ,///.


5,#region 和 #endregion关键字用于定义可以展开和折叠的代码区域的开头和结尾。


6,简单数据类型:数值类型 sbyte,byte,short,ushort,int, unit,long,ulong,float,double,decimal, 非数值类型char,bool,string.


7,转义字符\, 换行\n, 退格\b,  换页\f,   回车\r,    水平制表符\t, 垂直制表符\v

  但@字符表示逐字指定,故可以严格按照字面输出字符。


8,占位符{0}{1}....


9,Console.ReadKey(); 用于暂停代码的执行,尤其是在控制台程序中。


10,变量的命名规则: 1>变量名的第一个字符必须是字母、下划线或@。

                                      2>其后的字符可以是字母、下划线或数字。

                                      3>不能是关键字或保留字。

                                      4>区分大小写。

                                      5>必须先声明,再赋值,后使用,且可以多次赋值,但以最后一次为主。


11,变量的命名规范:1>包的名字都是由小写单词组成

                                      2>类或接口的名字必须由大写字母开头而单词中的其他字母均为小写;

                                      3>如果类名称由多个单词组成,则每个单词的首字母均应为大写例如TestCase;如果类名称中包含单词缩写,则这个所写词的每个字母均应大写.

                                      4>变量及方法的命名。方面的命名第一个单词应小写,第二个单词首字母大写,类的公共成员(包括变量或方法),一般每个单词的首字母都大写。

                                      5>常量的名字应该都使用大写字母,并且指出该常量完整含义


12, 运算符的优先级有高到低:(),++(前缀),--(前缀),+(一元),-(一元),×,/,%,+(二元),-(二元),<<,>>,==,!=,&,^,|,&&,||,=,×=,/=,%=,+=,-=,<<=,>>=,&=,|=,++(后缀),--(后缀)。


13,名称空间关键字namespace, 域操作符.


14, 程序流程就是程序代码的执行顺序,流程控制包括分支和循环两种。分支是有条件地执行代码。循环重复执行相同的语句。


15,条件布尔运算符,&&和||,又称短路布尔运算符,即两个都是检查第一个操作数的值,再根据该操作数的值进行操作,可能根本就不处理第二个操作数。


16,switch语句中每个 case的语句中都有 break命令,故在运行一个case后,分支操作退出,不会执行下一个case,而C++语言中则没有这个限制,可以执行多个case。

       另外,若一个case条件作为另一个case条件的语句,可以造成case语句的叠加,即某一个语句有多个条件。


17,一般情况下,位数较少的数值类型可以安全的隐式转换为位数较大的类型;char类型相当于byte类型,但不能转换成short类,可转换为ushort.

     而显式转换则为用()明确说明转换后的类型即可,且可以用checked((short) var)或unchecked()表示是否进行溢出检查。

     另外,Convert.ToDouble()等系列命令也可以进行显式转换。

   


18,枚举数据类型  enum <typeName> :<underlyingType> { <value1>=<actualval1>, value2>,....}



19, 结构数据类型  struct <typeName> { <accessibility> <type> <name>;.....}   
  其中,<accessibility>可以使用关键字public等。

20,数组的声明 <baseType> [ ] <name>;
        数组的赋值 <baseType> [ ]<name>={3,4,5};

       多维数组的声明 <baseType> [,,,, ] <name>; 即C#中的多维数组可以在一个中括号中用逗号分隔标识维度。

       数组的数组的声明 <baseType> [ ]  [ ] <name>;


21,foreach循环,  foreach (<baseType> <name> in <array>) {//statements}


22, string的常用方法及属性:
22.1  v.ToCharArray()表示将字符串转换为字符数组。
22.2  v.Length 表示字符串的长度属性。
22.3  v.ToLower()表示转换为小写。
22.4  v.ToUpper()表示转换为大写。
22.5  v.Trim()表示删除字符串中的空格。TrimStart()与 TrimEnd()则表示删除前面或后面的空格。
22.6  v.PadLeft() 表示在左边添加空格;PadRight() 表示在右边添加空格。而PadRight(10,"_")则表示在右边添加10个下划线。
22.7  v.Split(char[])用于将字符串在char[]标识的地方分隔,



23,函数格式,static type function_name($arg1,$arg2,….){statement(s);return xxx;}
     函数的最后一个参数可以是特定的参数,称为参数数组,可以使用params关键字定义。
     若为void类型,则不应出现XXX.
     函数的参数可以加修饰符ref/out,从而达到引用传递参数,且out标识的参数可以是未经过赋值的。
     函数的名称及其参数类型组合在一起,就定义了一个惟一的特性,称为函数签名。


24,函数中定义的变量仅在函数体中有效,语句块的变量类似,及局部作用域;
       static/const可以声明全局变量,但const声明的全局变量不能更改。
       函数之外的变量为全局变量,整个文件有效,除非被局部屏蔽。


25,委托解析。理解委托主要需要理解下面五步,且关键是理解委托变量初始化的语法表达。
1>用delegate关键字声明委托,可以指定返回类型及参数。如 delegate double ProcessDelegate(double param1,double param2);
2>声明或确认与委托类型相关的函数。如 static double Multiply(double param1,double param2){ xxxxxx;}
3>声明委托类型的变量。如ProcessDelegate process;
4> 将委托变量初始化为一个函数。如process=new processDelegate(Multiply);
5>调用委托。如process(param1,param2);


26.接口是指定一组函数成员而不实现成员的引用类型,其他类型-类和接口可以实现接口。
26.1接口是一个引用类型,通过接口可以实现多重继承。
26.2. C#中接口的成员不能有new、public、protected、internal、private等修饰符。
26.3. 接口中只能声明"抽象"成员(所以不能直接下一步对接口进行实例化(即不能使用new操作符声明一个接口的实例对 象)),而不能声明共有的域或者私有的成员变量。
26.4. 接口声明不包括数据成员,只能包含方法、属性、事件、索引等成员。
26.5. 接口名称一般都以“I”作为首字母(当然不这样声明也可以),这也是接口和类的一个区别之一。 [2]  
26.6. 接口成员的访问级别是默认的(默认为public),所以在声明时不能再为接口成员指定任何访问修饰符,否则 编译器会报错。
26.7. 接口成员不能有static、abstract、override、virtual修饰符,使用new修饰符不会报错,但会给出警告说不需要关键字new.
26.8. 在声明接口成员的时候,不准为接口成员编写具体的可执行代码,也就是说,只要在对接口进行声明时指明接口的成员名称和参数就可以了。
26.9. 接口一旦被实现,实现类必须实现接口中的所有成员,除非实现类本身是抽象类(通过具体的可执行代码实现接口抽象成员的操作)。
26.10接口继承:interface subname: supname1,supname2…{}.



27. 其成员被继承的类叫基类也称父类,继承其成员的类叫派生类 也称子类。
派生类隐式获得基类的除构造函数和析构函数以外的所有成员。
派生类只能有一个直接基类,所以C#并不支持多重继承但一个基类可以有多个直接派生类。
继承是可以传递的

class subclass: public supclass{};


28.当派生类从基类继承时,它会获得基类的所有方法、字段、属性和事件。 面向对象的语言使用虚方法表达多态。 若要更改基类的数据和行为,您有两种选择:可以使用新的派生成员替换基成员,或者可以重写虚拟的基成员。且类定义时,基类必须放在第一位。



29.类定义中类的常用访问修饰符:访问级别符:无或internal, public, 特性修饰符: abstract(只能在当前项目中访问,不能实例化,只能继承使用), sealed(只能在当前项目中使用,不能派生使用,只能实例化)。
    类成员变量的访问级别修饰符:public,private,internal,protected.
    类方法成员的修饰符: virtual,abstract,override,extern,sealed.

.


30. 构造函数可以使用base()关键字标识使用的基类构造函数。

31类的属性定义一般格式如下,且两个方法可以设置访问级别,或仅适用其中的一个。
public int MyIntProp
{
   get
     {   //statement     }
   set
    {//statement}
}



32. 继承一个方法时(包括类成员或接口成员方法),可以通过new关键字显示的表明隐藏基类成员,而override则可以表明重写成员。重写后,基类的方法就基本消失了(因此可以在重写时通过base关键字调用,但静态方法除外),但隐藏的方法可以通过基类实例调用。

   public class MyDerivedClass:MyBaseClass
{
 new public void DoSomething() {}   //  public override void DoSomething(){}
}



33. 显式的实现接口成员。如果类A继承了接口B,而接口B的方法M被显式的实现,则只能他哦能提供接口引用该方法。而隐式的实现则可以通过类来引用。
     显式的实现接口格式为:     class A:B{ void B.M(){}}



34.partial关键字可以实现部分类定义,且要求其出现在包含定义部分的每个文件的与此相同的位置,同时部分类的接口会应用于整个类。
  基本格式:public partial class MyClass{}
   部分方法定义是指在不同的部分类定义中共同完成一个方法的定义,也需使用partial关键字。但部分方法总是私有的,没有返回值,不能使用out参数。
   基本格式为:public partial class MyClass{ partial void MyPartialMethod();}
                         public partial class MyClass{ partial void MyPartialMethod(){statement} }


35.Call Hierarchy是Visual Studio 2010中的一个新的特性,它用来查看函数之间的调用层次关系。它跟原来的Find All References功能相似,但是,更加强调调用层次,而且能够比后者提供更多的信息。



36. C# 中使用线程的方法很多,使用委托的BeginInvoke EndInvoke 方法就是其中之一。BeginInvoke 方法可以使用线程异步地执行委托所指向的方法。然后通过EndInvoke 方法获得方法的返回值(EndInvoke 方法的返回值就是被调用方法的返回值),或是确定方法已经被成功调用。我们可以通过四种方法从EndInvoke 方法来获得返回值。



37.事件, 做为一个约定, 事件一般使用带两个参数的方法,其中一个参数是一个对象,包含事件的发送者; 第二个参数提供了事件的相关信息.
完整事件定义代码为:
public event EventHandler<CarInfoEventArgs> NewCarInfo{ add { newCarInfo +=value;}remove{newCarInfo-=value;}}
但一般情况下C#的简化定义格式如下:
public event EventHandler<CarInfoEventArgs> NewCarInfo

而对于EventHandler<TEventArgs>定义了一个一般处理程序, 它返回void,接受两个参数, 第一个必须是object类型,第二个必须是T类型. 



38.Delegate 类的GetInvocationList()方法,可以访问委托列表中的每一项,并独立地调用每个方法.

39. 所谓事件侦听 即是定义一个方法,用来记录确认事件是否被订阅.

40.StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串 缓冲区被单个 线程使用的时候(这种情况很普遍)。
(1)Append 方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder 对象表示的字符串的结尾处。
(2)AppendFormat 方法将文本添加到 StringBuilder 的结尾处,而且实现了 IFormattable 接口,因此可接受格式化部分中描述的标准格式字符串。
(3)Insert 方法将字符串或对象添加到当前 StringBuilder 中的指定位置。
(4)可以使用 Remove 方法从当前 StringBuilder 中移除指定数量的字符,移除过程从指定的从零开始的索引处开始。
(5)使用 Replace 方法,可以用另一个指定的字符来替换 StringBuilder 对象内的字符。
(6)ToString方法可以转换为string.


41. 正则表达式的使用就是实例化一个对象,即System.Text.RegularExpressions.RegEx.
 静态方法Matches()的参数是一些输入文本,一个模式和RegexOptions枚举中的一组可选标志, 返回值类型为MatchCollections.


42 return (number ^ number << 16) * 0x15051505;这里GetHashCode使用的算法将数字向左移动16位,再与原来的数字进行异或操作,最后将结果乘以 十六进制数15051505,散列码在整数取值区域上的分布相当均匀。


43.程序集是包含编译好的,面向.NET Framework的代码的逻辑单元.

44.在C#中,字符串是引用类型,但其特别之处是,若对一个字符串进行更改,则改变为一个新的字符串的引用.

45.在C#中,@符号表示原样引用, 即此时不用使用转义符等操作了.

46.在控制语句switch...case中, 一般每个case语句都需要有break字句, 但如果一个case语句为空,则可以省略break字句.

47.Enum.Parse()方法可以将字符串转换为整数.其中第一个参数是要使用的枚举类型,第二个参数是要转换的字符串,第3个参数是一个bool,指定在进行转换时是否忽略大小写.


48.泛型的约束类型需要用where子句指定, 类似于定义类时的一个条件.

49.锯齿数组,即每行有不同大小的二维数组. 声明方法如下:
int [ ] [ ] jagged= new int [3][ ];
而一般的二维数组声明方式如下:
int [ , ] array1= new int [3,3];

49.所有的数组都派生自Array基类, 除了正常的C#语法创建数组外,还可以使用Array类的方法CreateInstance(),尤其是不清楚数组类型时.
   如 Array intArray1= Array.CreateInstance(typeof(int),5); 若创建二维数组,后面加参数即可.

50.Array.SetValue()方法用于设置数组的元素, 其参数是每一维的索引.

51.Array.Clone()方法可以实现数组的复制, 但一般的赋值只是引用同一个数组 ,而不会创建副本.
     Array.Sort()方法实现数组的排序.
     结构ArraySegment<T>表示数组的一段.
     SumOfSegments()方法提取一组数组段元素.


52.IEnumerator接口的MoveNext()方法移动到集合的下一个元素上. Dispose()方法用来清理类弄占用的资源.

53.yield return语句返回集合的一个元素,并移动到下一个元素上; yield break可停止迭代. 但迭代块必须声明在返回枚举类型的接口中.
    GetEnumerator()方法用来迭代标题.
    Reverse()方法用来逆序迭代.
    Subset() 方法迭代子集.


54.Tuple元组类合并了不同类型的对象.
54.1 Divide()方法返回包含两个成员的元组.
54.2 Create()方法用于创建元组.
54.3 Equals() 方法有两个版本, 一个重写了Object基类中的方法,并包含一个object类型的参数; 另一个由IStructuralEuqalityComparer接口定义, 并把object和IEqualityComparer作为参数.



55.在C#中,所有的运算符重载都声明为public和static, 其声明格式如下:
public static Vector operator + (Vector lhs, Vector rhs){}

56. 用户可以通过explicit或implicit来声明强制类型转换的显式或隐式. 另外C#的system.Convert类定义了大量的类型转换,可以现成使用, 但原理等同于用explicti或implicit来自己定义.


57.程序集是自我描述的安装单元,由一个或多个文件组成, 即可以是包括元数据的DLL或EXE,也可以由多个文件组成.
     GAC(global assembly cache)指全局程序集缓存.

58.事务(Transaction)是访问并可能更新数据库中各种 数据项的一个程序执行单元(unit)。事务通常由 高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的 用户程序的执行所引起,并用形如 begin transactionend transaction语句(或 函数调用)来界定。事务由事务开始( begin transaction)和事务结束( end transaction)之间执行的全体操作组成。
事务是恢复和 并发控制的基本单位。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为 ACID特性
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。


59.Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这种服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。


60.COM是Component Object Model ( 组件对象模型)的缩写。简单地说,COM是一种跨应用和语言共享二进制代码的方法。


61.XAML是eXtensible Application Markup Language的英文缩写,相应的中文名称为可扩展应用程序 标记语言,它是 微软公司为构建应用程序用户界面而创建的一种新的描述性语言。XAML提供了一种便于扩展和定位的语法来定义和程序逻辑分离的用户界面,而这种实现方式和ASP.NET中的"代码后置"模型非常类似。XAML是一种解析性的语言,尽管它也可以被编译。它的优点是简化编程式上的用户创建过程,应用时要添加代码和配置等。


62.Directory类和File类只包含静态方法,不能被实例化,可以用于执行简单的操作,即一次性的操作,便于提高性能.
     DirectoryInfo类和FileInfo类实现与上面两类大致相同的公共方法,并拥有一些公共属性和构造函数, 但他们不是静态的,需要实例化后进行操作,多用于多次操作.

63.读写文件一般通过File类或专门的类:流.
63.1 File.ReadAllText(FilePath, Encoding)方法表示打开指定的文件,读取内容,然后关闭文件.
63.2 File.ReadAllBytes(FilePath)方法表示打开指定的二进制文件,读取内容,然后关闭文件.
63.3 File.ReadAllLines(FilePath)方法表示打开指定的文件,逐行读取内容,然后关闭文件.
63.4 WriteAllText(filepath, text),WriteAllBytes(),WriteAllLines(),表示对应的写入文件.
63.5 流的基类包括:System.IO.MemoryStream, System.Net.Sockets.NetworkStream, System.IO.Stream. 且流一般都是缓存进行的.且流使用后需要显式关闭.
63.6 FileStream 主要用于在二进制文件中读写二进制数据, 当然也可以用于其它文件.方法包括Read(),ReadByte(),Write(),WriteByte(),
63.7 StreamReader和StreamWriter 专门用于文本文件.方法包括Read(),ReadLine(),ReadToEnd(), Write(),WriteLine(),
63.8 BinaryReader和BinaryWriter 能够提供其他流对象的包装器, 并且对二进制数据进行额外的格式化.

64. ADO.NET Entity Framework 提供了从关系数据库架构到对象的映射. 使用Entity SQL为存储器定义基于实体的数据库查询.LINQ to Entities允许使用 LINQ语法来查询数据.
       对象上下文保存了变化的实体信息,从而在把实体写回存储器时,提供这些信息.

65.Microsoft Silverlight的中文名为“微软 银光”,是一种新的Web呈现技术,能在各种平台上运行, 即是一个跨浏览器的、跨平台的 插件,为网络带来下一代基于.NETFramework的媒体体验和丰富的交互式应用程序。Silverlight提供灵活的编程模型,并可以很方便地集成到现有的网络应用程序中。Silverlight可以对运行在 MacWindows上的主流浏览器提供高质量视频信息的快速、低成本的传递。


66. WF的全称是Windows Workflow Foundation,

WF不是一个独立的工作流应用程序,它提供了一些类库用于辅助工作流应用程序的开发,因此WF是一套用于辅助工作流开发的框架;

WF只是一个框架,因此需要宿主到其它应用程序中才能运行;

WF提供了实现工作流应用程序时所需要实现的一些机制,比如持久化、跟踪机制等。

工作流,是对工作流程及其各操作步骤之间业务规则的抽象、概括、描述。

WF的架构总共分三层分别是:宿主程序层(Hosting Process)、WF运行时层(WorkflowRuntime)、WF服务层。




67, 确定自己连接到什么类型的云上的命令: netsh p2p pnrp cloud show list


68,RSS(Really Simple Syndication)是一种描述和同步 网站内容的格式,是使用最广泛的XML应用。
     Atom是开发一个新的网志摘要格式以解决目前 RSS存在的问题混乱的版本号,不是一个真正的开放标准,表示方法的不一致,定义贫乏等等。Atom 希望提供一个清晰的版本以解决每个人的需要,其设计完全不依赖于供货商,任何人都可以对之进行自由扩展,完整详细说明。


69.COM+并不是COM的新版本,我们可以把它理解为COM的新发展,或者为COM更高层次上的应用。COM+的底层结构仍然以COM为基础,它几乎包容了COM的所有内容。有一种说法这样认为,COM+是COM、 DCOMMTS(Microsoft Transaction Server)的集成,这种说法有一定的道理,因为COM+确实综合了这些技术要素。但更重要的一点是,COM+倡导了一种新的概念,它把 COM组件软件提升到 应用层而不再是底层的 软件结构,它通过操作系统的各种支持,使 组件对象模型建立在应用层上,把所有组件的底层细节留给操作系统。
System.EnterpriseServices 命名空间为企业应用程序提供重要的基础结构。COM+ 为企业环境中部署的组件编程模型提供服务结构。该命名空间向 .NET 对象提供对 COM+ 服务的访问,COM+ 服务令 .NET Framework 对象更适用于企业应用程序。

70.手动部署程序集可以通过.NET服务安装工具regcvcs.exe进行, 即 regcvcs SimpleServer.dll命令就会把SimpleServer程序集注册为一个COM+应用程序, 并根据其属性配置包含的组件,创建一个可以由访问.NET组件的COM客户端使用的类型库.


71.活动目录(Active Directory)是面向Windows Standard Server、Windows Enterprise Server以及 Windows Datacenter Server的目录服务。(Active Directory不能运行在Windows Web Server上,但是可以通过它对运行Windows Web Server的计算机进行管理。)Active Directory存储了有关网络对象的信息,并且让管理员和用户能够轻松地查找和使用这些信息。Active Directory使用了一种结构化的数据存储方式,并以此作为基础对目录信息进行合乎逻辑的分层组织。


72.C++/CLI标准是基于Microsoft提交的标准C++与通用语言基础结构(Common Language Infrastructure)结合的技术。ECMA技术委员会为其建立了语言标准、类库和运行环境标准,最新的版本是ECMA-335,2005年6月的第三版。
C++/CLI是静态C++对象模型到CLI的动态组件对象编程模型的捆绑。简而言之,它就是你如何用C++在.NET中编程,而不是C#或 Visual Basic.NET。象C#和CLI本身一样,C++/CLI正在ECMA(欧洲计算机制造商协会)主持下进行标准化,以最终符合ISO标准。

C++/CLI代表托管和本地编程的结合。在反复过程中,这种综合已经通过源级相对独立但又相互平等地组件和二进制元素得到了完成,包括混合模式(本地和CTS类型的源级混合,还有一个本地及CLI对象文件的二进制混合),纯模式(本地和CTS类型的源代码级混合,所有的都被编译为CLI对象文件),本地分类(可以通过一个特定的打包类来保持CTS类型),和CTS分类(可以保持本地类型为指针)。

当然,C++/CLI开发人员也可以单独使用CLI类型来编程,并通过这种方式来提供伺服状态下的可校验代码,例如可以作为SQL Server2005的一个SQL存储过程。


73. MarshalByRefObject 是通过使用 代理 交换消息来跨应用程序域边界进行通讯的对象的基类 .

MarshalByRefObject对象在本地应用程序域的边界内可直接访问。远程应用程序域中的应用程序首次访问MarshalByRefObject时,会向该远程应用程序传递代理。对该代理后面的调用将封送回驻留在本地应用程序域中的对象。

一般的对象只能在本地应用程序域之内被引用,而MarshalByRefObject对象可以跨越应用程序域边界被引用,甚至被远程引用。

MarshalByRefObject是所有可以在AppDomain边界外部访问的对象的基类,重心不是marshal,而是object,即object that could be marshaled by reference,也就是可以通过Ref(实际上是ObjRef对象)的机制进行封送MSDN中文版对marshal一词的翻译)的对象。封送的行为是由代理来做的,这里说的代理就是我文章中讲过的.NET Remoting的真实代理(即RemotingProxy)。真实代理不是有一个Invoke()方法吗?当你透过对一个MBRO的透明代理访问该对象的方法时,透明代理将把基于堆栈的方法调用转换为方法调用消息(IMethodCallMessage)并转发给真实代理(在Remoting的场合中也即RemotingProxy),而RemotingProxy的任务就是把对象封送并连同方法调用消息一起转发给远程应用程序域;到达目的地以后的操作类似:远程应用程序域中的监听方当收到发来的方法调用消息时,先取出封送好的ObjRef(这个对象里面保存着发来调用的那个对象!),将其结封(unmarshal)为本地的对象,并获得其透明代理,然后就可以把方法调用消息在转换回基于堆栈的调用发送给这个对象。


74.Web服务是利用SOAP(Simple Object Access Protocol简单对象访问协议)在HTTP上执行远程方法调用的一种新方法.



75. BaseService<T> where T : class, new() 含义 类型参数约束,.NET支持的类型参数约束有以下五种:

where T : struct                               | T必须是一个结构类型
where T : class                               T必须是一个类(class)类型
where T : new()                               | T必须要有一个无参构造函数
where T : NameOfBaseClass          | T必须继承名为NameOfBaseClass的类
where T : NameOfInterface             | T必须实现名为NameOfInterface的接口

 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值