这篇主要讲C#的一些语法。

1、委托

委托类型声明的格式如下:

public delegate void TestDelegate(string message);

delegate 关键字用于声明一个引用类型,该引用类型可用于封装命名方法或匿名方法。委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。有关委托的应用,请参见委托泛型委托

委托是事件的基础。

通过将委托与命名方法或匿名方法关联,可以实例化委托。有关更多信息,请参见命名方法匿名方法

为了与命名方法一起使用,委托必须用具有可接受签名的方法进行实例化。有关方法签名中允许的方差度的更多信息,请参见委托中的协变和逆变。为了与匿名方法一起使用,委托和与之关联的代码必须一起声明。本节讨论这两种实例化委托的方法。

using System;
// Declare delegate -- defines required signature:
delegate void SampleDelegate(string message); class MainClass
{
// Regular method that matches signature:
static void SampleDelegateMethod(string message)
{
Console.WriteLine(message);
} static void Main()
{
// Instantiate delegate with named method:
SampleDelegate d1 = SampleDelegateMethod;
// Instantiate delegate with anonymous method:
SampleDelegate d2 = delegate(string message)
{
Console.WriteLine(message);
}; // Invoke delegate d1:
d1("Hello");
// Invoke delegate d2:
d2(" World");
}
}

2、集合类

ArrayList

大小可按需动态增加的数组。

Capacity是指ArrayList的容量,默认大小是4,当Capacity不够时会申请更多空间,改变之后的Capacity是原来的2倍。

Count是指当前ArrayList中元素的个数。Count小于或等于Capacity。使用TrimToSizie()可以使Count和Capacity相等。

ToArray方法返回元素的数组,其中ToArray(Type)可以返回Type类型的数组,返回类型都是System.Array。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
ArrayList al = new ArrayList();
Console.WriteLine(al.Capacity);
Console.WriteLine(al.Count);
al.Add(100);            //单个添加
Console.WriteLine(al.Capacity);
Console.WriteLine(al.Count);
 
foreach (Int32 number in new Int32[6] { 9, 3, 7, 2, 4, 8 })
{
    al.Add(number);    //集体添加方法一
}
 
Int32[] number2 = new Int32[2] { 11, 12 };
al.AddRange(number2);    //集体添加方法二
al.Remove(3);            //移除值为3的
al.RemoveAt(3);          //移除第3个
ArrayList al2 = new ArrayList(al.GetRange(1, 3));
//新ArrayList只取旧ArrayList一部份
 
Console.WriteLine("遍历方法一:");
foreach (Int32 i in al)       //不要强制转换
{
     Console.WriteLine(i);  //遍历方法一
}
 
Console.WriteLine("遍历方法二:");
for (Int32 i = 0; i < al2.Count; i++)  //数组是length,ArrayList为Count
{
    Int32 number = (Int32)al2[i];        //一定要强制转换
   Console.WriteLine(number);       //遍历方法二
}
 
Int32[] intArr = (Int32[])al.ToArray(typeof(Int32));

Queue

Queue:队列,表示对象的先进先出集合。Enqueue方法入队列,Dequeue方法出队列,Peek方法返回队首元素,但是不移除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Queue qu = new Queue();
Queue qu2 = new Queue();
foreach (Int32 i in new int[4] { 1, 2, 3, 4 })
{
     qu.Enqueue(i);//入队
    qu2.Enqueue(i);
}
foreach (Int32 i in qu)
{
     Console.WriteLine(i); //遍历
}
qu.Dequeue(); //出队
Console.WriteLine("Dequeue");
foreach (Int32 i in qu)
{
     Console.WriteLine(i);
}
qu2.Peek(); //返回位于 Queue 开始处的对象但不将其移除。
Console.WriteLine("Peek");
foreach (Int32 i in qu2)
{
    Console.WriteLine(i);
}

Stack

栈,表示对象的简单的后进先出非泛型集合。Push方法入栈,Pop方法出栈,Peek方法返回栈顶元素,但是不移除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Stack sk = new Stack();
Stack sk2 = new Stack();
foreach (Int32 i in new int[4] { 1, 2, 3, 4 })
{
     sk.Push(i); //入栈
    sk2.Push(i);
}
foreach (Int32 i in sk)
{
      Console.WriteLine(i); //遍历 从栈顶开始
}
sk.Pop(); //出栈
Console.WriteLine("Pop");
foreach (Int32 i in sk)
{
    Console.WriteLine(i);
}
sk2.Peek();  //弹出最后一项不删除
Console.WriteLine("Peek");
foreach (Int32 i in sk2)
{
    Console.WriteLine(i);
}

Hashtable

哈希表,键值对的集合,键值不能重复。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Hashtable ht = new Hashtable();
 
for (Int32 i = 0; i < 10; i++)
{
    ht.Add(i, (char)('a' + i)); // 同 ht[i] = (char)('a' + i);
}
//添加已经存在的键值时会发生异常
if (ht.Contains(2))     //同ContainsKey  判断是否含有某个键
      Console.WriteLine("The hashtable contains 2");
