NET Framework 体系结构 (简单)

来源:互联网 发布:js let const 编辑:程序博客网 时间:2024/05/17 03:29

Microsoft. NET Framework 的体系结构.NET Framework 的组件.NET Framework是用于.NET平台的编程模型,具有两个主要组件:公共语言运行库和 .NET Framework 类库(包括 ADO.NET、ASP.NET 和 Windows 窗体)。通用语言规范 (CLS)Ø 规定所有 .NET 语言都应遵循的规则Ø 生成可与其他语言互操作的应用程序公共类型系统 (CTS) 通常Ø 包含标Ø 准数据类型Ø 包含准则集 .NET Framework内部关系以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。 执行 .NET 程序Microsoft 中间语言 (MSIL) 由一组特定的指令组成,这些指令指明如何执行代码。.NET中的MSIL原理图 C# 2.0的新增功能 泛型是2.0版C# 语言和公共语言运行库 (CLR) 中的一个新功能。使用泛型类型可以使程序员能够实现最大限度地重用代码、保护类型的安全以及获得更高的集合类性能。迭代器是 C# 2.0 中的新功能。它是可以返回相同类型的值的有序序列的一段代码。迭代器可用作方法、运算符或get访问器,它使程序员在类或结构中支持foreach迭代,而不必实现整个IEnumerable接口。分部类型定义允许将单个类型(比如某个类)拆分为多个文件。Visual Studio 设计器使用此功能将它生成的代码与用户代码分离。使用partial关键字表明可在命名空间内定义该类、结构或接口的其他部分。 可空类型允许变量包含未定义的值。在使用数据库和其他可能包含未含有具体值的元素的数据结构时,可以使用可空类型。C# 部分关键字is as sizeof typeof checked unchecked unsafe explicit implicitextern fixed lock readonly stackalloc volatile 上下文关键字 get partial set value where yield C# 预处理器指令#if #else #elif #endif # define #undef #warning #error#line #region #endregion #pragma #pragma warning #pragma checksumC# 中的数据类型值类型 表示实际数据,只是将值存放在内存中,存储在栈中。值类型有结构(struct)、枚举(enum)、基本数据类型、用户定义类型。引用类型 表示指向数据的指针或引用 ,包含内存堆中对象的地址,存储在堆中。引用类型有类、接口、数组、字符串、委托。为 null,则表示未引用任何对象装箱是将值类型转换为引用类型拆箱是将引用类型转换为值类型 (如果源参数为 null 或是对一个不兼容对象的引用,则会引发 InvalidCastException) int val = 100;object obj = val; //装箱int num = (int)obj; //拆箱Console.WriteLine("num: {0}", num); 参数传递C#中基本数据类型默认以传值的方式传递参数,被调用的方法不会修改实参的值C#中类类型默认以传引用的方式传递参数 class Ref { public int a = 0; public void Ys(Ref f) { f.a = 5;//在方法中修改了参数的属性值 } } public class RefDemo { public static void Main(string[] args) { Ref f1 = new Ref(); Ref f2 = new Ref(); //显示没调用方法前f2的属性值 Console.WriteLine("f2.a = " + f2.a); f1.Ys(f2); //显示调用方法后f2的属性值 Console.WriteLine("f2.a = " + f2.a); } } Ø 引用型参数 输出参数传递到 ref 参数的参数必须最先初始化。out 的参数在传递之前不需要显式初始化 class RefExample { static void Method(ref string s) { s = "changed"; } static void Main() { string str = "original"; Method(ref str); Console.WriteLine(str); } } class OutExample { static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 } } Ø 数组型参数在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。 static void UseParams(params int[] list) { for (int i = 0; i < list.Length; i++) { Console.WriteLine(list[i]); } } static void Main() { UseParams(1, 2, 3); } 数组都是由System.Array类继承来的引用类型操作数组Rank属性可以获得数组维数。Length属性可以获得数组长度。Reverse方法,反转一个数组。Clone方法,复制一个数组。Sort方法,对数组进行排序。Clear方法,清空元素。 int[,] x = new int[5, 3]; for (int i = 0; i <= x.GetUpperBound(0); i++) { for (int j = 0; j <= x.GetUpperBound(1); j++) { x[i, j] = i + j; } } int[][] y = new int[2][]; y[0] = new int[5]; y[1] = new int[3]; for (int i = 0; i <= y.GetUpperBound(0); i++) { for (int j = 0; j <= y[i].GetUpperBound(0); j++) { y[i][j] = i + j; } } for (int i = 0; i <= y.GetUpperBound(0); i++) { for (int j = 0; j <= y[i].GetUpperBound(0); j++) { Console.Write(y[i][j]+"/t"); } Console.WriteLine(); } 类的修饰符可以是以下几种之一或者是它们的组合public 不限制对该类的访问internal 只有其所在工程才能访问(默认)abstract 抽象类、不允许建立类的实例sealed 密封类、不允许被继承partial 可以将类、结构或接口的定义拆分到两个或多个源文件中。每个源文件包含类定义的一部分,编译应用程序时将把所有部分组合起来。类的成员有以下类型:Ø 成员常量 代表与类相关联的常量值 (const)Ø 域 即类中的变量Ø 成员方法 复Ø 杂执行类中的计算和其它操作Ø 属性 用于定义类中的值并对它们进行读写Ø 事件 用于说明发生了什么事情Ø 索引器 允许像使用数组那样为类添加路径列表Ø 操作符 定义类中特有的操作Ø 构造函数和析构函数 分别用于对类的实例进行初始化和销毁类成员修饰符:public 不限制访问internal 只有其所在工程才能访问protected 子类可访问,无继承与private无异private 类内可访问(默认)internal protectedstatic const virtual override abstract sealed abstract class A // 抽象类 { long a1; decimal a2; public long A1 // 属性 { set { this.a1 = value; } get { return this.a1; } } public decimal A2 // 属性 { set { this.a2 = value; } get { return this.a2; } } public A(long a1, decimal a2) // 构造函数 { this.a1 = a1; this.a2 = a2; } public virtual void show() { Console.WriteLine("show A"); } public abstract void abstractDemo(); // 抽象方法 } class B : A { float b1; public B(long a1, decimal a2, float b1) : base(a1, a2) // 构造函数 { this.b1 = b1; } public override void show() { base.show(); Console.WriteLine("show B"); } public override void abstractDemo() { Console.WriteLine("abstract"); //throw new Exception("The method or operation is not implemented."); } } class C { static void Main() { B b = new B(1L,1.0m,1.0f); b.show(); b.abstractDemo(); } } 接口是隐式公共的,继承接口,必须实现接口中的全部方法。接口与抽象类的区别:接口所有的成员全是抽象的。接口成员一般都是公有的。接口可以从多个基接口继承,而类或结构可以实现多个接口。 interface IOne { void show(); } interface ITwo { void show(); } class M : IOne, ITwo { void IOne.show() { Console.WriteLine("实现IOne接口中的show方法"); } void ITwo.show() { Console.WriteLine("实现ITwo接口中的show方法"); } static void Main() { IOne obj = new M(); obj.show(); } } String 对象是不可改变的。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。 public static void Main() { string sp = " ,:"; char[] p = sp.ToCharArray(); string s = "hello world,welcome:you"; string[] arr = s.Split(p, 4); for (int i = 0; i < arr.Length; i++) { Console.WriteLine(arr[i]); } } StringBuilder类的方法:Append Insert Remove Replace等。 StringBuilder MyStringBuilder1 = new StringBuilder("Hello World!"); MyStringBuilder1.Append(" What a beautiful day."); Console.WriteLine(MyStringBuilder1 + "/n"); StringBuilder MyStringBuilder2 = new StringBuilder("Hello World!"); MyStringBuilder2.Insert(6, "Beautiful "); Console.WriteLine(MyStringBuilder2 + "/n"); StringBuilder MyStringBuilder3 = new StringBuilder("Hello World!"); MyStringBuilder3.Remove(5,6); Console.WriteLine(MyStringBuilder3 + "/n"); StringBuilder MyStringBuilder4 = new StringBuilder("Hello World!"); MyStringBuilder4.Replace('!','?'); Console.WriteLine(MyStringBuilder4 + "/n"); 操作符重载重载操作符必须是public和static 修饰的,有些操作符必须成对重栽,有些操作符不能重栽 public static Complex operator +(Complex a, Complex b) { return new Complex(a.r + b.r, a.v + b.v); } public static Complex operator ++(Complex a) { return new Complex(a.r + 1, a.v + 1); } 索引器提供了一种像访问数组一样访问类或结构的方法。 class StringIndex{ string[] s; int length; public StringIndex(int l) { length = l; s = new string[length]; } public string this[int index] { set { s[index] = value; } get { return s[index]; } } static void Main() { StringIndex si = new StringIndex(3); si[0] = "one"; Console.WriteLine(si[0]); }} 泛型System.Collections.Generic 命名空间包含定义泛型集合的接口和类 class A { T x; public T X { set { x = value; } get { return x; } } public A(T x) { this.x = x; } } class B { static void Main() { A a = new A(1); a.X = 2; Console.WriteLine(a.X); } } 泛型集合类List 类是 ArrayList 类的泛型等效类。Stack表示同一任意类型的实例的大小可变的后进先出 (LIFO) 集合。Queue表示对象的先进先出(FIFO)集合。Dictionary 泛型类提供了从一组键到一组值的映射。字典中的每个添加项都由一个值及其相关联的键组成。Dictionary 类是作为一个哈希表来实现的。 List Lt = new List(); Lt.Add("One"); Lt.Add("Two"); Lt.Add("Three"); foreach (string s in Lt) { Console.WriteLine(s); } Stack Sk = new Stack(); Sk.Push(1); Sk.Push(2); Sk.Push(3); for (int i = 0; i < 3; i++) { Console.WriteLine(Sk.Pop()); } Queue Qe = new Queue(); Qe.Enqueue(1); Qe.Enqueue(2); Qe.Enqueue(3); for (int i = 0; i < 3; i++) { Console.WriteLine(Qe.Dequeue()); } Dictionary Dy = new Dictionary(); Dy.Add(1, "one"); Dy.Add(2, "two"); Dy.Add(3, "three"); foreach (KeyValuePair kvp in Dy) { Console.WriteLine(kvp.Key+"/t"+kvp.Value); } 委托是一种类型,这种类型可以来实现函数的回调。当一个方法是多个类的公共方法的时候,往往就可以考虑使用委托委托也可以包含多个方法。这种委托称为多点委托。将多个方法赋值给多委托的方法是使用+=运算符,相应地,使用-=运算符可以从多委托中删除某个方法 muLtiDelegate mDelegate;mDelegate = new muLtiDelegate(first);mDelegate += new muLtiDelegate(second); class DelegateDemo { public delegate void Deli(int a, int b); //声明委托 public void M(int a, int b) { Console.WriteLine(a + b); } public static void Main() { DelegateDemo obj = new DelegateDemo(); Deli d = new Deli(obj.M); //实例化委托 d(3, 4); //实现委托 } } 事件是一个使对象或类可以提供公告的成员。用户可以通过提供事件句柄来为事件添加可执行代码。一个事件声明的类型必须是一个委托类型, 而那个委托类型必须至少同事件本身一样可访问。响应定时器事件.NET框架提供了3个定时器(Timer)类:♥ 第一个定时器类在System.Windows.Forms命名♥ 空间中。为了适应窗口应用程序,♥ 这个类被优化过,♥ 并且需要窗口消息泵。因此,♥ 该类通常应用在窗体应用程序中,♥ 也被用来实现定时器控件,♥ 程序员可以以添加控件的形式创建该例的实例。♥ 第二个定时器类是System.Threading.Timer类,♥ 它使用的是回调函数,♥ 主要是在自身的线程中进行操作。♥ 第三个定时器类是System.Timer.Timer类,♥ 它为多线程运行环境提供通用的定时器。 class EventDemo{ public delegate void Dele(); // 定义委托 public event Dele Click;   // 定义事件 public void M() { Console.WriteLine("Click finish"); } public void RaiseEvent() { this.Click(); } static void Main() { EventDemo ed = new EventDemo(); ed.Click += new Dele(ed.M); // 注册事件 ed.RaiseEvent(); // 调用事件 }} 命名空间主要是用来解决类库中的命名冲突。命名空间是隐式公共的每个命名空间都包含可在程序中使用的类型:类、结构、枚举、委托和接口在一个命名空间内可以声明另一个命名空间程序集是 .NET Framework 的生成块,它们构成基本部署单元、版本控制、重新使用、激活范围和安全权限。程序集包括可执行的应用程序文件(这些文件可以直接在Windows上运行,不需要其他程序,其扩展名是.exe)其他应用程序使用的库(其扩展名是.dll)。元信息(即程序集中包含的数据的信息,也称为元数据)可选的资源(MSIL使用的其他数据,例如声音文件和图片)程序集可以分为私有程序集和共享程序集。私有程序集,不被其它程序使用。私有程序集通常只能用于当前应用程序的软件包。共享程序集(Shared Assembly) 提供多个应用程序域访问同一个程序集的能力全局程序集缓存 C:/WINDOWS/assembly动态链接库是一种程序模块,它不仅可以包含可执行代码,而且通常还包含了各种类型的预定义的数据和资源 using Ti = System.Timers;using Th = System.Threading;class A{ static void Main() { Ti.Timer t1 = new System.Timers.Timer(); //Th.Timer t2 = new System.Threading.Timer(); } } 将csc.exe所在的文件夹路径加入到环境变量path中,每个路径用分号来结束。C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727cmdcsc /t:library /out:a.dll a.cscsc /r:a.dll b.csb创建名称唯一的共享程序集 gacutil.exe sn.exeF:/Microsoft Visual Studio 8/SDK/v2.0/Bin运行.NET SDK提供的ILDASM.EXE工具(可以在.NET SDK的安装目录下找到)进行IL反汇编程序 反射的定义:审查元数据并收集关于它的类型信息的能力。反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。Type 类是对象的所有反射信息的基础入口。有两种方法可以获取 Type 对象System.Type tt = 对象.GetType();System.Type tt = typeof(类名); using System;using System.Reflection;class A{ public static void Main(string[] args) { System.Reflection.Assembly ass = Assembly.LoadFrom(@"c:/ConsoleApplication5.exe/*.dll"); System.Type[] type = ass.GetTypes(); foreach (Type tt in type) { Console.WriteLine("-----------------------"); Console.WriteLine("类名:" + tt.Name + "/n"); Console.WriteLine("是否是接口:" + tt.IsInterface + "/n"); Console.WriteLine("命名空间:" + tt.Namespace + "/n"); Console.WriteLine("-------------------------"); foreach (System.Reflection.MethodInfo mm in tt.GetMethods()) { Console.WriteLine("*****************"); Console.WriteLine("名字:" + mm.Name + "/n"); Console.WriteLine("类型:" + mm.MemberType + "/n"); Console.WriteLine("声明类型:" + mm.DeclaringType + "/n"); Console.WriteLine("*****************"); } } }} 异常程序中有两种类型的错误:编译时错误(语法错误和逻辑错误)和运行时错误(异常)。在异常块中结束程序即使有异常检查机制,程序在运行时所遇到的错误仍然有可能使程序无法继续运行下去,此时最好结束程序。如果程序在主函数中捕获到异常,那么可以在执行完所需的处理之后,使用return语句来结束程序,但是,错误和异常的发生通常并没有这么简单,在这种情况下,C# 提供了两种退出应用程序的方法:♥ Environment.Exit(ReturnVal):终止应用程序,♥ 并将退出码返回给操作系统;♥ Appliction.Exit:通知所有的消息循环必须中止,♥ 关闭程序打开的所有窗口,♥ 结束程序。这两个方法都是静态方法,所以不需要创建类的实例来调用它们。Environment类在System命名空间中,该类的Exit方法通常用来结束命令行方式的程序;而Application类定义在 System.Windows.Forms命名空间中,通常用来终止窗口应用程序,它首先通知应用中的所有消息循环停止,然后关闭程序创建的所有窗口,最后退出应用程序。 public class MyException : System.Exception{ public MyException() : base("我的自定义异常!") { }}public class MyExceptionDemo{ public static void Main(string[] args) { try { throw new MyException(); } catch (MyException e) { System.Console.WriteLine(e.Message); }finally { Console.WriteLine("must be executed"); } }} 调试C# 程序1. 非中断模式下的调试用如下两个命令替代Console.WriteLine()调用,在运行期间把文本写入“输出”窗口:♥ Debug.WriteLine()♥ Trace.WriteLine()2. 中断模式下的调试♥ 设置断点♥ 使用断言( Debug.Assert() Trace.Assert() )♥ 监视变量的值♥ 逐语句与逐过程♥ 即时/命令窗口♥ “调用堆栈”窗口正则表达式是一种可以用于模式匹配的工具。简单的说,正则表达式就是一套规则,用于判定其他的元素是否符合它。 using System;using System.Text.RegularExpressions;namespace Example_Match{ /// /// Test 的摘要说明。 /// class Test { public void test() { string input = "zhangsan@sina.com"; //待匹配的输入串 string patten = @"[a-zA-Z]+@[a-zA-Z]+/.com$"; //正则表达式 Regex r = new Regex(patten); //声明一个Regex对象 Match m = r.Match(input); //使用Match方法进行匹配 if(m.Success) //循环输出所有的匹配子串 { Console.WriteLine(m.Value); } else { Console.WriteLine("Invalid Email Address!"); } } /// /// 应用程序的主入口点。 /// [STAThread] static void Main(string[] args) { Test t=new Test(); t.test(); } }} 流类(描述读写文件和数据流的类型)与那些用于管理计算机目录和文件的类一起位于System.IO命名空间中Directory公开用于创建、移动和枚举通过目录和子目录的静态方法。DirectoryInfo公开用于创建、移动和枚举目录和子目录的实例方法。File提供用于创建、复制、删除、移动和打开文件的静态方法 // Directory.CreateDirectory(@"e:/Test"); // File.CreateText(@"e:/Test/test.txt"); using (StreamWriter sw1 = new StreamWriter("e://Test//test.txt")) //using的作用实现对非托管代码的自动垃圾回收 { sw1.WriteLine("you can write here"); } StreamWriter sw = File.AppendText("e://Test//test.txt"); sw.WriteLine(DateTime.Now); sw.Close(); StreamReader sr = new StreamReader(@"e:/Test/test.txt", System.Text.Encoding.UTF8); String line; while ((line = sr.ReadLine()) != null) { Console.WriteLine(line); } sr.Close(); File.Copy(@"e:/Test/test.txt", @"e:/test1.txt"); File.Move(@"e:/Test/test.txt", @"e:/test2.txt"); 多线程进程(process)代表一个正在执行的应用程序,而线程(thread)则是进程内部,任何一段可执行的程序代码。 using System;using System.Threading;class Test{ static void Main() { Test test = new Test(); Thread.CurrentThread.Name = "Main"; Thread t1 = new Thread(new ThreadStart(test.doTask)); t1.Name = "sub 1"; Thread t2 = new Thread(new ThreadStart(test.doTask)); t2.Name = "sub 2"; //t1.Priority = ThreadPriority.Highest; //t2.Priority = ThreadPriority.Lowest; test.doTask();t1.Start();t2.Start(); } void doTask() { lock(this) for (int i = 0; i < 30; i++) { Console.WriteLine(Thread.CurrentThread.Name); } }}

原创粉丝点击