2017-9-19C#笔记(LinQ标准运算符,String类,String方法,结构体,静态构造函数,枚举类型,位标识)
- 在LINQ中的标准查询运算符
写LINQ的时候有两种语法:查询语法和方法语法,其中方法语法是命令形式的,它使用的是标准的方法调用。方法是一组叫做标准查询运算符的方法。
标准查询运算符有一系列叫做API的方法组成,他能让我们查询任何.NET数据集合。有关标准查询运算符的重要特性如下:
(1) 被查询的结合对象叫做序列,它必须实现IEnumerable<T>接口, T是类型;
(2) 标准查询运算符使用方法语法
(3) 一些运算符返回IEnumberable对象(或其他序列)二其他一些运算符返回标量。返回标量的运算符立刻执行,二返回其他科枚举类型对象的值会被延迟迭代。
标准运算符提供了包括筛选,投影,聚合,排序等功能在内的查询功能。
2.String类
String类表示文本,即一系列Unicode字符。位于命名空间system中,字符串是Unicode码的有序集合,用于表示文本。String对象是System.char对象的有序集合,用于表示字符串。String对象的值是该有序集合的内容,并且该值是不可改变的。
索引是Char对象在String中的卫位置,而不是Unicode字符的位置。索引是从零开始,从字符串的其实位置(其索引为零)计起的非负数字。连续的索引值可能而不与连续的Unicode字符相对相应。
若要使用每个Unicode字符而不是每个Char对象,需使用System.Globalization.StringInfo类。String类停用的成员执行以下操作:比较String对象;返回String对象内字符或字符串的索引;复制String对象的值;分割字符串货或组合字符串;修改字符串的值;将数字、日期和时间或枚举值得格式设置为字符串;对字符串进行规范化。
String类的属性有两个:
(1) Chars:获取当前String对象中位于指定字符位置的字符
(2) Length:获取当前String对象中的字符数
- String方法
(1) Compare 对两个字符实现比较功能,返回的是表示两个字符串比较的结果的数值,也就是关系的数据,
(2) Concat 连接
(3) Contains 返回一个布尔类型,该值指示指定的String对象是否出现在此字符串中
(4) EndWith 返回一个布尔类型,确定字符串的结尾是否与指定的字符串匹配
(5) StertWith 返回一个 布尔类型,确定字符串的开始是否与指定的字符串匹配
(6) Equals 是否相同
(7) Format 将指定的字符串中的一个或者多个人格式项替换为指定对象的字符串表示形式
(8) IndexOf 报告指定字符或者字符串在此示例中的第一个匹配项的索引,相似的还有LastOfAny,LastIndexOf,LastIndexAny等方法。
(9) Insert方法在此示例中的指定而为之插入一个指定的String实例。
(10) Remove 删除
(11) Replace
(12) Split 实现按照指定字符或者字符串进行分割形成多个子串的功能
(13) SubString 实现按照指定起始位置和指定长度对字符串取子串的功能
(14) ToUpper和ToLower 大小写的转换
(15) Trim方法,删除字符串中所有前导空白符和尾部空白符
- StringBuilder类
StringBuilder类表示可变字符字符串,因为在通过追加,移除,替换或插入字符二创建它后可以对它进行修改。
StringBuilder的容量是实例在任何给定时间可存储的最大字符数,并且大于或等于实例值的字符串表示形式的长度。容量可通过Capacity属性或EnsureCapacity方法来增加或者减少,但它不能小于Length属性的值。如果在初始化StringBuilder的实例时没有指定容量或最大容量,则使用特定于实现的默认值。
String对象串联操作总是用现有字符串和数据创建新的对象。
StringBuilder对象维护一个缓冲区,以便容纳新数据的串联。如果没有足够的空间,新数据将被追加到缓冲区的末尾;否则,将分配一个新的,更大的缓冲区,原始缓冲区中的数据被复制到新的缓冲区,然后讲新数据追加到新的缓冲区。String或StringBuilder对象的串联操作的性能取决于内存分配的发生频率。String串联操作每次都飞陪内存,而StringBuild串联操作仅当StringBuilder对象缓冲区太小而无法容纳新数据时才分配内存。
如果串联固定数量的String对象,则String类更适合串联操作,如果串联任意的字符串,则StringBuilder对象更适合操作。
StringBuilder累的属性:
(1) Chars:获取或设置当前StringBuilder对象中指定字符位置的字符
(2) Length:获取或设置当前StringBuilder对象的长度。
(3) Capacity:获取或设置可包含在当前实例所分配的内存中的最大字符数
(4) MaxCapacity:获取此实例的最大容量。
StringBuilder 类中的方法:
(1) Append方法:实现在此实例的结尾追加指定数据类型值得字符串表示形式。
(2) Clear方法:从当前StringBUilder实例中移除字符。
(3) Equals方法:返回一个值,该值指示实例是否与指定的对象相等
(4) Insert
(5) Replace
(6) ToString方法
- 结构体
结构体属于值类型的数据类型,可以根据其使用范围选择定义在某个类的内部或者定义在所有累的外部。一般来说,放在类内部定义的结构体类型只在该类中使用,放在类外部定义的结构体可以在当前命名空间范围内使用。C#中结构体不放在含住或者方法的内部进行定义。
结构体的补充说明如下:
(1) struct是定义结构体类型的一个关键字,不代表一种数据类型。
只有使用strct关键字定义了具体的结构体类型之后才能定义相应的变量,因此不能使用struct关键字作为变量的数据类型。
(2) 结构体类型定义借助stuct关键字向编译器声明了一种新的数据库类型,而不是变量。对于该数据类型并没有分配新颖的存储空间,因此不能直接对使用struct关键字定义的数据类型进行赋值等应用与变量的操作,不能对结构体类型的成员进行初始化。
(3) 结构体类型的成员既可以是简单的数据类型,也可以是结构体类型的,即结构体的定义允许嵌套。
(4) C#中不支持结构体类型的递归定义,也就是不允许结构体类型的成员是本结构体的类型。
(5) 结构体类型使用一对大括号界定一个属于本省类型子那个的作用于,u因此其成员名称可以与外部标识符相同。结构体类型可以在右边大括号}后使用分号。
(6) C#中的结构体除了数据成员之外,它也有函数成员。结构体与类最大的区别就是类是引用类型,二结构体是值类型;结构体是密封的,不能继承;分配结构比分配类的实例需要更少的消耗,所以对于具有值类型语义的小型数据结构尤为有用。
6.静态构造函数
结构体类型也可以有静态构造函数,静态构造函数用于初始化静态数据成员。静态构造函数有如下特点“
(1) 静态构造函数不能有访问修饰符和参数
(2) 静态构造函数不能访问实例成员
(3) 静态构造函数无法直接进行调用
结构和类的静态函数的触发规则不一样,累的静态构造函数是在穿件第一个实例引用或引用任何静态成员之前自动调用的,二结构的静态函数在以下情况调用:
使用显示声明的构造函数初始化;
调用结构的方法或访问结构的静态数据成员(无论是读取还是赋值,访问实例数据成员不会触发CLR自动调用讲台的构造函数)。
结构体对象赋值时,本质上是把一个对象内存空间中的全体成员赋值到另一个对象存储空间中。如果结构体类型中包括大量发的数据成员时,结构体对象的赋值会耗费大量时间。
7.枚举类型
每个枚举类型都有一个底层整数类型,默认为int。每个成员被赋值为一个底层类型的常量值;默认情况下,编译器吧第一个成员赋值为0,并对每一个后续成员的值比前一个成员多1;
如果制定了枚举常量的值后,其后续的枚举常量就从当前枚举常量依次递增1;
使用枚举类型时需要注意的:
(1):与结构图类型一样,枚举是值类型,因此直接存储他们的数据,而不是分开存储数据与引用。
(2)枚举只有一种类型的成员:命名的整数值常量;
(3)不能对枚举类型的成员使用修饰符。他们都隐式地具有和枚举相同的可访问性;
(4)由于枚举类型的成员是常量,即使在没有该枚举类型的变量时他们也可以访问。使用枚举类型名、成员引用运算符加成员名的形式就可以实现对枚举类型成员的访问
(5)不允许不同枚举类型的成员进行比较,即使他们的结构和名称完全相同;
(6)通常情况下,最好是在命名空间直接定义枚举,以便该命名空间中的所有类都能够同样方便的访问它。但是,还可以将枚举嵌套在类或结构中;
(7)基础类型指定为每个枚举分配的存储大小,但是从enum类型到整型的转换需要用显示类型转换来完成。
8.位标识
程序员长期使用单字的不同位作为表示一组开/关标志的紧凑方法。枚举类型为此提供了简便的方法实现:
(1) 确定需要多少个标志位,并选择一种足够多位的无符号类型来保持它。
(2) 确定每个位代表的含义,并为之取名,声明一个选中的整数类型的枚举,每个成员有一个比特位置表示。
(3) 使用位或运算符设置保持该位标志的字中的适当位;
(4) 使用位与运算符解开位标志。
例如下面的枚举
[Flages]
enum CardDeckSetting:unit
{
singleDeck=0x01;位0
LargePicture=0x02;位1
FancyNumber = 0x04;w位2
Animation=0x08;位3
}
实现标记枚举需要注意:
(1) 在枚举声明的顶部添加[Flages]标记;
(2) 各个枚举项的值应符合2的幂次方数规律。