zoukankan      html  css  js  c++  java
  • C#学习笔记---基础入门(三)

    泛型<T>

    使用泛型能够最大限度的重用代码/保护类型安全,提高性能

    泛型成员因为类型的不确定性,不能使用算术运算符/比较运算符

    类型参数可以有多个,可以是编译器能够识别的任何类型

    类型参数的名字不能随便起,不能重名

     //使用泛型
           //数组类Array
           //泛型类-需要在类名前加上泛型类型
           //定义的时候需要用T泛型类型表示任意一种数据类型
           //T-Type,S/U/V 表示其他类型
           //K/V-key/value
           public class Array<T,S,U,V>
            {
                //索引器
                public T this[int index]
                {
                    set
                    {
                        _arr[index] = value;
                    }
                    get
                    {
                        return _arr[index];
                    }
                }
                public int Count
                {
                    get
                    {
                        return _count;
                    }
                }
                public void  Log()
                {
                    string str = "当前数组中包含" + Count + "个元素 (";
                    for (int i = 0; i < Count; i++)
                    {
                        str += _arr[i];
                        if (i < Count - 1)
                        {
                            str += ", ";
    
                        }
                    }
                    str += ")";
                    Console.WriteLine(str);
                    Console.ReadLine();
    
                }
                public void Add(T value)
                {
                    _arr[_count] = value;
                    _count++;
                }
                public Array()
                {
                    _arr = new T[100];
                }
                private T[] _arr;
                private int _count = 0;
            }
            static void Main(string[] args)
            {
                //当具体需要使用的时候才需要确定实际的类型,可以将int改为其他类型
                Array<int> arr = new Array<int>();
                arr.Log();
                arr.Add(2);
                arr.Log();
                arr.Add(34);
                arr.Log();
            }
    View Code

    ArrayList

    arraylist 属于一种集合

    集合是种容器,在程序中,使用集合管理相关对象组,集合分为非泛型集合和泛型集合

    ArrayList是一个特殊的数组,通过添加或者删除元素就可以动态改变数组长度

    可以灵活地插入/删除,访问元素,不是强类型,速度跟普通的数组比要慢。ArrayList存入的数据类型系统会默认为Object类型,因此接收元素需要强制转换。

     public static void Log(ArrayList arr)
            {
                string str = "当前数组中包含" + arr.Count + "个元素 (";
                for (int i = 0; i < arr.Count; i++)
                {
                    str += arr[i];
                    if (i < arr.Count - 1)
                    {
                        str += ", ";
    
                    }
                }
                str += ")";
                Console.WriteLine(str);
                Console.ReadLine();
            }
    
            public static void Main(string[] args)
            {
                //首先创建对象
                ArrayList arr = new ArrayList();
                Log(arr);
                //使用Add()方法添加元素,对元素类型没有限制
                arr.Add(17);
                arr.Add(4.5f);
                arr.Add("xiaoli");
                Log(arr);
    
                //使用下标获取指定位置的元素
                //获取当前数组中元素的数量
                int count = arr.Count;
                //使用insert方法向指定下标位置插入元素
                arr.Insert(1, "hello");
                Log(arr);
                //使用Remove方法从数组中删除指定元素
                arr.Remove(4.5f);
                Log(arr);
                //RemoveAt方法将指定下标位置删除
                arr.RemoveAt(0);
                Log(arr);
                //是否存在指定元素
                Console.WriteLine(arr.Contains("hello"));
                //清空整个数组
                arr.Clear();
                Log(arr);
            }
    View Code

    List

    List属于泛型集合,是一种强类型列表,其方法的使用与ArrayList相似。更推荐使用List类型,因为更安全。

    声明一个List对象:List<string> arr=new List<string>();//List 对元素类型有限制,一旦确定为某类型,就必须是某类型

    字典

    Dictionary是存储键和值的集合,属于泛型集合使用时需引入泛型集合命名空间

    Dictionary是无序的,键Key是唯一的

     public static void Main(string[] args)
            {
                //创建一个字典对象,key的类型是string,value的类型是int
                Dictionary<string, int> dic = new Dictionary<string, int>();
                //Add方法用来添加键值对
                dic.Add("laowang", 13);
                dic.Add("hello", 15);
                //删除键值对
                dic.Remove("hello");
                //清空
                dic.Clear();
    
                //获取当前字典中Key,value的个数
                int count = dic.Count;
                Console.WriteLine(count);
    
                //检查字典中是否包含指定的key
                bool b = dic.ContainsKey("xiaoming");
                //检查字典中是否包含指定的value
                bool c = dic.ContainsValue(13);
    
                //尝试获取指定的key所对应的value
                int s;
                bool bb = dic.TryGetValue("xiaoming", out s);
                //如果当前包含“xiaoming”这个key,则获取对应的value并保存在s中,bb=true
                //如果当前不包含“xiaomign”这个key,则s=null,bb=false
    
                //通过Key获取value
                int age = dic["laowang"];
                Console.WriteLine(age);
    
                Console.ReadLine();
            }
    View Code

    栈<stack>与队列<Queue>

    属于泛型集合。栈遵循后进先出原则

    队列遵循先进先出原则栈与队列根据需要容量自动添加

    栈与队列都允许重复元素

    public static void Main(string[] args)
            {
                //
                Stack<string> s = new Stack<string>();
                int count = s.Count;
                s.Clear();
                bool a = s.Contains("xiao");
                //将元素放入栈,使用Push方法
                s.Push("xiaomign");
                s.Push("helllo");
                s.Push("tian");
                //使用Pop方法把元素出栈,后进先出
    
                //队列 先进先出
                Queue<string> q = new Queue<string>();
                q.Clear();
                int cou = q.Count;
                bool d = q.Contains("xiaomign");
                //添加元素
                q.Enqueue("xiaomign");
                q.Enqueue("haha");
                q.Enqueue("lala");
                //取出元素
                string s1 = q.Dequeue();
                Console.WriteLine(s1);//输出xiaoming
                Console.ReadLine();
            }
    View Code

    委托

    委托是一种特殊的类型,用于引用方法

    定义委托需要用delegate关键字

    委托可以把方法当作参数来传递

    委托可以使用+-运算符合并/解绑委托

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Collections;
    
    namespace test2
    {
        class Program
        {
            //定义委托-访问修饰符 delegate 返回值类型 委托名(参数列表);
            public delegate void Something(string name);
            public class Student
            {
                //可以像普通类型一样当作方法参数传递
                public void Do(Something something)
                {
                    //可以像普通方法一样调用
                    //真正调用了方法A--方法回掉
                    something(name);
                }
                public Student(string name)
                {
                    this.name = name;
                }
                private string name;
            }
            public class Teacher
            {
                public void Hungry()
                {
                    Student s = new Student("laowang");
                    //创建委托变量
                    Something a = new Something(A);
                    Something b= new Something(B);
                    s.Do(a+b);//委托对象可以使用+,-来绑定解除委托
                }
                public void A(string name)
                {
                    Console.WriteLine("hello"+name);
                    Console.ReadLine();
                }
                public void B(string name)
                {
                    Console.WriteLine("你好" + name);
                    Console.ReadLine();
                }
            }
            public static void Main(string[] args)
            {
                Teacher t = new Teacher();
                t.Hungry();
            }
        }
    }
    View Code

    事件

    event和delegate的关系就好像是字段和属性的关系

    event会限制delegate不能够直接赋值操作,防止将委托替换掉,只能使用+=和-=来绑定或解除委托

    event还限定了delegate只能在定义的类中被调用

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Collections;
    
    namespace test2
    {
        class Program
        {
            
            public delegate void Something(string name);
            public class Student
            {
                //event就是delegate的“属性”
                public event Something something;
                public void Do()
                {               
                    something(name);
                }
                public Student(string name)
                {
                    this.name = name;
                }
                private string name;
            }
            public class Teacher
            {
                public void Hungry()
                {
                    Student s = new Student("laowang");
                    //使用事件后不能够直接赋值操作,防止将委托替换掉,只能使用+=和-=来绑定或解除委托             
                    s.something += new Something(A);
                    //使用事件后不能在Student外界调用委托-s.something("hello");
                    s.Do();
                }
                public void A(string name)
                {
                    Console.WriteLine("hello"+name);
                    Console.ReadLine();
                }
              
            }
            public static void Main(string[] args)
            {
                Teacher t = new Teacher();
                t.Hungry();
            }
        }
    }
    View Code
  • 相关阅读:
    css 定位
    css inline忽略宽和高
    css clear属性
    关系型数据库与nosql
    链接标签<a>的css定义规则
    1em=16px
    text-align的justify属性
    2393Cirno的完美算数教室 容斥
    bzoj4665小w的喜糖 dp+容斥
    bzoj4558[JLoi2016]方 容斥+count
  • 原文地址:https://www.cnblogs.com/qichun/p/6104289.html
Copyright © 2011-2022 走看看