2 名企面试_02
1 如何把一个数组复制到ArraryList?反过来从ArraryList到数组?
答案: copyTo 方法可以将Arrarylist中的元素浅拷贝到arrary中
答案:数组在C#中是最早出现的。它在内存中是连续的存储的,所以索引速度很快,而且赋值与修改元素也很简单。可以利用偏移地址访问元素,时间复杂度为O(1);可以用折半查找法查找元素,效率高。
但是声明数组,必须确定其长度。分配空间时必须确定大小。空间的连续,也导致了存储效率低,插入和删除元素效率比较低,而且麻烦。如果,要增添一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样,你想删除一个元素,需要移动大量元素去填补被移动的元素。
ArrayList是.Net Framework提供的用于数据存储和检索的专用类,它是命名空间System.Collections下的一部分。它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。
ArrayList继承了IList接口,所以它可以很方便的进行数据的添加。但是 ArrayList不是类型安全的。既使我们保证在插入数据的时候都很小心,都有插入了同一类型的数据,但在使用的时候,我们也需要将它们转化为对应的原类型来处理。这就存在了装箱与拆箱的操作,会带来很大的性能损耗
正是因为ArrayList存在不安全类型与装箱拆箱的缺点,所以在C#2.0后出现了泛型的概念。而List类是ArrayList类的泛型等效类。它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。这样就避免了前面讲的类型安全问题与装箱拆箱的性能问题了。
3 string str =null 和string str=""的区别?
答案:前者不分配内存,后者分配内存
4 stringBuilder的用处?
答案: stringbuilder 是一个字符串构造器,构造字符串时,可以不产生大量的临时字符串,提高性能。同时也可以与非托管代码进行交互
5 什么是序列化,如何序列化?
- 什么是序列化以及如何实现序列化?
- 如何将对象数据写入 XML 文件?
- 如何从 XML 文件读取对象数据?
什么是序列化以及如何实现序列化?
序列化是通过将对象转换为字节流,从而存储对象或将对象传输到内存,数据库或文件的过程。主要用途是保存对象的状态,包括对象的数据,以便能够在需要是重建对象。反向过程称为 反序列化。
如上图所示,对象 object 被序列化为 流,其中不仅包含数据、还包含对象类型的相关信息,如版本、区域性和程序集名称。然后可以将此流中的内容存储到数据库、文件或内存中。
序列化的用途:
通过序列化,可以执行如下操作:通过 Web 服务将对象发送到远程应用程序、在域之间传递对象、以 XML 字符串的形式传递对象通过防火墙、跨应用程序维护安全性或用户专属信息。
让对象可序列化:
需要具有对象、包含已序列化对象的一个流,以及一个 Fromatter。
System.Runtime.Serialization 包含序列化和反序列化对象所必须的类。
将 SerializableAttribute 特性应用于某个类型,以表示此类型的实例可以被序列化,如果对没有 SerializableAttribute 特性的类型进行序列化,则会引发异常。
如果想让类中的某个字段不可序列化,可以使用 NonSerializedAttribute 特性。
序列化的三种类型--二进制、XML、JSON
可以使用二进制 binary 或 XML 进行序列化,在 二进制序列化中,所有内容都会被序列化,且性能也很好,使用二进制编码来生成精简的序列化,可以用于基于存储或socket的网络流。
XML 序列化可提高可读性,以及对象共享和使用的灵活性,XML 序列化将对象的公共字段和属性或方法的参数和返回值序列化成符合特定 XML 格式的流,
System.Xml.Serialization 包含序列化和反序列化 XML 所需要的类
如何将对象数据写入 XML 文件?
使用 XmlSerializer 类将 overview 对象序列化并写入 XML 文件
public class XMLWrite { static void Main(string[] args) { WriteXML(); } public class Book { public String title; } public static void WriteXML() { Book overview = new Book(); overview.title = "Serialization Overview"; System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(typeof(Book)); var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "//SerializationOverview.xml"; System.IO.FileStream file = System.IO.File.Create(path); writer.Serialize(file, overview); file.Close(); } }
运行结果:
在当前系统的 Documents 文件夹下生成文件 SerializationOverview.xml
内容如下图:
指定 XML 标签的名字
[XmlRoot(department)]
public class Department { public string DeptName { get; set; } [XmlElement("extra")] public DeptExtraInfo DeptExtraInfo { get; set; } }
通过在 XmlRoot、XmlElement 后面加上一个括号即可实现,其中XmlRoot用于指定“根”,也就是XML的最上一层的Tag
指定 XML 标签的属性
[XmlRoot("department")] public class Department { public string DeptName { get; set; } = "研发部"; [XmlAttribute("timestamp")] public int Timestamp = 10; }
Timestamp就成为了department这个根节点的timestamp属性。
去掉不需要的 namespace
默认情况下,xml 的头部会带上类似 xmlns:xsd、xmlns:xsi 的属性,不需要的化可以通过修改序列化方法实现:
public static void WriteXML() { Book overview = new Book(); overview.title = "Serialization Overview"; System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(typeof(Book)); XmlSerilizerNamespaces ns = new XmlSerializerNamespace(); var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "//SerializationOverview.xml"; System.IO.FileStream file = System.IO.File.Create(path); writer.Serialize(file, overview, ns); file.Close(); }
如何从 XML 文件读取对象数据?
使用 XmlSerializer 类读取之前写入 XML 文件的对象数据
public class Book { public String title; } public void ReadXML() { // First write something so that there is something to read ... var b = new Book { title = "Serialization Overview" }; var writer = new System.Xml.Serialization.XmlSerializer(typeof(Book)); var wfile = new System.IO.StreamWriter(@"c:\temp\SerializationOverview.xml"); writer.Serialize(wfile, b); wfile.Close(); // Now we can read the serialized book ... System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(Book)); System.IO.StreamReader file = new System.IO.StreamReader( @"c:\temp\SerializationOverview.xml"); Book overview = (Book)reader.Deserialize(file); file.Close(); Console.WriteLine(overview.title); }