本文章不适合入门,只适合有一定基础的人看。我更相信知识细节见高低,我是从4.0开始学的,终于有时间系统的学习C#5.0,是5.0中的知识,会特殊标记下。但写的内容也可能含有其他版本framework的知识,也是为了方便自己更好的记忆C#知识。文章内容都是自己总结,无抄袭,如果你觉得文章档次太低,请大牛绕道 --Aaronyang的博客(www.ayjs.net)

1. 泛型-是C#的泛型

1.1 性能方面比非泛型好点,比如拆箱装箱的问题。个人感觉代码可读性更好吧。还有就是 写代码可能可以写出很精彩的代码。命名用T开头,加有意义的单词,比如 Converter<TInput,TOut>,XX<TKey,TValue>

1.2 题目:不百度,请自己至少列举5个 例如List<T>使用泛型的C#中的常用对象

1.3 自己写个链式,并使用泛型知识的demo

1.定义链式节点, 前一个节点,后一个节点,再加上自己这个节点就OK了

   //定义链式节点, 前一个节点,后一个节点,再加上自己这个节点就OK了
public class MyLinkedNode<T> { public MyLinkedNode(T value){
this.Value = value;
}
public T Value{get;private set;} /// <summary>
/// 前一个节点对象
/// </summary>
public MyLinkedNode<T> Prev { get; internal set; }
/// <summary>
/// 后一个节点对象
/// </summary>
public MyLinkedNode<T> Next { get; internal set; } }

2.接下来,在封装一个对节点的操作的操作类,正好复习 迭代器yield和理解IEnumerable<T>这个接口,时间有限,这里我只先实现AddLast和GetEnumerator

 //接下来,因为链式结构,只适合从尾部和首部增加元素,中间不方便增加元素。所以对节点的操作的封装类,一般 首部增加一个节点AddFirst(),尾部增加一个节点AddEnd()
//移除一个节点RemoveFirst(),RemoveEnd(),这里我只先实现AddEnd和GetEnumerator
public class MyLinkedList<T> : IEnumerable<T>
{ /// <summary>
/// 默认 IEnumerable定义的,必须实现
/// </summary>
/// <returns></returns>
public IEnumerator<T> GetEnumerator()
{
//使用yield,把MyLinkedNode<T>返回到IEnumerator中去
MyLinkedNode<T> cur = First;
while (cur!=null) //如果下一个节点不为空
{
yield return cur.Value;
cur = cur.Next;//把当前值设置成下一个节点的值
}
} System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
} /// <summary>
/// 添加一个节点,默认都是从尾部增加的
/// </summary>
/// <param name="myLinkedNode">MyLinkedNode中类型的值</param>
/// <returns></returns>
public MyLinkedNode<T> AddEnd(T myLinkedNode)
{
MyLinkedNode<T> cur = new MyLinkedNode<T>(myLinkedNode);
if (First == null)
{
//如果该集合一个节点也没有,那么第一个和最后一个节点就等于当前节点
First = End = cur;
}
else {
//因为尾部新节点增加,原来上次的尾部的节点就变成了该节点的前一个节点了,他自己变成了最后一个节点
MyLinkedNode<T> prevEnd = End;
//更新新的最后一个元素
End.Prev = prevEnd;
End.Next = cur;
End = cur;
}
return cur;
} //在链式结构里面都有 第一个节点和最后一个节点的特殊节点
/// <summary>
/// MyLinkedList集合中第一个元素
/// </summary>
public MyLinkedNode<T> First { get; private set; }
/// <summary>
/// MyLinkedList集合中最后一个元素
/// </summary>
public MyLinkedNode<T> End { get; private set; } /// <summary>
/// 在开始的地方增加一个节点
/// </summary>
/// <param name="myLinkedNode">MyLinkedNode值</param>
/// <returns></returns>
public MyLinkedNode<T> AddFirst(T myLinkedNode)
{
throw new NotImplementedException();//自己实现
}
/// <summary>
/// 移除一个节点
/// </summary>
/// <param name="myLinkedNode">MyLinkedNode对象</param>
/// <returns></returns>
public MyLinkedNode<T> RemoveEnd(T myLinkedNode)
{
throw new NotImplementedException();//自己实现
} }

3.使用这个数据结构的集合

 class Program
{
static void Main(string[] args)
{
MyLinkedList<int> m = new MyLinkedList<int>();
m.AddEnd();
m.AddEnd();
m.AddEnd();
foreach (var item in m)
{
Console.WriteLine(item+",");
}
Console.ReadLine();
}
}

