泛型的目标是采用广泛适用和可交互性的形式来表示算法和数据结构 —— 参数化

泛型能子啊编译时提供强大的类型检查,减少数据类型之间的显式转换,装箱操作和运行时的类型检查

泛型的类型参数T可以被看作是一个占位符,代表了某种可能的类型

namespace Test01
{
//创建一个泛型接口
public interface IGenericInterface<T>
{
T CreateInstance(); //接口中调用CreateInstance方法
}
//实现上面泛型接口的泛型类
//派生约束where T : TI(T要继承自TI)
//构造函数约束where T : new()(T可以实例化)
public class Factory<T, TI> : IGenericInterface<TI> where T : TI, new()
{
public TI CreateInstance() //创建一个公共方法CreateInstance
{
return new T();
}
}
class Program
{
static void Main(string[] args)
{
//实例化接口
IGenericInterface<System.ComponentModel.IListSource> factory = new Factory<System.Data.DataTable, System.ComponentModel.IListSource>();
//输出指定泛型的类型
Console.WriteLine(factory.CreateInstance().GetType().ToString());
Console.ReadLine();
}
}
}

在实例化泛型时可以使用约束对类型参数的类型种类施加限制,约束是使用where上下文关键字指定的

泛型方法,在声明中包括了类型参数T的方法

泛型方法可以使用多类型参数进行重载

namespace Test02
{
public class Finder //建立一个公共类Finder
{
public static int Find<T>(T[] items, T item) //创建泛型方法
{
for (int i = ; i < items.Length; i++) //调用for循环
{
if (items[i].Equals(item)) //调用Equals方法比较两个数
{
return i; //返回相等数在数组中的位置
}
}
return -; //如果不存在指定的数,则返回-1
}
}
class Program
{
static void Main(string[] args)
{
int i = Finder.Find<int>(new int[] { , , , , , , , }, ); //调用泛型方法,并定义数组指定数字
Console.WriteLine("6在数组中的位置:" + i.ToString()); //输出中数字在数组中的位置
Console.ReadLine();
}
} }
namespace Test03
{
class Program
{
static void Main(string[] args)
{
List<int> myList = new List<int>();
for (int i = ; i < ; i++)
{
myList.Add(i);
}
foreach (int i in myList)
{
Console.WriteLine(i);
}
Console.ReadLine();
}
}
}
namespace Test04
{
class Program
{
static void Main(string[] args)
{
myclass1<int> mclass1 = new myclass1<int>();
myclass2<int> mclass2 = new myclass2<int>();
Console.ReadLine();
}
class myclass1<T>
{
public myclass1()
{
Console.WriteLine("这是第一个泛型类");
}
}
class myclass2<T> : myclass1<T>
{
public myclass2()
{
Console.WriteLine("这是第二个泛型类");
}
}
}
}

System.IO 命名空间

File 类和Directory 类分别用来对文件和各种目录进行操作,可以被实例化,但不能被其他类继承

File类中的所有方法都是静态的,所以如果只想执行一个操作,那么使用File类中方法的效率比使用相应的FileInfo类中的方法更高

File类的静态方法对所有方法都执行安全检查,如果打算多次重用某个对象,可考虑FileInfo方法 —— 不用总是检查

if (File.Exists(textBox1.Text))       //使用File类的Exists方法判断要创建的文件是否存在
{
MessageBox.Show("该文件已经存在");
}
else
{
File.Create(textBox1.Text); //使用File类的Create方法创建文件
}

Directory 类,操作目录

if (Directory.Exists(textBox1.Text))          //使用Directory类的Exists方法判断要创建的文件夹是否存在
{
MessageBox.Show("该文件夹已经存在");
}
else
{
Directory.CreateDirectory(textBox1.Text); //使用Directory类的CreateDirectory方法创建文件夹
}

FileInfo类没有静态方法,该类中的方法可以用于实例化的对象

如果要在文件上执行几种操作(或重复操作),则实例化FileInfo对象效率更高

FileInfo finfo = new FileInfo(textBox1.Text);
if (finfo.Exists) //使用FileInfo对象的Exists属性判断要创建的文件是否存在
{
MessageBox.Show("该文件已经存在");
}
else
{
finfo.Create(); //使用FileInfo对象的Create方法创建文件
}
DirectoryInfo dinfo = new DirectoryInfo(textBox1.Text);  //实例化DirectoryInfo类对象
if (dinfo.Exists) //使用DirectoryInfo对象的Exists属性判断要创建的文件夹是否存在
{
MessageBox.Show("该文件夹已经存在");
}
else
{
dinfo.Create(); //使用DirectoryInfo对象的Create方法创建文件夹
}

获取文件信息

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Text = openFileDialog1.FileName;
FileInfo finfo = new FileInfo(textBox1.Text); //实例化FileInfo对象
string strCTime, strLATime, strLWTime, strName, strFName, strDName, strISRead;
long lgLength;
strCTime = finfo.CreationTime.ToShortDateString(); //获取文件创建时间
strLATime = finfo.LastAccessTime.ToShortDateString(); //获取上次访问该文件的时间
strLWTime = finfo.LastWriteTime.ToShortDateString(); //获取上次写入文件的时间
strName = finfo.Name; //获取文件名称
strFName = finfo.FullName; //获取文件的完整目录
strDName = finfo.DirectoryName; //获取文件的完整路径
strISRead = finfo.IsReadOnly.ToString(); //获取文件是否只读
lgLength = finfo.Length; //获取文件长度
MessageBox.Show("文件信息:\n创建时间:" + strCTime + " 上次访问时间:" + strLATime + "\n上次写入时间:" + strLWTime + " 文件名称:" + strName + "\n完整目录:" + strFName + "\n完整路径:" + strDName + "\n是否只读:" + strISRead + " 文件长度:" + lgLength);
}

