读文件对话框:
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Filter = "DAT文件(*.dat)|*.dat|RAW文件(*.raw)|*.raw"; //选择文件
fileDialog.Title = "选择文件"; //获取或设置文件对话框标题
fileDialog.RestoreDirectory = true;
if (fileDialog.ShowDialog() == DialogResult.OK)
{
textFilePath.Text = fileDialog.FileName;
}
保存文件对话框
SaveFileDialog Savefile = new SaveFileDialog();
Savefile.Title = "保存文件"; //获取或设置文件对话框标题
Savefile.InitialDirectory = @"C:\";//默认路径
Savefile.Filter = "DAT文件(*.dat)|*.dat|RAW文件(*.raw)|*.raw"; //选择文件类型
Savefile.ShowDialog();
string filePath = Savefile.FileName;
泛型的优点1:性能好
值类型存储在栈上,C#结构是值类型,值类型转换为引用类型称为装箱;
引用类型存储在堆上,C#类是引用类型,引用类型转换为值类型称为拆箱。
装箱的值类型可使用拆箱操作转换为值类型,拆箱则需要类型强制转换运算符。
泛型类List
不使用对象,在使用时定义类型。
泛型的优点2:类型安全
泛型类型T定义允许使用的类型,如果要加入其他类型数据,编译器就会报错,不编译。
泛型的优点3:允许更好的重用二进制代码;
var list = new List();
var strlist = new List();
var myClasslist = new List();
myClasslist.Add(new MyClass());
泛型类型可以在一种语言中定义,在其他.Net语言中重复使用(万物皆可盘)
命名规则:
1.泛型类型的名称用字母T作为前缀;
2.泛型类型允许任意替代,且若只使用了一个泛型类型,就可以用字符T作为泛型类型的名称;
public class List { }
public class LninkedList { }
3.若有特定要求,或使用了两个以上,则区分开来。
public delegate void EventHandler(object sender, TEnventArgs e);
public delegate TOutput Converter(TInput from);
public class SortedList { }
不可将null 赋予泛型类型,可使用default关键字将0赋给值类型,将null赋给引用类型;
若泛型不需要Object类的功能,但需要其某些方法,可以定义约束
约束:定义约束 where……
public class DocManager where TDocument : IDocument
泛型支持的其他约束:约束可以合并
约束 | 说明 |
where T : struct | 对于结构约束,类型T必须是值类型 |
where T : class | 类的约束指定类型T必须是引用类型 |
where T : IFoo | 指定类型T必须实现接口IFoo |
where T : Foo | 指定类型T必须派生自基类Foo |
where T : new() | 这是一个构造函数约束,指定类型T必须有一个默认的构造函数 |
where T1 : T2 | 这个约束也可以指定,类型T1派生自泛型类型T2,又称“裸类型约束” |
泛型类型可以实现泛型接口,也可以派生自一个类,泛型类可以派生自泛型基类。
派生类可以是泛型类或者非泛型类。
泛型类的静态成员只能在类的一个实例中共享。如果实现两个类对象,则会存在两组静态字段。
public class StaticDemo
{
public static int x;
}
static void Main(string[] args)
{
StaticDemo.x = 4;
StaticDemo.x = 5;
Console.WriteLine(StaticDemo.x);
Console.WriteLine(StaticDemo.x);
var dm = new DocManager();
}
泛型可以定义接口,.net 有很多泛型接口:IComparable
协变和抗变是对参数和返回值的类型进行转换。
参数类型是协变的,A派生自B,则,A可以作为参数,代替B传递。
方法的 返回值类型是抗变的。当方法返回B时,不可以使用A代替。但是,当方法返回A时,可以用B代替。
泛型接口的协变:
如果泛型类型用out关键字标注,泛型接口就是协变的:
public interface IDemo
{
T this[int index] { get; }
int count { get; }
}
如上例,返回值类型只能为T,如果接口使用了索引器,就把泛型类型T传递给方法,并从方法中检索这个类型。泛型类型必须定义为不变的,不使用out in 标注,就可以把类型定义为不变的。
合并运算符:??,为转换定义了一个默认值,以防可空类型的值是null。 int y1 = x1??0;
泛型接口的抗变:
如果泛型类型用in关键字标注,则泛型接口就是抗变的。
public interface IDemo
{
void Show(T item);
}
如上,接口只能把泛型类型T用作其方法的输入。
不继承。 Nullable