泛型<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 = ; i < Count; i++)
{
str += _arr[i];
if (i < Count - )
{
str += ", "; }
}
str += ")";
Console.WriteLine(str);
Console.ReadLine(); }
public void Add(T value)
{
_arr[_count] = value;
_count++;
}
public Array()
{
_arr = new T[];
}
private T[] _arr;
private int _count = ;
}
static void Main(string[] args)
{
//当具体需要使用的时候才需要确定实际的类型,可以将int改为其他类型
Array<int> arr = new Array<int>();
arr.Log();
arr.Add();
arr.Log();
arr.Add();
arr.Log();
}

ArrayList

arraylist 属于一种集合

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

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

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

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

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", );
dic.Add("hello", );
//删除键值对
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(); //尝试获取指定的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();
}

栈<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();
}

委托

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

定义委托需要用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();
}
}
}

事件

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();
}
}
}

C#学习笔记---基础入门(三)的更多相关文章

  1. VS2013中Python学习笔记[基础入门]

    前言 在上一节中简单的介绍了在VS2013中如何进行开发Hello World,在VS2013中进行搭建了环境http://www.cnblogs.com/aehyok/p/3986168.html. ...

  2. C#学习笔记---基础入门(一)

    C#中的变量: 一个变量就是存储区(内存)中的一个存储单元. 变量声明赋值:int money =1000;/int money;money=1000; 输出:console.writeLine(mo ...

  3. python学习笔记--Django入门三 Django 与数据库的交互:数据建模

    把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...

  4. C#学习笔记---基础入门(二)

    枚举 枚举是被命名的整型常数的集合:枚举类型的变量只有赋值后才能使用:不同枚举中的枚举值可以重名:可以自定义枚举值. enum Playstates {            跑, 跳,下滑,左转,右 ...

  5. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

  6. 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)

    注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...

  7. MongoDB学习笔记:快速入门

    MongoDB学习笔记:快速入门   一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...

  8. 【Unity Shaders】学习笔记——SurfaceShader(三)BasicDiffuse和HalfLambert

    [Unity Shaders]学习笔记——SurfaceShader(三)BasicDiffuse和HalfLambert 转载请注明出处:http://www.cnblogs.com/-867259 ...

  9. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

随机推荐

  1. hdu 4685 简单匹配+Tarjan算法

    思路:首先看到这题以为能用poj1904的模版直接A掉,WA了几次,然后又TLE了几次.还是想到了正解. 一开始我想的大致方向已经是对的了.先是由王子向每个喜欢的公主建边,再求一次最大匹配,找出匹配后 ...

  2. Emmet 语法大全(缩写语法/sublime 插件)

    Emmet 使用类似于 CSS 选择器的语法描述元素在生成的文档树中的位置及其属性. 元素 可以使用元素名(如 div 或者 p)来生成 HTML 标签.Emmet 没有预定义的有效元素名的集合,可以 ...

  3. Java Concurrency - ThreadLocal, 本地线程变量

    共享数据是多线程应用最常见的问题之一,但有时我们需要为每个线程保存一份独立的变量.Java API 提供了 ThreadLocal 来解决这个问题. 一个 ThreadLocal 作用的例子: imp ...

  4. C#保存上传来的图片示例代码

    保存上传图片的方法有很多,在接下来的文章中为大家详细介绍下使用C#是如何做到的,感兴趣的朋友不要错过 复制代码代码如下: [HttpPost]  public string UploadImage() ...

  5. .net 获取网站根目录总结

    一.获取网站根目录的方法有几种如: Server.MapPath(Request.ServerVariables["PATH_INFO"]) //页面详细路 Server.MapP ...

  6. (转载)Nim游戏博弈(收集完全版)

    Nim游戏的概述: 还记得这个游戏吗?给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取.最后拿光珍珠的人输.后来,在一份资料上看到,这种游戏称为“拈(Nim)”.据说,它源 ...

  7. Cocos2d-x数据持久化-查询数据

    数据查询一般会带有查询条件,这可以使用SQL语句的where子句实现,但是在程序中需要动态绑定参数给where子句.查询数据的具体操作步骤如下所示.(1) 使用sqlite3_open函数打开数据库. ...

  8. 实例介绍Cocos2d-x物理引擎:HelloPhysicsWorld

    我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用物理引擎的开发过程,熟悉这些API的使用.这个实例的运行后的场景,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的 ...

  9. ios开发入门篇(四):UIWebView结合UISearchBar的简单用法

     UIWebView是ios开发中比较常用的一个控件.我们可以用它来浏览网页.打开文档等,今天笔者在这里简单介绍下UIWebView和UISearchBar结合起来的用法,做一个简单的类浏览器. 一: ...

  10. C# ASPX.NET 文件(图片)下载

    最好使用aspx页面写: protected void Page_Load(object sender,EventArgs e) { if(!IsPostBack) { System.Io.FileS ...