Microsoft Step byStep笔记

posted at 2017.5.24 20:24 by 风信子

1C#  free format语言,保留77+15个标识符identifierabstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface interal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual void volatile while + dynamic from get group into join let orderby partial select set value var where yield)。一般采用camelCase记号法。

 

2Public的标识符应该以大写字母开头,非public的标识符(其中包括局部变量)应该以小写字母开头。例外:类名以大写字母开头,所以,一个private构造器也以大写字母开头。方法名的命名规则与变量名相同,应以动词开头,不支持全局方法。

 

3var关键字指示编译器根据用于初始化变量的表达式来推断变量的类型。也可以声明匿名类,匿名类只能包含public字段,字段必须全部初始化,在可以有static字段,而且不能在其中指定任何方法。

 

4Class 引用类型,存储在heap

Struc 值类型,存储在stack上。结构隐式密封,不能派生。

 

5、工具方法或者实用方法(utility method),它们通常提供一个有用的功能,这个独立于任何具体的类实例。如Math.sqrt()  Math.Sin()。在C#中,所有的方法都必须在一个类的内部声明。如果把一个方法或字段声明为static,就可以使用类名来调用方法或访问字段。在Static方法,也称类方法中,不能访问类中的任何实例字段,相反,只能访问static字段,此外,只能直接调用类中的其他static方法。

 

6、非static的方法(即实例方法)要求先创建一个对象,然后才能在那个对象上调用那些方法。

 

7Abstract明确声明不允许创建某个实例。

Interface引入一个方法的名称。包含方法的签名、属性和索引器。

Virtual方法是方法的第一个实现。

Override方法是方法的另一个实现。

Sealed方法则是方法的最后一个实现。

 

8、关于参数,为了指定一个参数是可选的,可以在定义方法时为该参数提供一个默认值。“参数名:值”为命名参数,利用命名参数,实参可以按任意顺序传递,还允许你省略实参。

 

9Reftout修饰符除了能应用于值类型的的参数,还能应用于引用类型的参数,效果是一样的。参数将成为实参的一个别名。让参数引用一个新构造的对象,实际就是重新对实参进行赋值,让它改为引用那个对象。

 

10Params一维数组参数的修饰符。

 

11、“栈”(stack)和“堆”(heap)这两个词来源于“运行时”(rentime)对内存进行组织的方式。栈内存就象一系列堆得越来越高的箱子。堆内存则象散布在房间里的一大堆箱子,每个箱子都有一个标签,标记是否在用。所有的值类型都是在栈上创建的,所有引用类型(对象)都是在堆上创建的(虽然引用本身还是在栈上)。

 

12、引用类型:类、string、可空类型

 

14、对一个值进行装箱:将值赋给object类型的变量。如:object o = 42 。对一个值进行拆箱:将引用了装箱值的object引用强制转换成值类型。如:int i = (int) o 。拆箱时,必须进行一次强制类型转换(cast),使用is(是否合法)as(是否为null)

 

15new操作是一个“原子级”的操作,可以理解为“一步到位”。

 

16、属性,构造一个对象时,在一对{}中以列表的形式指定属性及其值,如:

Triangle tri3 = new Triangle { Side2Length = 12 ,Side3Length = 17};

 

17、索引器(indexer)视为一种智能数组,属性可以视为一种智能字段,。索引器可以使用非数值下标,而数组只能使用整数下标。索引器可以重载(这和方法相似),而数组不能。如:

