第七章 预算福和类型强制转换
7.1 运算符
可空类型和运算符?:int? a=null; bool? b=null;
空合并运算符(??):第一个操作数必须是可空类型或者引用类型;第二个操作数必须是与第一个操作数的类型相同,或者可以隐式转化为第一个操作数的类型。如果第一个数不是null ,表达式就等于第一个操作数的值。如果第一个数是null,则等于第二个操作数。
int? a=null;int? b=1; int?c=a??b; =>c=1;
7.2 类型的安全性
1,隐式转化
2,显示转换:int 转换为short,会将高位截掉,只剩下低位。101111=》111
第八章 委托、Lambda表达式和事件
索引:委托是寻址方法的.net版本。委托时类型安全的类。委托类不仅包含对方法的引用,也可以包含对多个方法的引用。
8.1委托
8.1.1 声明委托:public delegate void IntMehodInvoker (int x)
System.Delegate => System.MulticastDelegate => 委托实现。
8.1.2 使用委托:
Delegate string newdelegate()
Int x=40;
Newdelegate d1=new newdelegate(x.Tostring);
Console.WirteLine(“this is {0}” d1());
8.1.4 Action<T> 和Func<T>委托,如果不使用自定义委托类型,可以用这两个。
委托都是多播委托,可以调用多个方法。方法之间的调用顺序没有固定。一个方法出现异常,其他方法可能不调用。
匿名方法:
Func<string, string> anonDel = delegate(string param)
{
param += mid;
param += " and this was added to the string.";
return param;
};
Console.WriteLine(anonDel("Start of string"));
8.2 Lambda 表达式 : 方法=》匿名方法=》Lambda表达式(传入参数执行方法)
8.3 事件 delegate=> EventHandle<TEventArgs>
声明:event EventHandler<abcArgs> abcArgsInfo;
强事件模式可能导致内存泄露,可以使用弱事件管理器。
第九章 字符串和正则表达式
简单表达式:
限定符:
限定符 |
意义 |
模式 |
输入(匹配) |
* |
{0,}前面1字符出现0或者多次 |
fo* |
F Fo foo food funny puffy |
+ |
{1,}前面1字符出现1或者多次 |
fo+ |
Fo foo foot forget |
? |
{0,1}前面1字符出现0或1次 可以强制模式或者子模式匹配数目最少的字符。 |
Fo? |
Fo f foot funny puffy |
{} |
表示模式出现的次数的上下限。 |
Ab{2},Ab{2,3} |
Abb abbc abbb |
^ |
1,搜索字符开始位置 2,在括号前,会对字符集求反。 |
^\d{3} 匹配字符串开始的3个数字 |
|
$ |
匹配文本的结尾 |
X$ |
X,只能是文本中的最后一个字符。 |
. |
出换行符意外的所有单个字符 |
I.ation |
Iaation ization |
\s |
匹配任何空白字符 |
[space]a, \ta, \na |
|
\S |
任何不是空白的字符 |
\SF |
aF,rF,Cf 非\tF |
\b |
字边界 |
||
\B |
不适子边界的任意位置 |
\BX\B |
非首尾的X |
[] |
内含要替换的字符 |
[a|b],[a-e],[0-9]+ |
|
?: |
表示不保持改组 |
(?::) |
|
()? |
表示是可选的。 |
第十章 集合
10.1 集合接口和类型
集合可以根据集合类实现的接口组合为列表、集合和字典。
接口:
IEnumerable<T> :实现方法 GetEnumerable() 返回IEumerator接口的枚举。
ICollection<T> 实现 Count 属性 把集合复制到数组中的(CopyTo()方法),还可以从结婚中添加和删除元素:Add(),Remove(),Clear().
IList<T>:定义了索引器,可以再特定位置插入或者删除某些项。派生自ICollection<T>
ISet<T>:允许合并不同的集。获得2个集的交集。检查2个集是否重叠。ISet<T>结婚接口派生自ICollection<T>.
IDictionary<TKey,TValue>:接口饱和键和值的泛型集合类实现。使用这个接口可以使用键类型的所引起访问某些项。
ILookup<TKey,Tvalue>: 实现集合有键和值,且可以通过一个键包含多个值。
IComparer<T>:接口IComparer<T>通过Compare()方法给结合中的元素排序。
IProducerConsumerCollection<T>: IProducerConsumerCollection<T>接口是.net 4 新增的。
第十一章 LINQ
11.1 LINQ 概述
11.1.2Linq查询
var query = from r in Formula1.GetChampions()
where r.Country == "Brazil"
orderby r.Wins descending
select r;
foreach (var item in query)
{
Console.WriteLine("{0:A}", item);
}
查询表达式以From子句开头,以select或group子句结束。在这2个子句之间,可以使用where、orderby、join、let和其他from子句。
11.1.3 扩展方法
Linq为IEnumerable<T>接口提供了各种扩展方法,以便用户在实现了改接口的任意集合上使用Linq查询。
调用扩展方法只是调用静态方法的新语法。
11.2 标准的查询操作符
标准查询操作符 |
说明 |
Where OfType<TResult> |
筛选操作 符定义了返回元素的条件。在Where查询操作符中,可以使用谓词,来返回布尔值。OfType<TResult>根据类型来筛选元素,只返回TResult类型的元素。 |
Select和SelectMany |
|
不是所有的查询都能用Linq完成。也不是所有的扩展方法都映射到Linq查询子句上。
11.2.2用索引筛选
其中不能用Linq的是Where()方法的重载。
11.2.3 类型筛选
OfType方法: var query=data.OfType<string>();
Foreach(var s in query){ Console.WriteLine(s);}
11.2.4复合的from子句
var query = Formula1.GetChampions().SelectMany(r => r.Cars, (r, c) => new { Racer = r, Car = c }).Where(r => r.Car == "Ferrari")
.OrderBy(r => r.Racer.LastName)
.Select(r => r.Racer.FirstName + " " + r.Racer.LastName);
11.2.5排序
11.2.6 分组
对查询结果分组,可以用group子句。
var query = from r in Formula1.GetChampions()
group r by r.Country into g
orderby g.Count() descending, g.Key
where g.Count() >= 2
select new
{
Country = g.Key,
Count = g.Count()
};
11.2.7 对嵌套的对象分组
11.2.8 连接
var racers = from r in Formula1.GetChampions()
from y in r.Years
where y>2003
select new
{
Year=y,
Name=r.FirstName+" "+r.LastName
};
var teams = from t in Formula1.GetContructorchampions()
from y in t.Years
where y > 2003
select new { Year=y,Name=t.Name };
var racersAndTeams = from r in racers
join t in teams on r.Year equals t.Year
select new {Year=r.Year,Racer=r.Name,Team=t.Name };
11.3 并行Linq cancellationtoken
11.4 表达式树
扩展方法可以讲一个委托类型作为参数,
“”.PadLeft(indent,’>’) 根据数字大小,生成不同的个数字符。
Expression<Func<Racer,bool>> expression= r=>r.Country==”Brazil”&& r.Wins>6;
11.5 Linq 提供程序
第12章 动态语言扩展
Include :Dynamic Language Runtime,dynamic type,dlr Scriptruntime dynamicObject,ExpandoObject.
12.1 DLR
位于System.Dynamic 命名空间和System.Runtime.Complier-Services
12.2 dynamic 类型
static void Main(string[] args)
{
var staticperson = new Person();
dynamic dynamicPerson = new Person();
staticperson.GetFullName("dfs", "fgwer");
//can’t compile successfully
dynamicPerson.GetFullName("sdfwe", "gwe");
//compile successfully,but will get a exception when run it.
}
}
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string GetFullName()
{ return FirstName + " " + LastName; }
}
The different between var and dynamic :when use var ,the type of the object was determine later.but if the type of the object is determined ,you can’t change the type.
Different from var,dynamic object ‘s type can be change,and can be changed for several times.
There are two limits to dynamic. 1,dynamic object can’t use extend method.2,anonymity function can’t to be used as the parameters in dynamic object’s method.
12.3 包含DLR ScriptRuntime
用来执行某种语言的脚本
12.4 DynamicObject 和 ExpandoObject
You can create your dynamic object for yourself. There are two method,