if (ht.ContainsValue('c'))      //判断是否含有某个值
      Console.WriteLine("The hashtable contains c");
 
 ht.Remove(5);   //删除键值为5的键值对
 foreach (DictionaryEntry de in ht)    //遍历方法一
 {
      Console.WriteLine(de.Key + "    " + de.Value + "    ");
 }
 
 ICollection keys = ht.Keys;       
 foreach (Int32 k in keys)          //遍历方法二
 {
      Console.WriteLine(k + "    " + ht[k] + "    ");
  }

SortedList

1
2
3
4
5
6
7
8
9
10
11
SortedList sl = new SortedList();
sl["c"] = 41;   //同 sl.add(“c”,41);
sl["a"] = 42;
sl["d"] = 11;
sl["b"] = 13;
foreach (DictionaryEntry element in sl)
{
    String s = (String)element.Key;
    Int32 i = (Int32)element.Value;
    Console.WriteLine("{0},{1}", s, i);
}

Dictionary

泛型集合   键值不能重复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Dictionary<String, String> myDic = new Dictionary<String, String>();
myDic.Add("aaa", "111");
myDic.Add("bbb", "222");
myDic.Add("ccc", "333");
myDic.Add("ddd", "444");
//如果添加已经存在的键,add方法会抛出异常
try
{
    myDic.Add("ddd","ddd");
}
catch (ArgumentException ex)
{
    Console.WriteLine("此键已经存在:" + ex.Message);
}
//解决add()异常的方法是用ContainsKey()方法来判断键是否存在
if (!myDic.ContainsKey("ddd"))
{
    myDic.Add("ddd", "ddd");
}
else
{
    Console.WriteLine("此键已经存在:");
 
}
 
//而使用索引器来赋值时,如果键已经存在,就会修改已有的键的键值,而不会抛出异常
myDic ["ddd"]="ddd";
myDic["eee"] = "555";
 
//使用索引器来取值时,如果键不存在就会引发异常
try
{
    Console.WriteLine(myDic["fff"]);
}
catch (KeyNotFoundException ex)
{
    Console.WriteLine("没有找到键引发异常:" + ex.Message);
}
//解决上面的异常的方法是使用ContarnsKey() 来判断时候存在键,如果经常要取健值得化最好用 TryGetValue方法来获取集合中的对应键值
string value = "";
if (myDic.TryGetValue("fff", out value))
{
    Console.WriteLine(value);
}
else
{    
    Console.WriteLine("没有找到对应键的键值");
}
 
//下面用foreach 来遍历键值对
//泛型结构体 用来存储健值对
foreach ( KeyValuePair<String, String> kvp in myDic )
{
    Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);
}
 
 
//获取键的集合
foreach(String s in myDic.Keys)
{
    Console.WriteLine("key={0}",s);
}
//获取值的集合
foreach (String s in myDic.Values)
{
    Console.WriteLine("value={0}", s);
}
//获取值得另一种方式
Dictionary<String, String>.ValueCollection values = myDic.Values;
foreach (String s in values)
{
    Console.WriteLine("value={0}", s);
}

泛型集合

泛型最常见的用途是泛型集合,命名空间System.Collections.Generic 中包含了一些基于泛型的集合类,使用泛型集合类可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱。 
    很多非泛型集合类都有对应的泛型集合类,下面是常用的非泛型集合类以及对应的泛型集合类:
非泛型集合类     泛型集合类 
ArrayList         List<T> 
HashTable       Dictionary<T> 
Queue            Queue<T> 
Stack             Stack<T> 
SortedList      SortedList<T>

System.Collections 命名空间

System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。

  说明
ArrayList 使用大小会根据需要动态增加的数组来实现 IList 接口。
   BitArray 管理位值的压缩数组,该值表示为布尔值,其中 true 表示位是打开的 (1),false 表示位是关闭的 (0)。
CaseInsensitiveComparer 比较两个对象是否相等,比较时忽略字符串的大小写。
CaseInsensitiveHashCodeProvider 已过时。使用忽略字符串大小写的哈希算法,为对象提供哈希代码。
CollectionBase 为强类型集合提供 abstract 基类。
Comparer 比较两个对象是否相等,其中字符串比较是区分大小写的。
DictionaryBase 为键/值对的强类型集合提供 abstract 基类。
Hashtable 表示根据键的哈希代码进行组织的键/值对的集合。
Queue 表示对象的先进先出集合。
ReadOnlyCollectionBase 为强类型非泛型只读集合提供 abstract 基类。
SortedList 表示键/值对的集合,这些键值对按键排序并可按照键和索引访问。
Stack 表示对象的简单后进先出 (LIFO) 非泛型集合。
   StructuralComparisons 提供用于对两个集合对象执行结构比较的对象。
  结构 说明
   DictionaryEntry 定义可设置或检索的字典键/值对。
 
 
  接口 说明
   ICollection 定义所有非泛型集合的大小、枚举数和同步方法。
   IComparer 公开一种比较两个对象的方法。
   IDictionary 表示键/值对的非通用集合。
   IDictionaryEnumerator 枚举非泛型字典的元素。
   IEnumerable 公开枚举数,该枚举数支持在非泛型集合上进行简单迭代。
   IEnumerator 支持对非泛型集合的简单迭代。
   IEqualityComparer 定义方法以支持对象的相等比较。