效果

整个过程来说,感觉还是挺有意义的,特别当泛型的概念融入其中,你的代码可能更精彩。

1.4 一些数据结构的类型,只是加深印象: Queue<T>,Dictionary<TKey, TValue>, ILookup(TKey, TElement) 等

1.5 泛型默认值初始化,举个例子      public T GetT(){ T t=default(T);  ...     }

1.6 泛型约束与继承:

public abstract class Class1<T> :TEnumerable<T>

public class DBManager<TDb> where TDb:ICommonDb,new()

Aaronyang拓展: where T:struct / class  / 接口  / new() 构造函数约束,指定类型T必须有一个默认构造函数 /  其他泛型,例如  where T1:T2

*1.7 静态成员:AaronYang讲解:只要记得 T 不一样,里面的静态成员的值是不共享的,也不会受影响。   专业术语:泛型类的静态成员只能在类的一个实例中共享

自己写了一个例子,一看就懂了

 class Program
{
static void Main(string[] args)
{
OwnStaticGeneric1<string>.obj = ;
OwnStaticGeneric1<int>.obj = ;
OwnStaticGeneric1<string>.obj = ;
OwnStaticGeneric1<int>.obj = ;
Console.WriteLine(OwnStaticGeneric1<string>.obj);// =>6
Console.WriteLine(OwnStaticGeneric1<int>.obj); // =>7 OwnStaticGeneric2<string>.obj = "";
OwnStaticGeneric2<int>.obj = ;
OwnStaticGeneric2<string>.obj = "";
OwnStaticGeneric2<int>.obj = ;
Console.WriteLine(OwnStaticGeneric1<string>.obj);// =>6
Console.WriteLine(OwnStaticGeneric1<int>.obj); // =>7 Console.ReadLine();
}
} public class OwnStaticGeneric1<T> {
public static int obj;
} public class OwnStaticGeneric2<T>
{
public static T obj;
}

1.8 高级知识: 泛型接口,感觉让你考架构师的样子

1.8.1  拓展一下 可能会使用的 跟 ref和out差不多性质的  in(in修饰的参数,在方法体内的过程不会改写in的参数的值)关键字用法。如果不太懂,可以百度,也可以看我下面的例子,但提前,你最好懂out,ref的基础用法。

有些人设计接口直接    IInterface<T1,T2>,其实也还有很奇妙的其他写法,用 in或者out或者ref 修饰泛型的场景

讲解: 一个SubClass类实现了ITestIn接口,out定义输出类型,in定义输入类型,必须是把值输入,所以莫名的 ITestIn<string,object> 一下子就懂了。还不懂的话,建议你百度

留个题目:如何 让用户写代码可以写出如下的效果,Student的值是不允许改变的,请设计接口

public class Student:ICustomComparable<Student>{

public int CompareTo(Student stu){

return ... ;

}

}

参考部分答案(答案字体被我设置成白色了,查看的,自己选择后面的空白部分): public interface ICustomComparable<in T>{     int    CompareTo(T stu);   }

1.8.2  其实上面的 in或者out修饰泛型,涉及到了泛型知识中的 协变(泛型参数被out修饰)与抗变(泛型参数被in修饰)的知识,不要太在意,会用就好!!!!!!oh! shit,抗英(国)

1.9 Nullable<T>      T必须是值类型,定义可为空,有兴趣的可以看看 public struct Nullable<T> where T:struct的实现

等同写法:       Nullable<int>    a   等同于  int? a

?? 的用法: 例如 int y=x ?? 0;   如果x为null,则等于0,否则就是原值。

1.10 当然泛型也可以像用在类上那样用于方法上,这个知识太简单,不讲了

1.11 泛型委托,Lambda表达式最多,典型的有比如Func  Action等,这些在LINQ里再讲

1.12 作为一年以上的开发人员,都知道的我都跳过了,可能存在疑问的地方保留了。

======安徽六安=========www.ayjs.net==========aaronyang========杨洋==================

