C#入门经典学习笔记一
这篇主要讲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#入门经典学习笔记一的更多相关文章
- 环境配置与JBoss安装-EJB3.0入门经典学习笔记(1)
目录 1. JDK的安装 2. JBoss的安装 3. JBoss安装目录说明 1. JDK的安装 1) 下载JDK 下载地址:http://www.oracle.com/technetwork/ja ...
- JBoss部属和EJB调用-EJB3.0入门经典学习笔记(2)
目录 1. 在JBoss中部属 2. 在Tomcat中调用EJB 3. 在JBoss中调用EJB 1. 在JBoss中部属 1) JBoss的配置目录 路径D:\Java\jboss6\serv ...
- Webpack新手入门教程(学习笔记)
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...
- 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2 任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...
- TypeScript 入门教程学习笔记
TypeScript 入门教程学习笔记 1. 数据类型定义 类型 实例 说明 Number let num: number = 1; 基本类型 String let myName: string = ...
- <Node入门经典>读书笔记
最近在读<Node入门经典>, 之前没有做笔记, 今天开始把看过自己又写了的代码放这里以免忘记. express var express = require('express') var ...
- MNIST机器学习入门【学习笔记】
平台信息:PC:ubuntu18.04.i5.anaconda2.cuda9.0.cudnn7.0.5.tensorflow1.10.GTX1060 作者:庄泽彬(欢迎转载,请注明作者) 说明:本文是 ...
- 《Qt Quick 4小时入门》学习笔记4
http://edu.csdn.net/course/detail/1042/14806?auto_start=1 Qt Quick 4小时入门 第七章:处理鼠标与键盘事件 1.处理鼠标事件 鼠标信号 ...
- 《Qt Quick 4小时入门》学习笔记3
http://edu.csdn.net/course/detail/1042/14807?auto_start=1 Qt Quick 4小时入门 第八章:Qt Quick中的锚(anchors)布局 ...
随机推荐
- RAC分解步骤之一,在oracle linux 4u4上安装oracle 10.2.0.1.0操作日志
练习oracle的rac组建过程,第一步,先练习4u4上安装oracle 10.2.0.1.0.直接安装rac,有些难度.从简单的做起.总RAC步骤,参照小布老师的RAC组建. 1. 启动vc,登陆v ...
- iOS开发——真机调试证书—发布证书
(最近准备考试,空闲整理成博客……)
- DBHelper 数据库帮助类
/// <summary> /// 数据库帮助类 /// <author>vito</author> /// </summary> public cla ...
- ReactNative-----环境搭建二(android)
一.初始化一个ReactNative项目 在指定目录运行命令:react-native init Vince(项目名称) //其过程就是在使用CLI工具构建项目, 命令行代码 F:\React> ...
- 转:HashMap的工作原理,及笔记
HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此 ...
- scrapy shell 中文网站输出报错.记录.
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 381-382: illegal multibyte sequence 上 ...
- [CLR VIA C#] chapter2 building,packaging,deploying, and administering
今天整理一下 assembly, 总感觉第一章 到 第三章 没怎么仔细看, 导致后面作者说前面说过的, 我就心里不舒服, 前面3章很干很涩, 好好啃啃, 先作一些简单笔记, 最后再来 整体整理, 反正 ...
- javascript 写策略模式,商场收银打折优惠策略
[Decode error - output not utf-8] ----------------------------- 购物清单 方便面 : 100 x 50 = 5000 | 4000 菊花 ...
- 用javascript操作xml
用javascript操作xml 可以使用标准DOM操作. IE创建XML MSXML2.0DOMDocument function createXMLDOM(){ var version = [ ' ...
- scp命令使用
从 本地 复制到 远程 scp /home/daisy/full.tar.gz root@172.19.2.75:/home/root (然后会提示你输入另外那台172.19.2.75主机的root用 ...