C#基础04
介绍:泛型介绍,索引,Foreach遍历的解释,yield方法,path文件操作,Directory类基本操作<目录>
一:泛型
百度资料:泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数 T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险,
使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型最常见的用途是创建集合类。.NET Framework 类库在 System.Collections.Generic 命名空间中包含几个新的泛型集合类。应尽可能地使用这些类来代替普通的类,如 System.Collections 命名空间中的 ArrayList。您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。可以对泛型类进行约束以访问特定数据类型的方法。关于泛型数据类型中使用的类型的信息可在运行时通过反射获取。
* 泛型的好处:代码的重用。通过使用<T>来进行重用。可以往里面传递不同的参数类型,我们也可以将其定义为泛型方法,泛型类,泛型接口。
* 自定义泛型
里面有泛型类,泛型方法,泛型接口。
eg 1:
/// 自定义泛型类
public class MyClass1<T>
{
public void SayHi(T teg)
{
Console.WriteLine(teg);
}
}
//泛型方法
public class Myclass2
{
public void Say<T>(T er)
{
Console.WriteLine(er);
}
}
//泛型接口
public interface IMyClass3<T>
{
T Sayhi(); //返回值类型
void SayHello(T msg); //参数类型
}
//实现泛型接口的两种情况
//1:普通类实现泛型接口
public class Class2 : IMyClass3<String>
{
public void SayHello(string msg)
{
Console.WriteLine(msg);
}
public string Sayhi()
{
throw new NotImplementedException();
}
}
//2:泛型类实现泛型接口
//这里的IMyClass3<U>的U是根据类接口中的U来决定的。
public class Class3<U> : IMyClass3<U>
{
public void SayHello(U msg)
{
Console.WriteLine(msg);
} public U Sayhi()
{
throw new NotImplementedException();
}
}
二:创建一个索引
public class MyClass
{
private string[] _data = new string[5];
/// <summary>
/// 定义一个索引
/// </summary>
public string this[int index]
{
get { return _data[index]; }
set { _data[index] = value; }
}
}
创建泛型索引
public class MyClass<T>
{
private T[] _data = new T[5];
/// <summary>
/// 定义一个索引
/// </summary>
///
public T this[int index]
{
get { return _data[index]; }
set { _data[index] = value; }
}
}
三:泛型约束
就是在泛型的后面加上where T:struct/class等。说明泛型以后会在定义的这个约束中来进行T的更换。

四:foreach(*) 是只读方法
使用条件:凡是具有GetEnumerator()方法的类型都可以进行遍历。
定义:调用枚举器来实现的。
通过上面的解释,我们应该知道只要实现了具有GetEnumerator()方法就可以实现froeach的遍历。
实例
1:先在类中实现IEnumerable接口,拥有GetEnumerator()方法,接着在写个Enumerator(枚举器)类且此类实现IEnumerator(枚举器接口)接口,这样我们这个类中就有了枚举器的所有的功能。
//不使用foreach来实现遍历。 foreach主要是调用了枚举器这个方法,我们只需要自己重新写个方法就行。实现IEnumerable接口就可以实现GetEnumerator
Main()中的写法
var p = new Person();
var etor = p.GetEnumerator();
while(etor.MoveNext())
{
Console.WriteLine(etor.Current.ToString());
}
Console.WriteLine("OK");
Console.ReadKey();
具体类的实现
public class Person:IEnumerable
{ private string [] friends=new string[]{"11","22","33"};
public string Name { get; set; }
public int Age { get; set; } public IEnumerator GetEnumerator()
{
return new PersonEnumerator(this.friends); //这里返回的是Object类型
}
} public class PersonEnumerator:IEnumerator
{
private string[] _friends;
public PersonEnumerator(string[] fs)
{
_friends = fs;
}
private int index = -1; //下标 指代0号前面位
//获取数据
public object Current
{
get
{
if(index>=0&&index<_friends.Length)
{
return _friends[index]; //通过下标来返回值。
}
else
{
throw new Exception();
}
}
}
//移动下标
public bool MoveNext()
{
if(index+1<_friends.Length)
{
index++;
return true;
}
return false;
}
//将下标还原,初始化
public void Reset()
{
index = -1;
}
}
五:yield方法
yield 关键字向编译器指示它所在的方法是迭代器块。编译器生成一个类来实现迭代器块中表示的行为。在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值。这是一个返回值,例如,在 foreach 语句的每一次循环中返回的值。yield 关键字也可与 break 结合使用,表示迭代结束。
六:文件操作