Struct Wrapper{ private int[] data; … public int this [int i]{get{return this.data[i];set{this.data[i]=value;} }

Wrapper wrap = new Wrapper();

Int[] myData = new int[2];

myData[0] = wrap[0];

myData[1] = wrap[1];

myData[0] ++;

myData[1] ++;    //不影响Wrapper对象中的数据

wrap[0]++;     //修改Wrapper对象中的数据

 

18、接口,可以真正地将“what”(有什么可做)和“how”(如何做)区分开。接口中的所有方法都隐式地为public方法,接口应该在基类之后列出。显式实现接口后,只能通过创建到接口的一个引用,才能使用接口定义的方法。示例:

interface ILandBound{int NumberOfLegs();}

interface IJourney{int NumberOfLegs();}

class Horse : IlandBound,Ijourney{…  int IlandBound.NumberOfLegs(){return 4;}

                               int Ijourney.int NumberOfLegs(){return 4;}  }

Horse horse = new Horse();

IJourney journeyHouse = horse;

Int legsInJourney = journeyHorse.NumberOfLegs();

IlandBound landBoundHorse = horse;

Int legsOnHorse =landBoundHorse.NumberOfLegs();

 

19、委托(delegate)是指向一个方法的指针,可动态地更改一个委托引用的方法(与委托

的签名匹配)。一个控制系统厂商一般提供一套API,生产者可以利用这些API来再开发。

 

20API指“应用程序编程接口”(Application Programming Interface,它代表由软件公开的

一个或一组方法,可以将.NETramework想象成一套强大功能丰富的API。利用它提供的方

法,可以控制.NET公共语言运行时(Common Language Runtime,CLR)和Microsoft Windows

操作系统。

 

21、对于有参数的方法,通常创建一个适配器(adapt,即无参数方法),供委托调用。适配

器可以使用lambda(λ)表达式,lambda表达式只包含其中的两个元素:参数列表和方法主

体。

this.stopMachinery += ( () => {folder.StopFolding(0); });

this.stopMachinery += ( () => folder.StopFolding(0) );

this.stopMachinery += delegate {folder.StopFolding(0); };     //c#2.0 使用匿名方法也可以,但不如lambda表达式灵活

 

22、泛型(generic)的宗旨是避免进行强制类型转换,增强类型安全性,减少装箱量,并更

轻松地创建泛化的类和方法。泛型类(generic)有别于泛化类(generalized class),可以想

象泛型类定义了一个模板。实例:

   public abstract class BusinessBase<TYPE, KEY> : IDataErrorInfo, 

INotifyPropertyChanged, IChangeTracking, 

IDisposable where TYPE : BusinessBase<TYPE, KEY>, new()

 

23、二叉树(binary tree)是一种有用的数据结构,它是一种递归(自引用)式数据结构,

它要么为空,要么包含3个元素,即节点以及两个子树(本身也是二叉树);两个子树通常

称为左子树和右子树,子树要么为空,要么包含一个节点和另外两个子树。从理论上说,整

个结构可以无限地继续下去。使用泛型构造二叉树:

public class Tree<TItem> where TItem : IComparable<TItem>

    { public Tree(TItem nodeValue) {this.NodeData = nodeValue;

                                       this.LeftTree = null;this.RightTree = null;}

      public void Insert(TItem newItem){ TItem currentNodeValue = this.NodeData;

            if (currentNodeValue.CompareTo(newItem) > 0){

                if (this.LeftTree == null){this.LeftTree = new Tree<TItem>(newItem);}

                else{this.LeftTree.Insert(newItem); }  }

            else{if (this.RightTree == null){this.RightTree = new Tree<TItem>(newItem);}

                 else{this.RightTree.Insert(newItem); }  }   } 

      public void WalkTree(){

            if (this.LeftTree != null){this.LeftTree.WalkTree(); }

            Console.WriteLine(this.NodeData.ToString());

            if (this.RightTree != null){this.RightTree.WalkTree(); }  }

        public TItem NodeData { get; set; }

        public Tree<TItem> LeftTree { get; set; }

        public Tree<TItem> RightTree { get; set; }   }

 

24、泛型方法(generic method)允许采取和定义泛型类时相似的方式,用一个类型参数来

指定参数和返回类型。经常与泛型联合使用。

 

25、泛型接口为不变量(invariant),如Iwapper<T>,不能将一个Iwrapper<A>对象赋给

Iwrapper<B>类型的一个引用,即使类型A派生自类型B

 

26、协变性(Covariance如果泛型接口中的方法能返回字符串,它们就能返回对象,使用

out修饰符。逆变性(Contravariance)如果泛型接口中的方法能获取对象参数,它们也能获

取字符串参数。只有接口和委托类型能声明协变量或逆变性,不能为泛型类使用inout

修饰符。实际应用如List<T>泛型集合类使用IComparer<T>对象实现SortBinarySearch

法。

 

27、枚举器(enumerator),可想象成指向一个列表中的元素的指针。

 

28、迭代器(iterator)是能生成(yield)已排序值序列的一个代码块。迭代器只是对枚举序

列的一个描述。yield关键字指定了每一次迭代要返回的值----这样想象,他临时将方法“叫

停”,将一个值传回调用者,当调用者需要下一个时,GetEnumerator方法就从上次暂停的地

方继续,生成下一个值,最终,所有数据都会耗尽,循环结束,方法终止,迭代过程结束。

用迭代器实现一个枚举器:IEnumerator<TItem> GetEnumerator(){ for (…)  yield return …  }

 

29、语言集成查询LINQLanguage Integrated Query)要求数据存储在实现了IEnumerable

接口的一个数据结构中,数据结构可以是数组、HashTableQueue或者其他任何集合类型

(包括自定义的),唯一的要求是这种类型是“可枚举的”的。有select Where OrderBy

GroupBy Join ToList ToArray方法,有from select orderby groupby join查询操作符。

 

          

Tags:

IT技术

添加评论

  Country flag

biuquote
  • 评论
  • 在线预览
Loading