DotNet Collection

好像是一个家伙说他学习了设计模式以后,就如同得到了一个Hammer,看到哪里都是nail

AcceptButton----------------------------窗体默认回车按钮

CancleButton----------------------------窗体默认退出按钮

StartPosition---------------------------窗体开始位置(CenterScreen)

BackGroundImage-------------------------

BackGroundImageLayout-------------------图像是否平铺.拉伸

this.textBox1.BackColor = Color.FromArgb(13,104,219);

控件的属性:Dock-->选择"fill"铺满整个窗体

窗体的位置为(180,150)的位置看起来不错,但是要将 startPosition 设置为

Manual后才起作用,(windowsDefaultLocation无效)

formClosed------------------------------窗体的打叉(关闭)事件:注意,这里好像也需要设置一个属性,否则事件好像也不好使

是KeyPreview!!!必须设为true

注意哟:例如,

i=0;

i=i++;和i=++i;

是不一样滴,如果循环100次的话,前者总是0,后者才递增!体会到了++运算符了吗?

C#先调用父类的构造函数,再调用自己的构造函数

有关接口:

接口成员的定义与类成员的定义相似,但有几个重要的区别:

.不允许使用访问修饰符(public,private.protected或internal),所有接口成员都是公共的

.接口成员不能包含代码体.

.接口不能定义字段成员

.接口成员不能用关键字 static.virtual,abstract或sealed来定义.

.类型定义成员是禁止的.

接口不能定义字段成员.

但是可以定义属性如

interface IMyInterface

{

int MyInt

{

get;

set;

}

}

注意,接口没有指定属性应如何存储,接口不能指定字段,例如用于存储属性数据的字段.

此外,接口成员还可以在基类上实现,例如:

public interface IMyInterface

{

  void DoSomething();

  void DoSomethingElse();

}

public class MyBaseClass

{

  public void DoSomething()

  {

  }

}

public class MyDerivedClass:MyBaseClass,IMyInterface

{

  public void DoSomethingElse()

  {

  }

}

继承一个实现给定接口的基类,意味着派生类隐式地支持这个接口,例如:

public interface IMyInterface

{

void DoSomething();

void DoSomethingElse();

}

public class MyBaseClass:IMyInterface

{

public virtual void DoSomething()

{

}

public virtual void DoSomethingElse()

{

}

}

public class MyDerivedClass:MyBaseClass

{

public override void DoSomething()

{

}

}

如上所述,在基类中把执行代码定义为虚拟,派生类就可以替换该执行代码,而不是隐藏它们.如果要使用new关键字隐藏一个基类成员,而不是重写它,则方法IMyInterface.DoSomething()就总是引用基类版本,即使派生类通过这个接口来访问,也是这样.

显式执行接口成员:

接口成员民可以由类显式地执行,如果这么做,该成员就只能通过接口来访问,不能通过类来访问.上一节的代码中使用隐式成员可以通过类和接口来访问.

   例如,如果类MyClass隐式执行接口IMyInterface的方法DoSomething(),如上所述,则下面的代码就是有效的:

MyClass myobj=new MyClass();

myObj.DoSomething();

即:

MyClass myObj=new MyClass();

IMyInterface myInt=myObj;

myInt.DoSomething();

另外,如果MyDerivedClass显式实现DoSomething(),就只能使用后一种技术.其代码如下:

public class MyClass:IMyInterface

{

void IMyInterface.DoSomething()

{}

public void DoSometingElse()

{}

}

其中DoSomething()是显式执行的,而DoSomethingElse()是隐式执行的.只有后者可以直接通过MyClass的对象实例来访问.

Char.IsDigit('3');

基类的private成员,是不会被子类继承的!protect类型的可以被子类继承,还可被重重继承下去..

Anamal anamal=new Anamal();

anamal=new Cow();

anamal.EatFood();//可能通过基类调用cow的方法,执行的是cow中定义的(已经override了基类的EatFood方法)方法;

但是现在anamal还不能这样调用cow中特有的方法;

需要如下转换

Cow newCow=(cow)anamal;

