学习杂记1:c#,顺序泛型栈,泛型委托,Lambda,拓展方法

    最近又重新回过头来学习C#,才发现之前学习的知识有多么的浅显,有些东西还是挺难懂的,但是比较有意思,例如协变,逆变,不变就挺有意思,但是也挺绕,下面是学习过程中写的一些代码,有点乱,就当日记记叙一下。

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Genericity泛型
{

    //泛型委托
    public delegate R MyDelegate<T, R>(T t);

    class Program
    {

        static void Main(string[] args)
        {

            MyStack<int> stack = new MyStack<int>(5);
            var stack1 = new MyStack<string>(8);

            while(!stack.IsFull)
            {
                stack.Push(2);
            }
            while(!stack.IsEmpty)
            {
                stack.Pop();
            }

            MyDelegate<string, string> s;
            s = stack.PrintString;

            //Lambda表达式
            s += (string a) => { return a; };
            Console.WriteLine(s("safa"));

            Console.WriteLine("这个栈的长度为:{0}",stack.GetLength<int>());

            Console.ReadKey();
        }

    }
    //顺序栈,泛型
    public class MyStack<T>
    {
        T[] StackArray;
        public int Length;
        int StackPointer;

        public string PrintString(string a)
        {
            return a;
        }

        public bool IsEmpty
        {
            get
            {
                return StackPointer == 0 ? true : false;
            }
        }

        public bool IsFull
        {
            get
            {
                return StackPointer >= Length ? true : false;
            }
        }

        public MyStack(int _length)
        {
            Length = _length;
            StackArray = new T[Length];
            StackPointer = 0;
        }

        public void Push(T _value)
        {
            if (IsFull)
            {
                Console.WriteLine("栈已经满");
            }
            StackArray[StackPointer++] = _value;
        }

        public void Pop()
        {
            if (IsEmpty)
            {
                Console.WriteLine("栈已空");
            }
            Console.WriteLine(StackArray[--StackPointer]);
        }

        public void StackPrint()
        {
            foreach (var i in StackArray)
            {
                Console.WriteLine(i);
            }
        }
    }

    //拓展方法
    public static class ExtendStack
    {
        public static int GetLength<T>(this MyStack<T> ms)
        {
            return ms.Length;
        }
    }

}
时间: 2024-08-08 22:05:47

学习杂记1:c#,顺序泛型栈,泛型委托,Lambda,拓展方法的相关文章

泛型学习第四天——List泛型终结:什么是List泛型,泛型筛选,泛型排序

为什么要用泛型集合? 在C# 2.0之前,主要可以通过两种方式实现集合: a.使用ArrayList 直接将对象放入ArrayList,操作直观,但由于集合中的项是Object类型,因此每次使用都必须进行繁琐的类型转换. b.使用自定义集合类 比较常见的做法是从CollectionBase抽象类继承一个自定义类,通过对IList对象进行封装实现强类型集合.这种方式要求为每种集合类型写一个相应的自定义类,工作量较大.泛型集合的出现较好的解决了上述问题,只需一行代码便能创建指定类型的集合. 什么是泛

爪哇国新游记之十八----泛型栈类

import java.lang.reflect.Array; /** * 泛型栈 * * @param <T> */ public class Stack<T>{ private Class<T> type;// 栈元素所属的类 private int size;// 栈深度 private T[] arr;// 用数组存储 private int top;// 栈顶元素的下标 public Stack(Class<T> type,int size){ t

C++ Primer 学习笔记_83_模板与泛型编程 --一个泛型句柄类

模板与泛型编程 --一个泛型句柄类 引言: [小心地雷] 这个例子体现了C++相当复杂的语言应用,理解它需要很好地理解继承和模板.在熟悉了这些特性之后再研究这个例子也许会帮助.另一方面,这个例子还能很好地测试你对这些特性的理解程度. 前面示例的Sales_item和Query两个类的使用计数的实现是相同的.这类问题非常适合于泛型编程:可以定义类模板管理指针和进行使用计数.原本不相关的Sales_item类型和 Query类型,可通过使用该模板进行公共的使用计数工作而得以简化.至于是公开还是隐藏下

C#泛型,实现泛型栈

using System; using System.Collections.Generic; using System.Linq; using System.Text; /*泛型栈*/ namespace ExGeneric { class MyStack<T> { const int MaxStack = 10; T[] StackArrray; public MyStack() { StackArrray = new T[MaxStack]; } bool IsStackFull { g

编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]

前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊,它是对方法的引用.事件本身也是委托,它是委托组,C#中提供了关键字event来对事件进行特别区分.一旦我们开始编写稍微复杂的C#代码,就肯定离不开泛型.委托和事件.本章将针对这三个方面进行说明. 本文已更新至http://w

[A8 学习笔记] A8 启动顺序

其实标题不应该这么说,ARM公司并没有规定启动顺序,这完全是由IC厂商自己决定的.以我手上三星公司的S5pv210为例,并以三星公司的官方用户手册为准. S5PV210由64kB ROM和96kB SRAM作为内部存储器.在启动过程中,使用内部64kB ROM和内部96K SRAM.S5PV210从内部ROM启用安全启动,这保证了映像不能被未经授权的用户修改. 由以下几种启动设备可供选择: General NAND Flash memory OneNAND memory SD/ MMC memo

五分钟重温C#委托,匿名方法,Lambda,泛型委托,表达式树

五分钟重温C#委托,匿名方法,Lambda,泛型委托,表达式树 https://masuit.com/81 曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五分钟内看完这篇博客 第一分钟:委托 有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件.先上一段代码: 下边的代码,完成了一个委托应用的演示.一个委托分三个步骤: 1 2 3 4 5 6 7 8 9 10 11 12

泛型的其他应用-接口,方法定义使用,泛型数组,泛型的嵌套设置。

掌握泛型的接口的使用: 掌握泛型方法的定义与使用: 掌握泛型数组的使用: 掌握泛型的嵌套设置: 具体内容 1.1泛型接口基本概念 之前所有的操作都是在类中直接使用泛型操作的,那么,对于JAVA来说,也可以在接口中定义及使用泛型. 声明泛型接口: interface 接口名称<接口标示>{} interface Info<T> { public T getInfo(); } 如果现在一个子类实现此接口是没有进行正确的实现,则在编译时候会出现警告, 例子: interface Info

Scala 深入浅出实战经典 第42讲:scala 泛型类,泛型函数,泛型在spark中的广泛应用

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2 技术爱好者尤其是大数据爱好者 可以加DT大数据梦工厂的qq群 DT大数据梦工厂① :462923555 DT大数据梦工厂②:437123764 DT大数据梦工厂③