*:File:操作文件,静态类,对文件整体操作。(拷贝,赋值,剪切等)
*:Directory:操作目录的类,目录夹
*:DirectoryInfo:文件夹的一个类,用来描述文件夹对象,(获取指定目录下所有目录时返回一个DirectoryInfo数组)
*:FileInfo:文件夹,用来描述一个文件对象。获取指定目录下的所有文件时,返回一个FileInfo数组。
*:Path:对文件”目录和路径”进行操作,<字符串>。
*:Stream :文件流,抽象类。
1:FileStream 文件流 MemoryStream内存流 NetworkStream网络流
2:StreamReader:快速读取文本文件
3:StreamWriter:快速写入文本文件
* Path文件操作
我们通过使用Path类来获取我们文件名,路径,修改文件名等。
string path = @"F:\VS2008\Projects\ShiPinJiChu__HeiMa\文件操作\bin\Debug\文件操作.exe.config";
//获取文件名
Console.WriteLine(Path.GetFileName(path));
//获取文件的后缀
Console.WriteLine(Path.GetExtension(path));
//获取不带后缀的文件名
Console.WriteLine(Path.GetFileNameWithoutExtension(path));
//获取该路径的目录部分
Console.WriteLine(Path.GetDirectoryName(path));
//更改文件后缀名
Console.WriteLine(Path.ChangeExtension(path, "dll"));
//合并两个路径
string path1 = @"F:\VS2008\Projects\";
string path2 = "xiaohui.exe";
Console.WriteLine(Path.Combine(path1 + path2));
//返回当前用户的临时文件夹的路径。
Console.WriteLine(Path.GetTempPath());
//创建磁盘上唯一命名的零字节的临时文件并返回该文件的完整路径。
Console.WriteLine(Path.GetTempFileName());
Console.ReadKey();
* Directory类基本操作<目录>
//创建目录
for (int i = 0; i < 10; i++)
{
Directory.CreateDirectory(@"C:\" + i);
}
Console.WriteLine("OK");
Console.ReadKey(); //删除目录
for (int i = 0; i < 10; i++)
{
//Directory.Delete(@"C:\" + i); //只能删除空目录
Directory.Delete(@"C:\" + i, true);
}
Console.WriteLine("OK");
Console.ReadKey(); //剪切
Directory.Move(@"C:\11", @"C:\222\11"); //重命名 <利用剪切来实现>
Directory.Move(@"C:\222", @"C:\333");
Console.WriteLine("OK");
Console.ReadKey(); //获取文件下面的所有的子目录
string path = @"C:\333\11";
var file= Directory.GetFiles(path);
foreach (var item in file)
{
Console.WriteLine(item);
}
//删除目录
Directory.Delete(@"C:\333",true);
Console.WriteLine("OK");
Console.ReadKey();
C#基础04的更多相关文章
- javaSE基础04
javaSE基础04 一.三木运算符 <表达式1> ? <表达式2> : <表达式3> "?"运算符的含义是: 先求表达式1的值, 如果为真, ...
- javascript基础04
javascript基础04 1.循环语句 1.While 语句: while (exp) { //statements; } var i = 1; while(i < 3){ alert(i) ...
- Linux命令工具基础04 磁盘管理
Linux命令工具基础04 磁盘管理 日程磁盘管理中,我们最常用的有查看当前磁盘使用情况,查看当前目录所占大小,以及打包压缩与解压缩: 查看磁盘空间 查看磁盘空间利用大小 df -h -h: huma ...
- Linux基础04
** Linux基本操作常用命令(四) ** Linux系统管理命令 1.top:查看系统资源,每隔三秒刷新一次,按q:退出浏览状态 2.free:查看内存信息,-m,以MB单位显示 3.netsta ...
- Spring 框架基础(04):AOP切面编程概念,几种实现方式演示
本文源码:GitHub·点这里 || GitEE·点这里 一.AOP基础简介 1.切面编程简介 AOP全称:Aspect Oriented Programming,面向切面编程.通过预编译方式和运行期 ...
- Java入门 - 语言基础 - 04.对象和类
原文地址:http://www.work100.net/training/java-object-class.html 更多教程:光束云 - 免费课程 对象和类 序号 文内章节 视频 1 概述 2 J ...
- Java知识系统回顾整理01基础04操作符05赋值操作符
一.赋值操作 赋值操作的操作顺序是从右到左 int i = 5+5; 首先进行5+5的运算,得到结果10,然后把10这个值,赋给i public class HelloWorld { public s ...
- Java知识系统回顾整理01基础04操作符01算术操作符
一.算数操作符类别 基本的有: + - * / % 自增 自减: ++ -- 二.基本算数操作符 + - * / 基本的加 减 乘 除 public class HelloWorld { public ...
- python基础04 运算
数学运算 print 2+2 #加法 print 1.3-4 #剪法 print 3*5 #乘法 print 4.5/1.5 #除法 print 3**2 #乘方 print 10%3 #求 ...
随机推荐
- Storm-源码分析- Storm中Zookeeper的使用
在backtype.storm.cluster.clj中, 定义了storm对于Zookeeper的使用 ClusterState 首先定义操作Zookeeper集群的interface (def ...
- Linux 2.6 源码学习-内存管理-buddy算法
核心数据结构 linux 2.6 的内存管理支持NUMA(Non Uniform Memory Access Achitecture),即非一致内存访问体系,在该体系中存在多个CPU,并且拥有分离的存 ...
- 【读书笔记】.Net并行编程高级教程(二)-- 任务并行
前面一篇提到例子都是数据并行,但这并不是并行化的唯一形式,在.Net4之前,必须要创建多个线程或者线程池来利用多核技术.现在只需要使用新的Task实例就可以通过更简单的代码解决命令式任务并行问题. 1 ...
- 今天心情好,给各位免费呈上200兆SVN代码服务器一枚,不谢!
开篇先给大家讲个我自己的故事,几个月前在网上接了个小软件开发的私活,平日上班时间也比较忙,就中午一会儿休息时间能抽出来倒腾着去做点.每天下班复制一份到U盘带回去继续摸索,没多久U盘里躺着的文件列表那叫 ...
- Linux grep与正则表达式
grep命令 格式:grep [-acinv] [--color=auto] '查找字符串' filename -a 将binary文件以text文件的 -c 计算找到 ‘查找字符串’ ...
- Oracle数据库面试题【转载】
1. Oracle跟SQL Server 2005的区别? 宏观上: 1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windo ...
- 大叔也说Xamarin~Android篇~Activity之间传递数组
回到目录 我们在开发应用程序时,不可能只使用一个Layout或者一个Activity,比如你个管理系统,要求用户先登陆然后再使用,这时你至少要有两个activity吧,先登陆一个,然后成功后需要跳到别 ...
- 知方可补不足~SQL2005使用ROW_NUMBER() OVER()进行数据分页
回到目录 数据分页是这个经常说的东西,无论在WEBForm还是WinForm中它都会被单独拿出来,或者是公用组件,或者是公用类库,反正对于数据分页这个东西,总是我们关注的一个话题,但事实上,数据分页归 ...
- 手把手教你在VirtualBox中与主机共享文件夹
安装VirtualBox为了共享文件夹,折腾了一晚上!网上的很多资料都不是很全面,这里就全面的总结一下,如果有其他的疑问,可以留言多多交流. VirtualBox下载地址,版本为5.1.2 设置共享文 ...
- [数据库连接池二]Java数据库连接池--C3P0和JDNI.
前言:上一篇文章中讲了DBCP的用法以及实现原理, 这一篇再来说下C3P0和JDNI的用法. 1.1.C3P0数据源 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规 ...