IHashCodeProvider 已过时。使用自定义哈希函数为对象提供哈希代码。
   IList 表示可按照索引单独访问的对象的非泛型集合。
   IStructuralComparable 支持集合对象的结构比较。
   IStructuralEquatable 定义方法以支持对象的结构相等性比较。

C#入门经典学习笔记一的更多相关文章

  1. 环境配置与JBoss安装-EJB3.0入门经典学习笔记(1)

    目录 1. JDK的安装 2. JBoss的安装 3. JBoss安装目录说明 1. JDK的安装 1) 下载JDK 下载地址:http://www.oracle.com/technetwork/ja ...

  2. JBoss部属和EJB调用-EJB3.0入门经典学习笔记(2)

    目录 1. 在JBoss中部属  2. 在Tomcat中调用EJB  3. 在JBoss中调用EJB  1. 在JBoss中部属 1) JBoss的配置目录 路径D:\Java\jboss6\serv ...

  3. Webpack新手入门教程(学习笔记)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...

  4. 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总

    当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2  任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...

  5. TypeScript 入门教程学习笔记

    TypeScript 入门教程学习笔记 1. 数据类型定义 类型 实例 说明 Number let num: number = 1; 基本类型 String let myName: string = ...

  6. <Node入门经典>读书笔记

    最近在读<Node入门经典>, 之前没有做笔记, 今天开始把看过自己又写了的代码放这里以免忘记. express var express = require('express') var ...

  7. MNIST机器学习入门【学习笔记】

    平台信息:PC:ubuntu18.04.i5.anaconda2.cuda9.0.cudnn7.0.5.tensorflow1.10.GTX1060 作者:庄泽彬(欢迎转载,请注明作者) 说明:本文是 ...

  8. 《Qt Quick 4小时入门》学习笔记4

    http://edu.csdn.net/course/detail/1042/14806?auto_start=1 Qt Quick 4小时入门 第七章:处理鼠标与键盘事件 1.处理鼠标事件 鼠标信号 ...

  9. 《Qt Quick 4小时入门》学习笔记3

    http://edu.csdn.net/course/detail/1042/14807?auto_start=1 Qt Quick 4小时入门 第八章:Qt Quick中的锚(anchors)布局 ...

随机推荐

  1. iOS 多张图片保存到相册问题(add multiple images to photo album)

    不知道朋友们有木有做过多图保存到系统的相册这个需求,我在用`UIImageWriteToSavedPhotosAlbum`保存图片时候,在代理回调方`didFinishSavingWithError` ...

  2. c编程:用户输入一个数值n,打印出出1到n之间的所有质数

    #include <stdio.h> int func(int i ) { //定义一个变量temp=2,当主函数引入的数大于temp时进入for循环.当它在比自己小的数中找到一个能背整除 ...

  3. jquery动态添加/删除 tr/td

    <head runat="server"> <title></title> <!--easyui --> <link rel= ...

  4. 菜鸟的MySQL学习笔记(二)

    3-1约束: 1.约束保证数据的完整性和一致性: 2.约束分表级约束(两个或两个个以上字段的约束)和列级约束(一个字段约束): 3.NOT NULL       非空: PRIMARY KEY     ...

  5. 【Android】Sqlite3命令详解

    Sqlite3常用命令 Sqlite3命令有"."符合作为前缀. 基本操作 1.创建或者打开数据库 sqlite3 xxx.db 如果xxx.db存在则打开如果没有则新建此时执行创 ...

  6. MFC 简单输出EXCEL - (OLE)

    三图胜千言: 就是酱紫: //打印领料表 void CKnifeDlgDlg::PrintCurUsedTabel(int order) { // TODO: Add your command han ...

  7. scrapy使用爬取多个页面

    scrapy是个好玩的爬虫框架,基本用法就是:输入起始的一堆url,让爬虫去get这些网页,然后parse页面,获取自己喜欢的东西.. 用上去有django的感觉,有settings,有field.还 ...

  8. poco异步等待ActiveResult

    #include "Poco/ActiveMethod.h"#include "Poco/ActiveResult.h"#include <utility ...

  9. cocos2d-x Tests讲解 Particle System(粒子系统)

    转载请注明出处: http://www.cnblogs.com/shangdahao/archive/2012/04/14/2447571.html 一.粒子系统简介: 粒子系统最早出现在80年代,主 ...

  10. iOS之手势滑动返回功能-b

    iOS中如果不自定义UINavigationBar,通过手势向右滑是可以实现返回的,这时左边的标题文字提示的是上一个ViewController的标题,如果需要把文字改为简约风格,例如弄过箭头返回啥的 ...