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;