1. System 的成员(类,结构,接口,委托,枚举)。具体的很多。不写了。
2. Math类。Math定义了一些标准的数学运算,如平方根、正弦、余弦、和对数等。Math类被定义为static类型,这意味着Math定义的所有方法都是静态方法,并且不可用构造Math类型的对象。这也意味着,Math被隐式密封,不能继承。
Math还定义了下面两个字段。
public const double E;
public const double PI;
E是自然对数的基数,通常为e。PI是圆周率。
3.与.NET内置类型对应的.NET结构。
.NET结构名 | C#关键字 |
System.Boolean | bool |
System.Char | char |
4.Array类
System中非常有用的一个类是Array,它是所有C#数组的基类。因此,Array方法能够应用于任意内置类型和自定义类型的数组。
Array类实现了以下接口:ICloneable、ICollection、IEnumerable和IList。ICollection、IEnumerable和IList在System.Collections名称空间中定义。
另外,许多方法都用到了IComparer或ICompare<T>类型的参数。IComparer接口位于System.Collections名称空间中,它定义的Compare()方法可以比较两个对象的值。如下所示;
int Compare(T v1,T v2)
其工作方式与非泛型形式相同:如果v1大于v2,那么它返回大于0的值。
4.1排序和搜索数组
int[] nums={5,4,6,2,1};
Array.Sort(nums); //查找 int inx=Array.BinarySearch(nums,14);
数组的基本类型是int类型
4.2反转数组
Array.Reverse(nums);
4.3复制数组
将一个数组中的全部或部分内容复制到另一个数组是另一种常用的数组操作。为了复制数组,需要使用到Copy()方法。
4.4使用谓语
谓语是System.Predicate类型的委托,可根据情况返回true或false。它的声明如下:
public delegate bool Predicate<T>(T obj)
obj传递的是条件测试的对象。如果obj满足条件,谓语必须返回true,否则必须返回false。Array的多个方法都使用了谓语,包括Exits()、Find()、FindIndex()、和FindAll()。
下面的程序演示了如何使用谓语来判断整数数组中是否包含一个负值。如果查找到负值,程序将获得数组中的第一个负值。为此,程序使用了Exists()和Find()。
class Program
{
static bool IsNeg(int v)
{
if (v < 0) return true;
return false;
}
static void Main(string[] args)
{
int[] nums = { 1, 4, -1, 5, 9 };
Console.Write("The nums is :");
foreach (int i in nums)
{
Console.Write(" " + i);
}
Console.WriteLine("");
if (Array.Exists(nums, Program.IsNeg))
{
Console.WriteLine("nums contains a negative value.");
int x = Array.Find(nums, Program.IsNeg);
Console.WriteLine("First negative value is :" + x);
}
else
Console.WriteLine("nums contains no negative values.");
Console.Read();
}
}
4.5使用Action委托
Array.Foreach()使用Action来操作数组中的每一个元素。Action有多种形式,每种形式采用不同数量的类型参数,下面是其中一种形式:
public delegate void Action<T>(T obj)
操作对象通过类系参数obj传递。在使用ForEach()的时候,数组的每一个元素都会一次被传递给obj。因此在使用Foreach()和Action委托的时候,可以使用一条语句操作整个数组。
public class MyClass
{
public int i;
public MyClass(int x) { i = x; }
}
class Program
{
static void Show(MyClass o)
{
Console.Write(o.i + " ");
}
static void Neg(MyClass o)
{
o.i = -o.i;
}
static void Main(string[] args)
{
MyClass[] nums = new MyClass[5];
nums[0] = new MyClass(5);
nums[1] = new MyClass(2);
nums[2] = new MyClass(3);
nums[3] = new MyClass(4);
nums[4] = new MyClass(1);
Console.Write("Contents of num:");
Array.ForEach(nums, Program.Show);
Console.WriteLine();
Array.ForEach(nums, Program.Neg);
Console.WriteLine("Contents of nums negated:");
Array.ForEach(nums, Program.Show);
Console.Read();
}
}
在程序设计中,往往需要将内置数据类型转换为字节数组。例如,有些硬件设备可能要求是用整数类型,而该值每次只能发送一个字节。相反的转换程序也同样经常出现。有时,数据以一组有序的字节序列形式被接受,在使用时必须将它转换为一种内置的数据类型。例如,一种设备可能以字节流形式输出整型值。无论是哪种转换,C#提供的BitConvert类都可以满足这些需求。它还定义以下字段:
public static readonly bool IsLittleEndian
在存储一个字的时候,如果当前环境吧地位有效字节存在第一位而高位有效字节存在第二位(这成为“小端”(
little-endian)格式),则IsLittleEndian字段为真;如果当前环境把高位有效字节存在第一位而低位有效字节存在第二位(这成为“大端”(big-endian)格式),则IsLittleEndian字段为假。基于Intel Pentium系列的机器使用的都采用小端格式。
6用Random产生随机数
要产生伪随机数序列,可以使用Random类。通常许多地方都会用到随机数序列,如仿真,和建模。序列的起点取决于种子(seed)值。该值可以由Random自动提供,也可以明确指定。
Random定义了下面两个构造函数:
public Random()
public Random(int seed)
第一个版本在 创建一个Random对象时用系统时间来计算种子值,而第二个版本用seed作为种子值。
7.内存管理和GC类
GC类封装了C#的垃圾回收功能。它还定义了下面的只读属性:
public static int MaxGeneration{get;}
MaxGeneration包含的是系统中最大的可用代数(generation number)。代数暗指一个分配操作的年龄。一个新的分配操作往往比一个老的分配操作具有更小的代数。代数能够帮助改进垃圾回收器的性能。
大多应用程序并不需要使用GC功能。但在某些特殊情况下,这些功能将非常有用。例如,开发人员可能希望在指定时间使用Collect()方法进行垃圾回收。当然,程序通常不会指定垃圾回收的时间。由于垃圾回收需要花费一定时间,因此在某些时效性强的任务执行过程中并不希望进行垃圾回收处理,而是在空闲时间进行或者使用其他类型的“内务处理”操作。
如果项目中有非托管代码,如下两个方法就非常重要:AddMemoryPressure()和RemoveMemoryPressure(),它们用于指示当前应用程序已经分配或释放的非托管内存的量。这两个方法非常重要,因为内存管理系统并不能检测非托管内存。如果程序分配大量非托管的内存,那么系统性能将由于潜在的空间内存减少而下降。想要获得大量的非托管内存时需要调用AddMemoryPressure(),这样CLR就会知道可用内存量减少情况。注意,调用RemoveMemoryPressure()仅用来指示前一个由AddMemoryPressure()分配的内存已释放。
8.Object类
Object类是C#对象类型的基础,它在C#中起核心作用。public Object()是它的构造函数,
它有两个方法比较重要:
public static bool Equals(object ob1,object ob2)
public static bool ReferenceEquals(object ob1,object ob2)
9.IComparable和IComparable<T>接口
为了允许对象能通过.Net Framework定义的各种方法与其他对象进行比较,很多类都需要实现IComparable或IComparable<T>接口。
如何实现:
IComparable的实现非常简单,它只包含一个方法:int CompareTo(object v)
此方法将主调对象与v的值进行比较。如果主调对象大于v则返回正数,相等就返回0,小于v则返回附属。
IComparable接口的泛型版本声明:public interface IComparable<T>
在此版本中,相比较的数据的类型参数由类型参数T传递。这样,CompareTo()的声明也发生了改变,如下所示:
Int CompareTo(T obj)
其中,可以明确指定CompareTo()操作的数据类型。与IComparable接口相比,IComparable<T>是类型安全的,因此应作为首选接口。
10 IEquatable<T>接口
需要定义两个对象如何比较相等性的所有类都会实现IEquatable<T>接口。该接口之定义了一个方法Equals(),如下所示:
bool Equals(T obj)
如果obj等于主调对象,则该方法返回true,否则返回false。
.NET Framework中的一些类和结构实现了IEquatable<T>接口,包括数值结构、char、Int32、Boolean和String。
11 IConvertiable接口
所有值类型结构、String和DataTime都实现IConvertible接口,它制定了各种类型的转换。通常用户实现的类不需要实现此接口。
12 ICloneable接口
通过实现ICloneable接口,能够实现对象的复制。ICloneable只定义了一个方法Clone(),如下所示:
object Clone()
此方法用于复制主调对象。Clone()具体实现决定了复制操作的执行方式。通常有两种复制方法:深复制和浅复制。在进行深复制时,副本和源对象是完全独立的。因此,如果源对象包含另一个对象O的引用,那么深复制之后也会创建O的副本。而在浅复制中,只有成员会被复制,但这些成员指向的对象却不会。如果对象引用了另一个对象O,那么执行浅复制之后,副本和源对象都引用同一个对象O。O的改变将同时影响到副本和源对象。通常,Clone()都被实现为深复制,浅复制可以使用Object定义的MemberwiseClone()。
示例:
public class X
{
public int a;
public X(int x) { a = x; }
}
public class Test : ICloneable
{
public X o;
public int b;
public Test(int x, int y)
{
o = new X(x);
b = y;
}
public void Show(string name)
{
Console.WriteLine(name + " values are");
Console.WriteLine("o.a:{0},b:{1}", o.a, b);
}
#region ICloneable 成员
public object Clone()
{
Test temp = new Test(o.a, b);
return temp;
}
#endregion
}
class Program
{
static void Main(string[] args)
{
Test ob1 = new Test(10, 20);
ob1.Show("ob1");
Console.WriteLine("Make ob2 a clone of ob1.");
Test ob2 = (Test)ob1.Clone();
ob2.Show("ob2");
Console.WriteLine("Changing ob1.a.a to 99 and ob1.b to 88");
ob1.o.a = 99;
ob1.b = 88;
ob1.Show("ob1");
ob2.Show("ob2");
Console.Read();
}
}
13 IFormatProvider接口和IFormattable接口
IFormatProvider接口定义了方法GetFormat(),此方法返回的对象可以控制如何把数据格式化为可读字符串。GetFormat()的基本形式为:
object GetFormat(Type fmt)
其中,fmt指定了要获取的格式对象。
IFormattable接口支持格式化可读输出的操作,它定义了以下方法:
string ToString(string fmt,IFormatProvider fmtpvdr);
其中,fmt指定格式化指令而fmtpvdr指定用来格式化的程序。
详细操作,请看下章
呵呵。。