newCow.Moo();

((cow)anamal).Moo();

注意并不是只有共享同一个父类的类才能利用多态性.只要子类和孙子类在继承层次结构中有一个相同的类,它们就可以用相同的方式利用多态性.

继承类(子类)继承自抽象基类的情况:要注意

实现基类中的抽象方法 一定要在方法前面加override!

官方定义是这样的:

abstract--方法必须在非抽象的派生类中重写(只用于抽象类中).

否则编译不通过

override出现在类中的方法前应该这样解释:方法重写了一个基类方法(如果方法被重写,就必须使用该关键字

extern--方法定义放在别的地方

使用new 隐藏基类的方法时,多态时调用的还是基类的方法(不同于override)

而且呀,不加new时,在子类中写一个与基类方法一样的方法时,在利用多态调用时,调用的还是基类的方法.

以此推断,加不加new都行,只是加了new 没有警告了.

补:上面提到的多态调用像下面:

BaseClass baseClass;

baseClass=new DerivedClass();{子类内含和基类一样名称的方法,如Do();)

baseClass.Do();

可以使用关键字virtual或abstract来执行接口成员,但不能使用static或const.接口成员还可以在基类上实现:

public interface IMyInterface

{

void DoSomething();

void DoSomethingElse();

}

public class BaseClass

{

   public void DoSomething(){}

}

public class DerivedClass:BaseClass,IMyInterface

{

  public void DoSomethingElse(){}

}

即,一个类中具有接口规定的所有方法了,就可以看 来现了这个接口了,并非一定要在这个类中实现所有的方法,当然可以继承而来呀!

另:继承一个实现了指定接口的基类,就意味着派生类隐式地支持这个接口.

我现在还是不明白显式执行接口成员有啥用?!(16:02 2010-3-20)呆会Google一下

(用非公共的可访问性添加属性访问器 page 226,体会一下,这小技巧有啥用处呀)

如果要迭代一个类,可使用方法GetEnumerator(),其返回类型是IEnumerator.

如果要迭代一个类成员,例如一个方法,则使用IEnumerable

下面是一个简单的示例:

public static IEnumerable SimpleList()

{

    yield return "string 1";

    yield return "string 2";

    yield return "string 3";

}

public static void Main()

{

   foreach(string item in SimpleList())

       Console.WriteLine(item);

   console.ReadKey();

}

Math.floor和Math.ceil 截断数字的两个函数 

/** 

  *这两个函数的主要任务是截掉小数以后的位数. 

  *区别是: floor()总是把数字变得越来越小,而ceil()总是把数字变大。 

  *其实名字可以理解floor()是地板,ceil()是天花板。 

**/ 

public Prime():this(2,100)

{

   //注意,不能在这里调用Prime(2,100),这种写法是不对的,上面的写法才是正确的

}

IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象.(必须实现CompareTo(object obj)

IComparer   在一个单独的类中实现,可以比较任意两个对象.(必须实现Compare(object x,object y)

一般情况下,我们使用IComparable给出类的默认比较代码,使用其他类给出非默认的比较代码.

如果不用List<Animal> animalCollection=new List<Animal>();

还可以用

public class Animals:List<Animal>

{

}

这么做的优点是,还可以在合适时给Animal类添加额外的成员

??运算符允许提供可空类型是null和不是null时的默认值,其用法如下:

int? op1=null;

int result=op1*2??5;

在这个救命中,op1是null,所以op1*2也是null.但是,??去处符检测到这个情况,并把值5赋予result.这里特别要注意,在结果中放入int类型的变量result 不需要显式转换.??运算符会自动处理这个转换.可以把??等式的结果放在int?中:

int? result=op1*2??5;

在处理可空变量时,??去处符有许多用途,它也是提供默认值的一种最方便方式,不压根使用if结构中的代码块.

对于函数的参数是接口类型的可以这样理解:除了接口对象,(其实主要还是)和实现了该接口的类都可以.

(list[i] as peopel).age  //此as 运算符,真是运算符呀,和+-*/一样!!

Comparison<T>:这个委托类型用于排序方法,其签名是int method(T objectA,T objectB).

Predicate<T>:这个委托类型用于搜索方法,其签名是bool method(T targetObject).

范型中,约束必须出现在继承说明符的后面:

class MyClass<T1,T2>:MyBaseClass,IMyInterface

 where  T1:constraint1 where T2:constraint2

{

}

C#经典的一处错误

    public class Defaulter<T>

    {

        public T GetDefulter<T>()

        {

            return default(T);

        }

    }

这段是可以编译的,书曰:内部的范型方法不能再用T,需要改U或其他.其实这是可以编译的,还有其他什么I没理解的,book是要说明什么?

控制台退出:System.Environment.Exit(int)

如果基类有带参数的构造函数如下:public Car(string newBrand, string newEngine)

子类对于这个构造函数是不能继承的,必须自己写一个public BMW(string newBrand, string newEngine)

否则new BMW()是没有提示的!,也就是说构造函数是不能继承的

通过接口当然也可以引用接口规定的属性喽

一些可用的范型约束:

struct:类型必须是值类型

class:类型必须是引用类型

baseclass:类型必须是基类或继承自基类

interface:类型必须是接口或实现了接口

new():类型必须有一个公共的无参构造函数

注意:如果new()用作约束,必须是为类型指定的最后一个约束.

可以把一个类型参数用作另一个类型参数的约束,如下所示:

class MyGenericClass<T1,T2> where T2:T1

{

}

其中,T2 必须与T1的类型相同,或者继承自T1.这称为裸类型约束(naked type constraint),表示一个泛型类型参数用作另一个类型参数的约束.

类型约束不能循环,例如:

class MyGenericClass<T1,T2> where T2:T1 where T1:T2

{

   //这段代码不能编译.

}

我还就没想明白,为啥继承自IEnumerable<T>还必须带T的呢,普通的不就行吗?

public class Farm<T>:Ienumerable<T> where T:Animal

{

//有啥用呀

}

发现一个问题

%号不是取余(模)吗?

那3%12为什么等于3?应该的吗?程序上是这种结果..这玩艺真出科我意料,我还以为得0

这是一个泛型方法的调用:

int myDefaultInt=GetDefault<T>();

在调用该方法时提供了类型参数T.

注意,这个T与用于给类提供泛型类型参数的类型完全不同.实际上,泛型方法可以通过非泛型类来实现:

public class Defaulter

{

public T GetDefault<T>()

{

return default(T);

}

}

但如果类是泛型的,就必须为泛型方法类型使用不同的标识符.下面的代码不会编译(事实证明是可以的!!!!!!!!!!!)

public class Defaulter<T>

{

public T GetDefault<T>()

{

return default(T);

}

}

必须重命名演绎法在使用的T.(这句当然也是错的)

泛型方法参数可以以与类相同的方式使用约束,在引可以使用任意类类型参数,例如

public class Defaulter<T1>

{

public T2 GetDefault<T2>() where T2:T1

{

return default(T2);

}

}

其中,为方法提供的类型T2必须与类提供的T1相同,或者继承自T1.这是约束泛型方法的常用方式.

定义委托

public delegate int MyDelegate(int op1,int op2);

要定义泛型委托,只需声明和使用一个或多个泛型类型参数:

public delegate T1 MyDelegate<T1,T2>(T2 op1,T2 op2) where T1:T2;

asp.net--------------------------------------------------------------------------

在结果.aspx文件的page指令下面添加PreviousPageType指令:

<%@ PreviousPageType VirtualPath="~/Default.aspx"%>

这样,在结果页的pageload(.etc)里就可以调用在前一页中定义的结构属性呀,.etc

autoSizeColumnMode:Fill---------设置每一行长度为填满整个DataGridView宽度

要给窗体类(etc)添加一个全局变量,最好(?)的办法就是在所有函数外部(当然了!)

也就是最顶部声明一个 如:

public static string hahah;

posted @ 2011-10-12 06:57  Traveling light  阅读(174)  评论(0编辑  收藏  举报