[AaronYang]C#人爱学不学[4]的更多相关文章

  1. [AaronYang]C#人爱学不学[1]

    当前编写时间:2014年12月24日21:11:14   编写人:杨洋(Aaronyang) 新文章:[AaronYang]C#人爱学不学[1] 声明:->可以理解为 联想到,或者关联的意思. ...

  2. [AaronYang]C#人爱学不学[6]

    不要回头,不要将就,做到这两点,人生就会简单很多幸福很多 --Aaronyang的博客(www.ayjs.net)-www.8mi.me 1. 运算符,还有哪些你能学到? 1.1 不安全运算符: si ...

  3. [AaronYang]C#人爱学不学[3]

    本文章不适合入门,只适合有一定基础的人看.我更相信知识细节见高低,我是从4.0开始学的,终于有时间系统的学习C#5.0,是5.0中的知识,会特殊标记下.但写的内容也可能含有其他版本framework的 ...

  4. [AaronYang]C#人爱学不学8[事件和.net4.5的弱事件深入浅出]

    没有伟大的愿望,就没有伟大的天才--Aaronyang的博客(www.ayjs.net)-www.8mi.me 1. 事件-我的讲法 老师常告诉我,事件是特殊的委托,为委托提供了一种发布/订阅机制. ...

  5. [AaronYang]C#人爱学不学[5]

    这世上有三样东西是别人抢不走的:一是吃进胃里的食物,二是藏在心中的梦想,三是读进大脑的书 --Aaronyang的博客(www.ayjs.net) 1. 数组-的疑惑? 1.1  多维数组      ...

  6. [AaronYang]C#人爱学不学[7]

    做一个决定,并不难,难的是付诸行动,并且坚持到底 --Aaronyang的博客(www.ayjs.net)-www.8mi.me 1. 委托-我的总结 1.1 委托:面试我都会说,把方法当参数.委托包 ...

  7. [AaronYang]C#人爱学不学[2]

    1. 记事本写C#,脱离vs 新建记事本,名字为 helloworld.cs using System; namespace Hello{ public class HelloWorldSay{ st ...

  8. AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享

    原文:AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享 谢谢大家观看-AY的 VS2017推广系列 Live Unit Te ...

  9. AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享

    原文:AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享 谢谢大家观看-AY的 VS2017推广系列 Live Unit Te ...

随机推荐

  1. Memcache入门

    说来惭愧,第一次听说Memcache是在大约在6个月前.作为一个搞J2EE开发的,工作一年多了,都没听说过Memcache实在是惭愧. 当时是换了新工作,第一个任务是开发一个报表系统供公司内部使用.为 ...

  2. poj1125&zoj1082Stockbroker Grapevine(Floyd算法)

    Stockbroker Grapevine Time Limit: 1000MS Memory Limit: 10000K Description Stockbrokers are known to ...

  3. 动手学习TCP:4种定时器

    上一篇中介绍了TCP数据传输中涉及的一些基本知识点.本文让我们看看TCP中的4种定时器. TCP定时器 对于每个TCP连接,TCP管理4个不同的定时器,下面看看对4种定时器的简单介绍. 重传定时器使用 ...

  4. [转]Asp.NET MVC Widget开发 - ViewEngine

    本文转自:http://www.cnblogs.com/hsinlu/archive/2011/03/02/1968796.html 在Asp.NET开发博客类系统,我们经常都会用到Widget,像在 ...

  5. 车脸检测 Adaboost 检测过程

    上一节中我介绍了如何使用Opencv自带的opencv_traincascade.exe来做训练,接下来介绍如何使用训练生成的cascade.xml模型文件来检测车脸. 首先需要说明的是我这里的训练数 ...

  6. 如何对ZBrush中面部进行快速布线

    面部布线的最重要目的是为了表情动画.人物内心的各种不同的心里活动,主要是通过面部表情反映出来.而面部变化最丰富的地方是眼部(眉毛)和口 部,其他部位则相应的会受这两部分的影响而变化.对于面部表情,必须 ...

  7. HDU 4455 Substrings --递推+树状数组优化

    题意: 给一串数字,给q个查询,每次查询长度为w的所有子串中不同的数字个数之和为多少. 解法:先预处理出D[i]为: 每个值的左边和它相等的值的位置和它的位置的距离,如果左边没有与他相同的,设为n+8 ...

  8. 2014 Super Training #6 H Edward's Cola Plan --排序+二分

    原题: ZOJ 3676  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3676 题意:给每个朋友一瓶可乐,可乐有普通和高 ...

  9. velocity .vm

    关于.vm 后缀的文件,是velocity的文件.velocity是基于java的一种页面模板引擎,支持#if #else #foreach等写法的前台文件.$link.contextPath是该引擎 ...

  10. KeyBord事件分发和接收简要过程代码示例

    step1:调用ViewRootImpl的内部类ImeInputStage的成员函数onProcess来判断输入法是否处于激活状态 final class ImeInputStage extends ...