C#开发 —— 泛型,文件的更多相关文章

  1. C#进行Visio二次开发之文件导出及另存Web页面

    在我前面很多关于Visio的开发过程中,介绍了各种Visio的C#开发应用场景,包括对Visio的文档.模具文档.形状.属性数据.各种事件等相关的基础处理,以及Visio本身的整体项目应用,虽然时间过 ...

  2. 编译流程,C开发常见文件类型名

    编译流程 我们常说的编译是一个整体的概念,是指从源程序到可执行程序的整个过程,实际上,C语言编译的过程可以进一步细分为预编译->编译->汇编->链接 预编译是把include关键字所 ...

  3. iOS开发中文件的上传和下载功能的基本实现-备用

    感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...

  4. Windows 10开发基础——文件、文件夹和库(一)

    原文:Windows 10开发基础--文件.文件夹和库(一) 主要内容: 1.枚举查询文件和文件夹 2.文本文件读写的三种方法——创建写入和读取文件 3.获得文件的属性 枚举查询文件和文件夹 先了解一 ...

  5. Java开发系列-文件上传

    概述 Java开发中文件上传的方式有很多,常见的有servlet3.0.common-fileUpload.框架.不管哪种方式,对于文件上传的本质是不变的. 文件上传的准备 文件上传需要客户端跟服务都 ...

  6. 05 python开发之文件处理

    05 python开发之文件处理 目录 05 python开发之文件处理 5 文件处理 5.1 字符编码 5.1.1 基本概念 5.1.2 发展历程 5.1.3 使用 5.2 文件处理基础 5.2.1 ...

  7. 【Win 10 应用开发】文件读写的三种方案

    本文老周就跟伙伴们探讨一下关于文件读写的方法.总得来说嘛,有三种方案可以用,而且每种方案都各有特色,也说不上哪种较好.反正你得记住老祖宗留给我们的大智慧——事无定法,灵活运用者为上. OK,咱们开始吧 ...

  8. PPT开发 * .pps 文件类型

    PPT开发, * .pps ,文件类型 PPS 这个格式也是PowerPoint文件格式的一种. pps的意思是说PowerPoint Show,POWER POINT会直接生成预览形式为你放映幻灯片 ...

  9. 【WP 8.1开发】文件选取器的使用方法

    在以往的WP7x/8.0开发中,我们使用选择器可以浏览并打开图片.音频.视频等一些特殊文件,在8.0 SDK中的运行时API(从Win 8 app中移植)尽管提供了Windows.Storage.Pi ...

随机推荐

  1. PostgreSQL Replication之第四章 设置异步复制(6)

    4.6 有效的清理和恢复结束 最近几年, recovery.conf 已经变得越来越强大了.早在初期(在 PostgreSQL 9.0之前), 仅有 restore_command 和一些 recov ...

  2. PostgreSQL Replication之第四章 设置异步复制(2)

    4.2 配置级联复制 正如您在本章已经看到的,设置流复制真的很容易.只需要设置几个参数,做一个基础备份,并享受您的复制设置. 在许多情况下,这种情况更有一点点微妙.在这个例子中我们假设:我们要使用一个 ...

  3. 《剑指offer》旋转数组的最小数字

    一.题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 二.输入描述 输入一个递增排序的数组的一个旋转 三.输出描述 输出旋转数组的最小元素 例如: 例如数组{3,4,5,1 ...

  4. c# protected public private internal

    1 internal 只能在一个项目中引用,不能跨项目引用,只有在同一程序集的文件中 2 public 最高级别的访问权限 对访问公共成员没有限制 3 private 最低级别的访问权限 只能在声明它 ...

  5. laravel 自定义全局函数

    在 app 目录下创建一个 Helpers 目录,在此目录下创建文件.这些文件就是全局函数文件.如叫:function.php 加载此文件: 1 . 在 bootstrap/autoload.php ...

  6. iOS开发——捕获崩溃信息

    可通过注册NSUncaughtExceptionHandler捕获异常信息,将拿到的NSException细节写入Crash日志,精准的定位出错程序位置,有需要的,可直接将crash信息直接上传服务器 ...

  7. Raspberry Pi - 调整你的SD卡分割区的大小

    在使用Win32DiskImager为一张空白的SD卡刷入新的Rasbian系统后,卡上的可用剩余空间并不大, 本人有一张8G的SD卡,但是刷入4.1的Rasbian后,用df -h查看,根目录下的空 ...

  8. thymeleaf 教程

    html页面 添加  <html xmlns:th="http://www.thymeleaf.org" > html原有标签都可以用thymeleaf标签替换 1.t ...

  9. COGS——T 1215. [Tyvj Aug11] 冗余电网

    http://www.cogs.pro/cogs/problem/problem.php?pid=1215 ★   输入文件:ugrid.in   输出文件:ugrid.out   简单对比时间限制: ...

  10. swift 动态设置UILabel的高度

    import UIKit class ViewController3: UIViewController {          override func viewDidLoad() {        ...