【微软技术栈】C#.NET 字符串

本文内容

  1. string 与System.String
  2. 声明和初始化字符串
  3. 字符串的不可变性
  4. 带引号的字符串字面量
  5. 逐字字符串文本
  6. 原始字符串文本
  7. 格式字符串
  8. 子字符串
  9. 访问单个字符
  10. Null 字符串和空字符串
  11. 使用 stringBuilder 快速创建字符串
  12. 字符串、扩展方法和 LINQ
  13. 开源库 Com.Gitusme.Net.Extensiones.Core 的使用

字符串是值为文本的 String 类型对象。 文本在内部存储为 Char 对象的依序只读集合。 在 C# 字符串末尾没有 null 终止字符;因此,一个 C# 字符串可以包含任何数量的嵌入的 null 字符 ('\0')。 字符串的 Length 属性表示其包含的 Char 对象数量,而非 Unicode 字符数。 若要访问字符串中的各个 Unicode 码位,请使用 StringInfo 对象。

1、string 与System.String

在 C# 中,string 关键字是 String 的别名。 因此,String 和 string 是等效的(虽然建议使用提供的别名 string),因为即使不使用 using System;,它也能正常工作。 String 类提供了安全创建、操作和比较字符串的多种方法。 此外,C# 语言重载了部分运算符,以简化常见字符串操作。 

2、声明和初始化字符串

可以使用各种方法声明和初始化字符串,如以下示例中所示:

// Declare without initializing.
string message1;

// Initialize to null.
string message2 = null;

// Initialize as an empty string.
// Use the Empty constant instead of the literal "".
string message3 = System.String.Empty;

// Initialize with a regular string literal.
string oldPath = "c:\\Program Files\\Microsoft Visual Studio 8.0";

// Initialize with a verbatim string literal.
string newPath = @"c:\Program Files\Microsoft Visual Studio 9.0";

// Use System.String if you prefer.
System.String greeting = "Hello World!";

// In local variables (i.e. within a method body)
// you can use implicit typing.
var temp = "I'm still a strongly-typed System.String!";

// Use a const string to prevent 'message4' from
// being used to store another string value.
const string message4 = "You can't get rid of me!";

// Use the String constructor only when creating
// a string from a char*, char[], or sbyte*. See
// System.String documentation for details.
char[] letters = { 'A', 'B', 'C' };
string alphabet = new string(letters);

不要使用 new 运算符创建字符串对象,除非使用字符数组初始化字符串。

使用 Empty 常量值初始化字符串,以新建字符串长度为零的 String 对象。 长度为零的字符串文本表示法是“”。 通过使用 Empty 值(而不是 null)初始化字符串,可以减少 NullReferenceException 发生的可能性。 尝试访问字符串前,先使用静态 IsNullOrEmpty(String) 方法验证字符串的值。

3、字符串的不可变性

字符串对象是“不可变的”:它们在创建后无法更改。 看起来是在修改字符串的所有 String 方法和 C# 运算符实际上都是在新的字符串对象中返回结果。 在下面的示例中,当 s1 和 s2 的内容被串联在一起以形成单个字符串时,两个原始字符串没有被修改。 += 运算符创建一个新的字符串,其中包含组合的内容。 这个新对象被分配给变量 s1,而分配给 s1 的原始对象被释放,以供垃圾回收,因为没有任何其他变量包含对它的引用。

string s1 = "A string is more ";
string s2 = "than the sum of its chars.";

// Concatenate s1 and s2. This actually creates a new
// string object and stores it in s1, releasing the
// reference to the original object.
s1 += s2;

System.Console.WriteLine(s1);
// Output: A string is more than the sum of its chars.

由于字符串“modification”实际上是一个新创建的字符串,因此,必须在创建对字符串的引用时使用警告。 如果创建了字符串的引用,然后“修改”了原始字符串,则该引用将继续指向原始对象,而非指向修改字符串时所创建的新对象。 以下代码阐释了此行为:

string str1 = "Hello ";
string str2 = str1;
str1 += "World";

System.Console.WriteLine(str2);
//Output: Hello

4、带引号的字符串字面量

