字符串处理
Q: System.String是值类型还是引用类型
System.String是引用类型,它的对象在初始化之后就不能再做修改,任何试图修改字符串对象的动作将导致一个新的字符串对象生成。
Q: 如何在string和Byte[]对象之间进行转换
字符串和字节数组的转换依赖于编码方式的使用,不同的编码标准将使用不同的算法进行。System.Text.Encoding类型提供了大部分常见编码算法支持,用以进行字符串和字节数组之间的转换。下面是代码例子:
class Program { static void Main(string[] args) { string s = "我是字符串, I am string"; Byte[] utf8 = StringToByte(s, Encoding.UTF8); Byte[] gb2312 = StringToByte(s, Encoding.GetEncoding("GB2312")); Byte[] unicode = StringToByte(s, Encoding.Unicode); Console.WriteLine(utf8.Length); Console.WriteLine(gb2312.Length); Console.WriteLine(unicode.Length); Console.WriteLine(ByteToString(utf8, Encoding.UTF8)); Console.WriteLine(ByteToString(gb2312, Encoding.GetEncoding("GB2312"))); Console.WriteLine(ByteToString(unicode, Encoding.Unicode)); Console.ReadLine(); } //把字符串转换为字节数组 static Byte[] StringToByte(string s, Encoding encoding) { return encoding.GetBytes(s); } //把字节数组转换为字符串 static string ByteToString(Byte[] b, Encoding encoding) { return encoding.GetString(b); } }
Q: SecureString的实例如何被分配和释放
System.SecureString提供了加密的字符串类型。其对象会被分配在非托管的内存中,并且以加密的形式保存。对于SecureString的操作都是逐字符的,SecureString会负责在操作时进行解密和加密。
Q: 什么是字符串池机制
字符串池机制目的在于改善程序的性能。CLR会保留程序中出现过的字符串对象的集合,并且在需要新的字符串时,先检查已有的集合,在查找成功时返回已有对象的引用。
常用集合和泛型
Q: int[]是引用类型还是值类型
数组类型是一族类型,它们都继承自System.Array,而System.Array继承自System.Object。所有的数组类型都是引用类型。
Q: 数组之间如何进行转换
数组类型在符合条件的情况下可以进行隐式转换,条件为:数组维数必须相同,目标项目类型和源项目类型必须存在隐式或者显式转换关系;源数组的项目类型不是值类型。数组类型可以通过Array.ConvertAll方法进行内容转换,该方法需要使用者提供一个转换算法,以委托或者方法的形式传入Array.ConvertAll方法中。
Q:解释泛型的基本原理
泛型类似于C++中的模板,允许程序员定义更通用的类型和算法,并且在具体使用时再生成具体的封闭类型。所有带泛型参数的类型都是一个开放式类型,它不能被实例化,但具备所有封闭类型的其他特性。
Q: 什么是泛型的主要约束和次要约束
每个泛型参数可以有至多一个主要约束,泛型的主要约束是指指定泛型参数必须是或者继承自某个引用类型,有两个特殊的主要约束:class和struct,分别代表泛型参数是引用类型和值类型。每个泛型参数可以有无限个次要约束,次要约束和主要约束的语法基本相同,但它规定的是某个泛型参数必须实现所有次要约束指定的接口。
流和序列化
Q: 什么是流,.NET中有哪些常见的流
流是对于字节集合对象的一种操作。.NET中常见的流类型有FileStream、NetworkStream、MemoryStream等。
Q: Serializable特性有何作用
通过为类型添加Serializable特性,可以使对象申明为可被序列化,即可被诸如BinaryFormatter等类型的对象序列化和反序列化。
Q: 如何自定义序列化和反序列化的过程
通过实现ISerializable接口中的GetObjectData方法可以实现自定义的序列化,而通过添加带有SerializationInfo和StreamingContext参数的构造方法可以自定义反序列化的过程。