介绍:泛型介绍,索引,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的更多相关文章

  1. javaSE基础04

    javaSE基础04 一.三木运算符 <表达式1> ? <表达式2> : <表达式3> "?"运算符的含义是: 先求表达式1的值, 如果为真, ...

  2. javascript基础04

    javascript基础04 1.循环语句 1.While 语句: while (exp) { //statements; } var i = 1; while(i < 3){ alert(i) ...

  3. Linux命令工具基础04 磁盘管理

    Linux命令工具基础04 磁盘管理 日程磁盘管理中,我们最常用的有查看当前磁盘使用情况,查看当前目录所占大小,以及打包压缩与解压缩: 查看磁盘空间 查看磁盘空间利用大小 df -h -h: huma ...

  4. Linux基础04

    ** Linux基本操作常用命令(四) ** Linux系统管理命令 1.top:查看系统资源,每隔三秒刷新一次,按q:退出浏览状态 2.free:查看内存信息,-m,以MB单位显示 3.netsta ...

  5. Spring 框架基础(04):AOP切面编程概念,几种实现方式演示

    本文源码:GitHub·点这里 || GitEE·点这里 一.AOP基础简介 1.切面编程简介 AOP全称:Aspect Oriented Programming,面向切面编程.通过预编译方式和运行期 ...

  6. Java入门 - 语言基础 - 04.对象和类

    原文地址:http://www.work100.net/training/java-object-class.html 更多教程:光束云 - 免费课程 对象和类 序号 文内章节 视频 1 概述 2 J ...

  7. Java知识系统回顾整理01基础04操作符05赋值操作符

    一.赋值操作 赋值操作的操作顺序是从右到左 int i = 5+5; 首先进行5+5的运算,得到结果10,然后把10这个值,赋给i public class HelloWorld { public s ...

  8. Java知识系统回顾整理01基础04操作符01算术操作符

    一.算数操作符类别 基本的有: + - * / % 自增 自减: ++ -- 二.基本算数操作符 + - * / 基本的加 减 乘 除 public class HelloWorld { public ...

  9. python基础04 运算

    数学运算 print 2+2  #加法 print 1.3-4 #剪法 print 3*5 #乘法 print 4.5/1.5 #除法 print 3**2   #乘方 print 10%3   #求 ...

随机推荐

  1. SQL Server里的闩锁介绍

    在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch).闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构.文章的第1部分我会介 ...

  2. 故障排查:是什么 导致了服务器端口telnet失败?

    telnet命令的主要作用是与目标端口进行TCP连接(即完成TCP三次握手). 当服务端启动后,但是telnet其监听的端口,却失败了.或者,当服务端运行了一段时间后,突然其监听的端口telnet不通 ...

  3. C#中的线程四(System.Threading.Thread)

    C#中的线程四(System.Threading.Thread) 1.最简单的多线程调用 System.Threading.Thread类构造方法接受一个ThreadStart委托,改委托不带参数,无 ...

  4. C#反射基础知识和实战应用

    首先来说一下什么是反射? 反射提供了封装程序集.模块和类型的对象(Type类型) 可以使用反射动态的创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后,可以调用类型的方法或访问其字段和 ...

  5. C#抓取网页HTML内容

    网上很多内容采集工具,今天就自己试着写一个,发现C#可以轻松的抓去网页的内容,进而通过正则来分离出自己感兴趣的数据.下面是抓去网页内容的代码: using System; using System.C ...

  6. 巧用JS内置对象Function

    在做练习的时候也好,做项目的时候也好,我经常会碰到想要的到一个字符串“”里面的东西的这样的需求. 注意,“”里面的东西可以是任何东西[],number等等 于是有了个大神教我一个绝招: 于是世界圆满了 ...

  7. Windows内存小结

    以前写过一篇理解程序内存, 当时主要是针对用户态,下面再稍微深入一点: 我们以32位程序为例(不启用AWE), 总共4G虚拟空间,其中低2G属于用户态, 高2G属于操作系统内核, 每个程序都有自己的低 ...

  8. sigar

    从http://sourceforge.net/projects/sigar/files/sigar/1.6/hyperic-sigar-1.6.4.zip/download下载sigar, 参照了h ...

  9. 纯js 判断手势滑动方向

    $('body').on('touchstart', '#gallerySlider img', function(e) { var touch = e.originalEvent, startX = ...

  10. Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念

    PO(persistant object) 持久对象 在 o/r 映射的时候出现的概念,如果没有 o/r 映射,没有这个概念存在了.通常对应数据模型 ( 数据库 ), 本身还有部分业务逻辑的处理.可以 ...