带引号的字符串字面量在同一行上以单个双引号字符 (") 开头和结尾。 带引号的字符串字面量最适合匹配单个行且不包含任何转义序列的字符串。 带引号的字符串字面量必须嵌入转义字符,如以下示例所示:

string columns = "Column 1\tColumn 2\tColumn 3";
//Output: Column 1        Column 2        Column 3

string rows = "Row 1\r\nRow 2\r\nRow 3";
/* Output:
    Row 1
    Row 2
    Row 3
*/

string title = "\"The \u00C6olean Harp\", by Samuel Taylor Coleridge";
//Output: "The Æolean Harp", by Samuel Taylor Coleridge

5、逐字字符串文本

对于多行字符串、包含反斜杠字符或嵌入双引号的字符串,逐字字符串字面量更方便。 逐字字符串将新的行字符作为字符串文本的一部分保留。 使用双引号在逐字字符串内部嵌入引号。 下面的示例演示逐字字符串的一些常见用法:

string filePath = @"C:\Users\scoleridge\Documents\";
//Output: C:\Users\scoleridge\Documents\

string text = @"My pensive SARA ! thy soft cheek reclined
    Thus on mine arm, most soothing sweet it is
    To sit beside our Cot,...";
/* Output:
My pensive SARA ! thy soft cheek reclined
    Thus on mine arm, most soothing sweet it is
    To sit beside our Cot,...
*/

string quote = @"Her name was ""Sara.""";
//Output: Her name was "Sara."

6、原始字符串文本

从 C# 11 开始,可以使用原始字符串字面量更轻松地创建多行字符串,或使用需要转义序列的任何字符。 原始字符串字面量无需使用转义序列。 你可以编写字符串,包括空格格式,以及你希望在输出中显示该字符串的方式。 原始字符串字面量:

  • 以至少三个双引号字符序列 (""") 开头和结尾。 可以使用三个以上的连续字符开始和结束序列,以支持包含三个(或更多)重复引号字符的字符串字面量。
  • 单行原始字符串字面量需要左引号和右引号字符位于同一行上。
  • 多行原始字符串字面量需要左引号和右引号字符位于各自的行上。
  • 在多行原始字符串字面量中,会删除右引号左侧的任何空格。

6.1 字符串转义序列

转义序列字符名称Unicode 编码
\'单引号0x0027
\"双引号0x0022
\反斜杠0x005C
\0null0x0000
\a警报0x0007
\bBackspace0x0008
\f换页0x000C
\n换行0x000A
\r回车0x000D
\t水平制表符0x0009
\v垂直制表符0x000B
\uUnicode 转义序列 (UTF-16)\uHHHH(范围:0000 - FFFF;示例:\u00E7 =“ç”)
\UUnicode 转义序列 (UTF-32)\U00HHHHHH(范围:000000 - 10FFFF;示例:\U0001F47D = "👽")
\x除长度可变外,Unicode 转义序列与“\u”类似\xH[H][H][H](范围:0 - FFFF;示例:\x00E7\x0E7 或 \xE7 =“ç”)

 警告

使用 \x 转义序列且指定的位数小于 4 个十六进制数字时,如果紧跟在转义序列后面的字符是有效的十六进制数字(即 0-9、A-F 和 a-f),则这些字符将被解释为转义序列的一部分。 例如,\xA1 会生成“¡”,即码位 U+00A1。 但是,如果下一个字符是“A”或“a”,则转义序列将转而被解释为 \xA1A 并生成“ਚ”(即码位 U+0A1A)。 在此类情况下,如果指定全部 4 个十六进制数字(例如 \x00A1),则可能导致解释出错。

 备注

在编译时,逐字字符串被转换为普通字符串,并具有所有相同的转义序列。 因此,如果在调试器监视窗口中查看逐字字符串,将看到由编译器添加的转义字符,而不是来自你的源代码的逐字字符串版本。 例如,原义字符串 @"C:\files.txt" 在监视窗口中显示为“C:\files.txt”。

7、格式字符串

格式字符串是在运行时以动态方式确定其内容的字符串。 格式字符串是通过将内插表达式或占位符嵌入字符串大括号内创建的。 大括号 ({...}) 中的所有内容都将解析为一个值,并在运行时以格式化字符串的形式输出。 有两种方法创建格式字符串:字符串内插和复合格式。

7.1 字符串内插

在 C# 6.0 及更高版本中提供,内插字符串由 $ 特殊字符标识,并在大括号中包含内插表达式。

使用字符串内插来改善代码的可读性和可维护性。 字符串内插可实现与 String.Format 方法相同的结果,但提高了易用性和内联清晰度。

var jh = (firstName: "Jupiter", lastName: "Hammon", born: 1711, published: 1761);
Console.WriteLine($"{jh.firstName} {jh.lastName} was an African American poet born in {jh.born}.");
Console.WriteLine($"He was first published in {jh.published} at the age of {jh.published - jh.born}.");
Console.WriteLine($"He'd be over {Math.Round((2018d - jh.born) / 100d) * 100d} years old today.");

// Output:
// Jupiter Hammon was an African American poet born in 1711.
// He was first published in 1761 at the age of 50.
// He'd be over 300 years old today.

从 C# 10 开始,当用于占位符的所有表达式也是常量字符串时,可以使用字符串内插来初始化常量字符串。

从 C# 11 开始,可以将原始字符串字面量与字符串内插结合使用。 使用三个或更多个连续双引号开始和结束格式字符串。 如果输出字符串应包含 { 或 } 字符,则可以使用额外的 $ 字符来指定开始和结束内插的 { 和 } 字符数。 输出中包含任何更少的 { 或 } 字符序列。 以下示例演示了如何使用该功能来显示点与原点的距离,以及如何将点置于大括号中:

int X = 2;
int Y = 3;

var pointMessage = $$"""The point {{{X}}, {{Y}}} is {{Math.Sqrt(X * X + Y * Y)}} from the origin.""";

Console.WriteLine(pointMessage);
// Output:
// The point {2, 3} is 3.605551275463989 from the origin.

7.2 复合格式设置

String.Format 利用大括号中的占位符创建格式字符串。 此示例生成与上面使用的字符串内插方法类似的输出。

var pw = (firstName: "Phillis", lastName: "Wheatley", born: 1753, published: 1773);
Console.WriteLine("{0} {1} was an African American poet born in {2}.", pw.firstName, pw.lastName, pw.born);
Console.WriteLine("She was first published in {0} at the age of {1}.", pw.published, pw.published - pw.born);
Console.WriteLine("She'd be over {0} years old today.", Math.Round((2018d - pw.born) / 100d) * 100d);

// Output:
// Phillis Wheatley was an African American poet born in 1753.
// She was first published in 1773 at the age of 20.
// She'd be over 300 years old today.

8、子字符串

子字符串是包含在字符串中的任何字符序列。 使用 Substring 方法可以通过原始字符串的一部分新建字符串。 可以使用 IndexOf 方法搜索一次或多次出现的子字符串。 使用 Replace 方法可以将出现的所有指定子字符串替换为新字符串。 与 Substring 方法一样,Replace 实际返回的是新字符串,且不修改原始字符串。 

string s3 = "Visual C# Express";
System.Console.WriteLine(s3.Substring(7, 2));
// Output: "C#"

System.Console.WriteLine(s3.Replace("C#", "Basic"));
// Output: "Visual Basic Express"

// Index values are zero-based
int index = s3.IndexOf("C");
// index = 7

9、访问单个字符

可以使用包含索引值的数组表示法来获取对单个字符的只读访问权限,如下面的示例中所示:

string s5 = "Printing backwards";

for (int i = 0; i < s5.Length; i++)
{
    System.Console.Write(s5[s5.Length - i - 1]);
}
// Output: "sdrawkcab gnitnirP"

如果 String 方法不提供修改字符串中的各个字符所需的功能,可以使用 StringBuilder 对象“就地”修改各个字符,再新建字符串来使用 StringBuilder 方法存储结果。 在下面的示例中,假定必须以特定方式修改原始字符串,然后存储结果以供未来使用:

string question = "hOW DOES mICROSOFT wORD DEAL WITH THE cAPS lOCK KEY?";
System.Text.StringBuilder sb = new System.Text.StringBuilder(question);

for (int j = 0; j < sb.Length; j++)
{
    if (System.Char.IsLower(sb[j]) == true)
        sb[j] = System.Char.ToUpper(sb[j]);
    else if (System.Char.IsUpper(sb[j]) == true)
        sb[j] = System.Char.ToLower(sb[j]);
}
// Store the new string.
string corrected = sb.ToString();
System.Console.WriteLine(corrected);
// Output: How does Microsoft Word deal with the Caps Lock key?

10、Null 字符串和空字符串

空字符串是包含零个字符的 System.String 对象实例。 空字符串常用在各种编程方案中,表示空文本字段。 可以对空字符串调用方法,因为它们是有效的 System.String 对象。 对空字符串进行了初始化,如下所示:

string s = String.Empty;

相比较而言,null 字符串并不指 System.String 对象实例,只要尝试对 null 字符串调用方法,都会引发 NullReferenceException。 但是,可以在串联和与其他字符串的比较操作中使用 null 字符串。 以下示例说明了对 null 字符串的引用会引发和不会引发意外的某些情况:

string str = "hello";
string nullStr = null;
string emptyStr = String.Empty;

string tempStr = str + nullStr;
// Output of the following line: hello
Console.WriteLine(tempStr);

bool b = (emptyStr == nullStr);
// Output of the following line: False
Console.WriteLine(b);

// The following line creates a new empty string.
string newStr = emptyStr + nullStr;

// Null strings and empty strings behave differently. The following
// two lines display 0.
Console.WriteLine(emptyStr.Length);
Console.WriteLine(newStr.Length);
// The following line raises a NullReferenceException.
//Console.WriteLine(nullStr.Length);

// The null character can be displayed and counted, like other chars.
string s1 = "\x0" + "abc";
string s2 = "abc" + "\x0";
// Output of the following line: * abc*
Console.WriteLine("*" + s1 + "*");
// Output of the following line: *abc *
Console.WriteLine("*" + s2 + "*");
// Output of the following line: 4
Console.WriteLine(s2.Length);

11、使用 stringBuilder 快速创建字符串

.NET 中的字符串操作进行了高度的优化,在大多数情况下不会显著影响性能。 但是,在某些情况下(例如,执行数百次或数千次的紧密循环),字符串操作可能影响性能。 StringBuilder 类创建字符串缓冲区,用于在程序执行多个字符串操控时提升性能。 使用 StringBuilder 字符串,还可以重新分配各个字符,而内置字符串数据类型则不支持这样做。 例如,此代码更改字符串的内容,而无需创建新的字符串:

System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet");
sb[0] = 'C';
System.Console.WriteLine(sb.ToString());
//Outputs Cat: the ideal pet

在以下示例中,StringBuilder 对象用于通过一组数字类型创建字符串:

var sb = new StringBuilder();

// Create a string composed of numbers 0 - 9
for (int i = 0; i < 10; i++)
{
    sb.Append(i.ToString());
}
Console.WriteLine(sb);  // displays 0123456789

// Copy one character of the string (not possible with a System.String)
sb[0] = sb[9];

Console.WriteLine(sb);  // displays 9123456789

12、字符串、扩展方法和 LINQ

由于 String 类型实现 IEnumerable<T>,因此可以对字符串使用 Enumerable 类中定义的扩展方法。 为了避免视觉干扰,这些方法已从 String 类型的 IntelliSense 中排除,但它们仍然可用。 还可以使用字符串上的 LINQ 查询表达式。 

13、开源库 Com.Gitusme.Net.Extensiones.Core 的使用

13.1 项目介绍

Com.Gitusme.Net.Extensiones.Core是一个.Net扩展库。当前最新版本1.0.4,提供了常见类型转换,可减少代码量,并提高编程效率。基于.Net Standard 2.0开发,支持windows、linux、IOS等多平台。

13.2 为项目添加依赖

打开NuGet包管理,搜索”Com.Gitusme.Net.Extensiones.Core“关键字,安装最新版本。

13.3 代码中使用
示例 1:

            // Example 1: 判断string是否为null

            string str = null;

            if (str.IsNullOrEmpty())

            {

                System.Console.WriteLine("Example 1 输出结果:" + "null");

            }

            // Example 2: 判断string是否匹配正则

            string hello = "Hello, gitusme";

            var isMatch = hello.IsMatch(@"Hello, \w+");

            System.Console.WriteLine("Example 2 输出结果:" + isMatch);

            // Example 3: 将string转换为Json实体对象

            string json = "{\"Id\":0,\"Name\":\"Json Object\"}";

            var jsonObj = json.ToJsonObject<MyJsonObject>();

            System.Console.WriteLine("Example 3 输出结果:" + jsonObj.Name);

            // Example 4: 将string转换为Xml实体对象

            string xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +

                "<root xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" id=\"0\">" +

                "<name>Xml Object</name>" +

                "</root>";

            var xmlObj = xml.ToXmlObject<MyXmlObject>();

            System.Console.WriteLine("Example 4 输出结果:" + xmlObj.Name);

            // Example 5: 将string转换为DateTime

            string date = "2023/10/22 21:32:00";

            var dateTime = date.ToDateTime();

            System.Console.WriteLine("Example 5 输出结果:" + dateTime.ToString());

            // Example 6: 将string转换为字符数组

            string gitusme = "gitusme";

            var array = gitusme.ToCharArray();

            System.Console.WriteLine("Example 6 输出结果:" + array);

            // Example 7: 将string转换为int32

            string intStr = "100";

            var intValue = intStr.ToInt32() + 10;

            System.Console.WriteLine("Example 7 输出结果:" + intValue);

            // Example 8: 将string转换为decimal

            string decimalStr = "3.141592653589793238462643383279502884197";

            var decimalValue = decimalStr.ToDecimal();

            System.Console.WriteLine("Example 8 输出结果:" + decimalValue);

            // Example 9: 将string转换为uri

            string uriStr = "https://github.com/gitusme/Com.Gitusme.Net.Extensiones";

            var uriValue = uriStr.ToUri();

            System.Console.WriteLine("Example 9 输出结果:" + uriValue.Host);

            // Example 10: 将string转换为color

            string colorStr = "#aabbcc";

            var colorValue = colorStr.ToColor();

            System.Console.WriteLine("Example 10 输出结果:" + colorValue);

运行结果:

示例 2:

            // Example 1: 判断对象是否为null

            MyObject obj = null;

            if (obj.IsNull())

            {

                System.Console.WriteLine("Example 1 输出结果:" + "null");

            }

            // Example 2: 对象为null的时候,返回传入的默认值

            var def = obj.OrDefault(new MyObject());

            System.Console.WriteLine("Example 2 输出结果:" + def);

            // Example 3: 如果对象不为null,则执行传入的Action行为

            def.IfPresent((it) =>

            {

                System.Console.WriteLine("Example 3 输出结果:" + it.Name);

            });

            // Example 4: 将Xml对象转换为Xml文本

            var xmlObj = new MyXmlObject();

            string xml = xmlObj.ToXml();

            System.Console.WriteLine("Example 4 输出结果:" + xml);

            // Example 5: 将Json对象转换为Json文本

            var jsonObj = new MyJsonObject();

            string json = jsonObj.ToJson();

            System.Console.WriteLine("Example 5 输出结果:" + json);

运行结果:

您能够认真学习完本篇,实属不易,欢迎点赞加关注,收藏交流和探讨。今天是1024程序员节,祝优秀的您节日快乐!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
未来的视窗、组件程序的设计潮流,将是采用.NET平台为底层服务,并使用C#语言开发。C#微软.NET技术量身订制的语言,它拥有简洁的语法和便于开发的特性。本书将C#的特色与应用,借助实战演练的方式,阶段性地引导读者建置完整的应用程序,是您掌握新技术的最佳捷径。【图书目录】-C#.NET技术平台实战演练PARTI基础语法篇第1章.NET概述1-1 软件开发结构的演进1-2 桌上型单机应用程序1-3 主从结构应用程序1-4 分布式应用程序结构1-4-1 WindowsDNA(WindowsDistributedInternetArchitecture)1-4-2 WindowsDNA20001-5 下一代的互联网平台:Microsoft.NET1-5-1.NETFramework1-5-2 公共语言执行环境1-5-3 类函数库1-5-4 .NET程序语言第2章C#概论2-1C#应用程序的结构2-1-1 分析C#应用程序结构2-1-2 Using前置命令与System名称空间2-2 标准的输入/输出2-2-1 输出字符串到Console2-2-2格式化输出字符申2-2-3 读取数据2-3 程序代码注释生成XML文件2-4 编译C#应用程序编译器选项第3章实值类型变量3-1 公共类型系统3-2 实值类型与参考类型实值类型与参考类型的差异3-3 找寻基础类3-4 实值类型3-4-1 简单类型3-4-2 命名原则3-4-3 定义变量3-4-4 指定变量的值3-5常用的操作数使用递增与递减操作数3-6 操作数优先顺序3-7 使用列举类型3-7-1enum类型常用的方法3-7-2使用enum类型常犯的错误3-8使用struct类型3-9 数据类型转换3-9-1 隐含式转换3-9-2明确式转换第4章语句与例外处理4-1 程序区块4-2 语句类型4-2-1 if语句4-2-2 串联if(cascadingif)4-2-3switch语句4-2-4在switch使用goto4-3重复执行的语句4-3-1while语句4-3-2do语句4-3-3for语句4-3-4foreach语句4-4跳转语句4-4-lgoto语句4-4-2break与continue语旬4-5例外错误4-5-1生成例外错误4-5-2检查数值溢出第5章方法与参数5-l定义方法定义方法的语法5-2调用其他类的方法使用return跳出程序区段5-3声明局域变量5-4共用变量变量范围冲突5-5使用返回值非void的方法必须有返回值5-6声明与使用参数声明参数的语法5-7参数传递机制5-7-1使用传值参数5-7-2使用传出参数5-7-3使用传参考参数5-8使用传参考参数常见的错误5-9声明不定长度的参数使用foreach语句5-10使用递回方法5-11覆写方法第6章数组6-1什么是数组?6-2声明数组6-3数组维数6-4存取数组元素6-5使用Length属性检查数组上下限6-6 数组与集合的比较6-7 声明时初始化数组6-7-1 使用简短的表示法6-7-2 初始化多维的数组6-8 执行时期指定数组的大小6-9 JaggedArray6-10 复制数组变量6-11 数组的应用6-11-l 数组常用的属性6-11-2 数组常用的方法6-11-3 由方法返回一个数组6-11-4 把数组当参数传递6-12 命令提示符参数第7章面向对象程序设计7-1 面向对象的缘由7-1-1 增加程序代码重复使用7-1-2 原始程序代码共用阶段7-2 类7-3 名称空间7-4 降低维护的负担7-5 数据封装7-6 继承7-7 多态7-8 抽象化使用接口第8章类.名称空间8-1 类与对象8-l-1 类的成员8-l-2 对象8-1-3 定义类的语法8-2 类与结构的比较结构适用于"轻量型"的对象8-3 数据封装8-4 数据与方法的存取控制8-4-1 使用成员访问修饰符8-4-2 良好的数据隐藏方式设计8-4-3 数据封装的目的8-5 使用静态成员8-5-1 声明及初始化静态数据8-5-2 使用静态方法8-5-3 静态成员使用准则8-6 C#与面向对象8-6-1 再探HelloWorld8-6-2以static定义Main8-7定义类与建立实体this操作数8-8使用访问修饰符8-9建立嵌套类8-10名称空间8-10-1声明名称空间8-10-2名称空间的领域8-10-3使用名称空间的好处8-10-4名称空间存取控制8-11完全区别名称8-12使用using前置命令建立阶层式类结构8-13使用别名8-14使用命名空间的准则第9章参考类型变量9-1使用参考类型变量9-2参考类型与实值型9-2-1实值类型9-2-2参考类型9-2-3实值类型与参考类型差异9-3声明与释放参考类型变量9-3-1声明参考类型变量9-3-2释放参考类型变量9-4比较参考类型变量与实值类型变量9-5多个参考类型变量参考到同一个对象9-6以参考变量当做方法的参数9-7常用的参考类型9-7-1Exception类9-7-2String类9-7-3比较字符串的方法与操作数9-7-4C#对象阶层结构9-8.NETFramework常用的类9-8-1System.IO9-8-2System.XML9-9数据类型转换9-9-1隐含式转换9-9-2明确式转换9-10Parent与Child之间的转换9-10-1转换成ParentClass的参考9-10-2转换成ChildClass的参考9-11使用is操作数9-12使用as操作数9-13Object类型转换守则9-14Boxing与Unboxing9-14-1Boxing9-14-2UnBoxing第10章对象的生与死10-1了解构造器10-1-1使用new取得内存10-1-2ManagedHeap内存配置10-1-3初始化对象10-2默认构造器10-2-l默认构造器的特性10-2-2编译器自动生成的构造器10-2-3定义默认构造器10-2-4定义构造器原则10-3覆写构造器10-4覆写构造器潜在的问题10-4-1解决重复初始化程序代码的问题10-4-2使用consbuctor-initializer10-5初始化只读数据10-6在构造器使用out与ref10-7struct构造器10-7-1struct构造器的限制10-8static构造器10-8-1使用static构造器初始化静态成员10-8-2static构造器的限制10-9对象与内存10-9-l对象的生命周期10-9-2局域变量的生命周期10-9-3对象的生命周期10-10谁来"摧毁"对象?C#借由回收站回收资源10-11使用Finalize方法Finalize对效率的影响10-12编写析构器使用析构器的考虑10-13实现IDisposable接口第11章继承.多态与接口11-l扩充基础类的功能11-1-l继承的语法11-l-2简单的UML描述11-2扩充类的继承11-2-1使用访问修饰符控制存取权限11-2-2protected成员的继承11-3调用基础类的构造器声明构造器ll-4改写基础类的方法11-4-1定义虚拟方法ll-4-2虚拟方法与改写方法的守则11-5隐藏基础类方法11-6使用sealed类与sealed方法11-7版本控制11-8使用接口接口的特点11-9 以明确的方式实现接口11-10 抽象类11-10-1 抽象方法11-10-2 不实现接口的抽象类11-11 抽象类与接口11-12 抽象方法与版本控制第12章属性与索引12-1 组件定义12-2 属性12-2-1 为什么要用属性?12-2-2 使用属性的好处12-3 属性的种类12-4 使用存取元12-4-1 使用get存取元12-4-2 使用set存取元12-4-3 使用get.set存取元12-5 编译器运作的情形12-6 属性与类数据成员的比较12-6-1 属性是逻辑上的类数据成员12-6-2 属性和数据成员的相似性12-6-3 属性和数据成员的不同点12-7 存取属性与类数据成员的比较12-8 属性与方法的比较12-8-l 属性和方法之间的相似性12-8-2 属性和方法之间的不同点12-9 索引的使用12-9-1 为什么要使用索引?12-9-2 定义索引12-10 索引和数组的比较12-11 覆写Indexer12-12 Indexer与属性的比较12-12-1 Indexer与属性的相似性12-12-2Indexer与属性的不同点12-l3Indexer设计准则第13章操作数.Delegate事件13-1 覆写操作数13-1-1 覆写操作数的语法13-1-2 覆写相同的操作数多次13-1-3 Conversion操作数l3-2 建立并使用delegate类型建立delegate类型l3-3 事件13-3-1 在事件发行者定义一个事件13-3-2 在事件发行者触发事件13-3-3 在事件订阅者定义事件处理常式13-3-4 向事件发行者订阅一个事件l3-4 链接.删除事件设计准则l3-5 .NETFramewoek事件设计准则13-6传递事件的参数13-6-1Sender对象与事件参数13-6-2定义delegate函数样板13-6-3EventArgs类的设计l3-6-4事件处理常式的编写13-6-5触发事件第14章Attribute与Iteflection14-l何谓Attribute?14-2使用AttributeGlobalAttribute14-3自定义Attribute类14-3-1Attribute适用的元素14-3-2设计Attribute类14-3-3使用Attribute14-3-4Attribute编译的过程14-3-5使用positional参数与named参数14-3-6取得Attribute的值14-4Renection14-4-1Renection设计理念14-4-2MetadataPARTII实战演练篇第15章编写数据库应用程序15-1建立用户界面15-2编写公用函数15-3读取数据库数据,以及建立DataSet15-4自定义dataGrid展示样式15-5添加.删除.修改数据15-6增加核对程序运作的程序代码第16章编写Master/Detail数据库应用程序16-1建立Master/Detail关系的DataSet16-2自定义dataGrid展示样式16-3设计显示明细数据的表单16-4 使用BindingContext浏览数据第17章设计WindowsFrom应用程序17-1 设计MDI应用程序17-1-1 使用StatusBar与Timer控件17-1-2 设计选单17-1-3 编写选单程序代码17-2 设计GDI十应用程序17-2-1 绘制统计图表17-2-2 使用FontDialog设置字体17-2-3 设置打印格式17-2-4 打印预览与打印报表17-2-5 使用PrintDialog选择打印机17-2-6 保存图形文件第18章使用COM+服务18-1 编写.NET组件18-2 编写转帐类18-3 建立KeyFile与StrongName18-4 建立客户端的接口18-5 测试COM+应用程序第19章编写一个监控文件事务的WindowsService19-1使用WindowsService模板19-2使用EventLog与FileSystemWatcher控件19-3使用Installer类19-4安装WindowsServics19-5启动服务与暂停服务第20章编写文件管理器20-1 建立UCOMFileManger用户界面20-2 编写初始化应用程序的程序代码20-3 编写事件程序20-4 打开文本文件第21章编写提供数据的WebService21-1 建立WebService21-2 编写使用WebService的WindowsForms客户端第22章编写ASP.NET网页22-1建立ASP.NET项目22-2设计分页22-3增加编辑数据的按钮22-4编写修改.取消.保存按钮事件处理常式22-5编写添加功能22-6编写删除功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉特思米(gitusme)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值