【卷土重来之C#学习笔记】(二)c#编程概述
【卷土重来之C#学习笔记】(二)c#编程概述
(1)开始C#,一个简单的程序Hello Word 开始
using System; //使用了System的命名空间 using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Simple //声明了一个新的命名空间 ,名称为:Simple //命名空间内的人和类型都是命名空间的成员 { class Program //声明一个新的类,名称为:Program //大括号内的为命名空间的成员 { static void Main() //声明一个名称为Main的方法作为类Program的成员 //Main是Program类的唯一成员 //Main是特殊函数,编译器用它作为程序的起点 { Console.WriteLine("Hello World !");//这一条组成了Main的方法体 //使用了命名空间System中一个名称为Console的类将消息输出到屏幕窗口 //语句可以用一个分好结束 } } }
(2) 标识符
标识符是一种字符串,用来命名变量、方法、参数 和其他程序结构。
例如上面的 类名称: Program 他们的命名是有规定的:
1.字母和下划线可以用在任何位置。
2.数字不能放在首位,但是可以放在其他位置。
3.@字符只能放在标识符的首位(不推荐)。
4.标识符区分大小写 变量MyVar 跟myVar是不同的标识符。
(3)关键字
关键字是用来定义C#语言的字符串记号
例如代码中的: class using
1.关键字不能用作变量名和任何形式的标识符(除非以@符号开始)。
2.所有的关键字都有小写字母组成。
(4)从程序中输出文本
1.Write和WriteLine
相同点:两个都是Console的成员,功能都是输出字符串。
区别: Write是不换行直接输出 而WriteLine 是分割多行。
2.格式字符串
Write和WriteLine语句的常规形式可以有一个以上参数,多个参数用逗号隔开。
语法: Console.WriteLine(格式字符串(含替代标记),替换值,替换值1,替换值2,......);
值可以以任何顺序使用;
只可以再格式字符串中替换任意次;
3.格式化数字字符串
格式说明符的语法:
对齐说明符(alignment)
对齐说明符表示了字段中字符的最小宽度。对齐说明符有如下特性。
1、对齐说明符是可选的,并且使用逗号和索引号分离。// 疑问?? 大括号 {0,50} 0是索引号 50是对齐说明符 中间逗号隔开
2、它由一个正整数或负整数组成。
3、整数表示了字段使用字符的最少数量。
4、符号表示了右对齐或左对齐。正数表示右对齐,负数表示左对齐。
5、如果要表示的字符数比说明符中指定的字符数少,那么其余字符会使用空格填充;
6、如果要表示的字符数多于指定的字符数,对齐说明符会被忽略,并且使用所需的字符进行表示。
这段代码如下输出,两个横杠中间有10个字符
格式字段(format)
格式字段指定了数字应该以哪种形式表示。例如应当被当做货币、十进制数、还是定点符号来表示。格式字段有3部分。
1、冒号后必须紧跟格式说明符,中间不能有空格。
2、格式说明符是一个字母字符,是9个内置字符格式之一。字符可以是大写或小写形式。大小写对于某些说明符来说比较重要,而对于另外一些说明符来说则不重要。
3、精度说明符是可选的,由1~2位数字组成。它的实际意义取决于格式说明符。
以下是标准格式字符串:
//1.使用货币符号吧值格式化为货币(小数位数) Console.WriteLine("{0:C}",12.5); //输出:$12.50 //2.十进制字符串,只能和正数类型配合使用,输出字符串中最少位数,如果实际数字更少,则左边以0填充 Console.WriteLine("{0:D4}",12); //输出:0012 //3.带小数的十进制数字字符串(小数位置) Console.WriteLine("{0:F4}",12.3456789);//输出12.3457 //4.根据值转换为定点或者科学计数法标识紧凑形式(根据值) Console.WriteLine("{0:G4}", 12.3456789);//输出12.35
(5) 注释
// 单行注释
/* */ 多行注释
/// 文档注释
----
Console.WriteLine 方法 (String, Object)
发布日期: 2016年7月
使用指定的格式信息,将指定对象(后跟当前行终止符)的文本表示形式写入标准输出流。
程序集: mscorlib(位于 mscorlib.dll)
[HostProtectionAttribute(SecurityAction.LinkDemand, UI = true)] public static void WriteLine( string format, object arg0 )
Exception | Condition |
---|---|
IOException |
出现 I/O 错误。 |
ArgumentNullException |
format 为 null。 |
FormatException |
format 中的格式规范无效。 |
此方法使用复合格式设置功能要将对象的值转换为它的文本表示形式,并将该表示形式嵌入在字符串中的.NET framework。 生成的字符串写入到输出流。
format参数由零个或多个文本混和组成,零个或多个索引占位符称为格式项,对应于此方法的参数列表中的对象。 格式设置的过程将每个格式项替换的文本表示形式相应对象的值。
格式项的语法是{索引[,对齐] [:formatString]}、 它指定一个强制索引、 可选长度和对齐方式的带格式的文本,并设置控制如何对象的值的相应的格式说明符字符的一个可选的字符串的格式。
.NET Framework 提供了广泛的格式设置支持,以下的格式设置主题中的更详细地介绍。
-
有关复合格式设置方法如支持的功能的详细信息Format, AppendFormat,和的某些重载WriteLine,请参阅复合格式设置。
-
有关数字格式说明符的详细信息,请参阅标准数字格式字符串和自定义数字格式字符串。
-
有关日期和时间格式说明符的详细信息,请参阅标准日期和时间格式字符串和自定义日期和时间格式字符串。
-
有关枚举格式说明符的详细信息,请参阅枚举格式字符串。
-
有关格式设置的详细信息,请参阅.NET Framework 中的格式化类型。
有关行终止符的详细信息,请参阅备注部分的WriteLine不带参数的方法。
复合格式设置
.NET Framework 复合格式设置功能使用对象列表和复合格式字符串作为输入。 复合格式字符串由固定文本和索引占位符混和组成,其中索引占位符称为格式项,对应于列表中的对象。 格式设置操作产生的结果字符串由原始固定文本和列表中对象的字符串表示形式混和组成。
复合格式设置功能受诸如以下方法的支持:
-
String.Format,它返回格式化的结果字符串。
-
StringBuilder.AppendFormat,它将格式化的结果字符串追加到 StringBuilder 对象。
-
Console.WriteLine 方法的某些重载,它将格式化的结果字符串显示到控制台上。
-
TextWriter.WriteLine 方法的某些重载,它将格式化的结果字符串写入流或文件中。 派生自 TextWriter 的类(如 StreamWriter 和 HtmlTextWriter)也共享此功能。
-
Debug.WriteLine(String, Object[]),它将格式化消息输出到跟踪侦听器。
-
Trace.TraceError(String, Object[])、Trace.TraceInformation(String, Object[]) 和 Trace.TraceWarning(String, Object[]) 方法,它们将格式化消息输出到跟踪侦听器。
-
TraceSource.TraceInformation(String, Object[]) 方法,它将信息性方法写入跟踪侦听器中。
复合格式字符串和对象列表将用作支持复合格式设置功能的方法的参数。 复合格式字符串由零个或多个固定文本段与一个或多个格式项混和组成。 固定文本是所选择的任何字符串,并且每个格式项对应于列表中的一个对象或装箱的结构。 复合格式设置功能返回新的结果字符串,其中每个格式项都被列表中相应对象的字符串表示形式取代。
可考虑使用以下 Format 代码段。
固定文本为“Name =
”和“, hours =
”。 格式项为“{0}
”和“{1:hh}
”,前者的索引为 0,对应于对象 myName
,后者的索引为 1,对应于对象 DateTime.Now
。
每个格式项都采用下面的形式并包含以下组件:
{
index[,
alignment][:
formatString]}
必须使用成对的大括号(“{”和“}”)。
索引组件
强制“索引”组件(也叫参数说明符)是一个从 0 开始的数字,可标识对象列表中对应的项。 也就是说,参数说明符为 0 的格式项列表中的第一个对象,参数说明符为 1 的格式项列表中的第二个对象,依次类推。 下面的示例包括五个参数说明符,用于表示小于 10 的质数:
string primes; primes = String.Format("Prime numbers less than 10: {0}, {1}, {2}, {3}", 2, 3, 5, 7 ); Console.WriteLine(primes); // The example displays the following output: // Prime numbers less than 10: 2, 3, 5, 7
通过指定相同的参数说明符,多个格式项可以引用对象列表中的同一个元素。 例如,通过指定诸如“0x{0:X} {0:E} {0:N}”的复合格式字符串,可以将同一个数值设置为十六进制、科学记数法和数字格式,如下面的示例所示。
string multiple = String.Format("0x{0:X} {0:E} {0:N}", Int64.MaxValue); Console.WriteLine(multiple); // The example displays the following output: // 0x7FFFFFFFFFFFFFFF 9.223372E+018 9,223,372,036,854,775,807.00
每个格式项都可以引用列表中的任一对象。 例如,如果有三个对象,则可以通过指定类似于“{1} {0} {2}”的复合格式字符串来设置第二、第一和第三个对象的格式。 格式项未引用的对象会被忽略。 如果参数说明符指定了超出对象列表范围的项,将引发运行时 FormatException。
对齐组件
可选的“对齐”组件是一个带符号的整数,指示首选的设置了格式的字段宽度。 如果“对齐”值小于设置了格式的字符串的长度,“对齐”会被忽略,并且使用设置了格式的字符串的长度作为字段宽度。 如果“对齐”为正数,字段中设置了格式的数据为右对齐;如果“对齐”为负数,字段中的设置了格式的数据为左对齐。 如果需要填充,则使用空白。 如果指定 alignment,就需要使用逗号。
下面的示例定义两个数组,一个包含雇员的姓名,另一个则包含雇员在两周内的工作小时数。 复合格式字符串使 20 字符字段中的姓名左对齐,使 5 字符字段中的工作小时数右对齐。 请注意“N1”标准格式字符串还用于设置带有小数位的小时数格式。
using System; public class Example { public static void Main() { string[] names = { "Adam", "Bridgette", "Carla", "Daniel", "Ebenezer", "Francine", "George" }; decimal[] hours = { 40, 6.667m, 40.39m, 82, 40.333m, 80, 16.75m }; Console.WriteLine("{0,-20} {1,5}\n", "Name", "Hours"); for (int ctr = 0; ctr < names.Length; ctr++) Console.WriteLine("{0,-20} {1,5:N1}", names[ctr], hours[ctr]); } } // The example displays the following output: // Name Hours // // Adam 40.0 // Bridgette 6.7 // Carla 40.4 // Daniel 82.0 // Ebenezer 40.3 // Francine 80.0 // George 16.8
格式字符串组件
可选的“格式字符串”组件是适合正在设置格式的对象类型的格式字符串。 如果相应的对象是数值,则指定标准或自定义的数字格式字符串;如果相应的对象是 DateTime 对象,则指定标准或自定义的日期和时间格式字符串;或者,如果相应的对象是枚举值,则指定枚举格式字符串。 如果不指定 formatString,则对数字、日期和时间或者枚举类型使用常规(“G”)格式说明符。 如果指定 formatString,则需要使用冒号。
下表列出了 .NET Framework 类库中支持预定义的格式字符串集的类型或类型的类别,并提供指向列出了支持的格式字符串的主题的链接。 请注意,字符串格式化是一个可扩展的机制,可使用该机制定义所有现有类型的新的格式字符串,并定义受应用程序定义的类型支持的格式字符串集。 有关详细信息,请参阅 IFormattable 和 ICustomFormatter 接口主题。
类型或类型类别 | 请参阅 |
---|---|
日期和时间类型(DateTime,DateTimeOffset) | 标准日期和时间格式字符串 自定义日期和时间格式字符串 |
枚举类型(所有派生自 System.Enum 的类型) | 枚举格式字符串 |
数值类型(BigInteger、Byte、Decimal、Double、Int16、Int32、Int64、SByte、Single、UInt16、 UInt32、UInt64) | 标准数字格式字符串 自定义数字格式字符串 |
Guid | Guid.ToString(String) |
TimeSpan | 标准 TimeSpan 格式字符串 自定义的 TimeSpan 格式字符串 |
转义大括号
左大括号和右大括号被解释为格式项的开始和结束。 因此,必须使用转义序列显示文本左大括号或右大括号。 在固定文本中指定两个左大括号 ("{{") 以显示一个左大括号 ("{"),或指定两个右大括号 ("}}") 以显示一个右大括号 ("}")。 按照在格式项中遇到大括号的顺序依次解释它们。 不支持解释嵌套的大括号。
解释转义大括号的方式会导致意外的结果。 例如,考虑要显示一个左大括号、一个设置为十进制数格式的数值和一个右大括号的格式项“{{{0:D}}}”。 但是,实际是按照以下方式解释该格式项:
-
前两个左大括号 ("{{") 被转义,生成一个左大括号。
-
之后的三个字符 ("{0:") 被解释为格式项的开始。
-
下一个字符 ("D") 将被解释为 Decimal 标准数值格式说明符,但后面的两个转义大括号 ("}}") 生成单个大括号。 由于得到的字符串 ("D}") 不是标准数值格式说明符号,所以得到的字符串会被解释为用于显示字符串“D}”的自定义格式字符串。
-
最后一个大括号 ("}") 被解释为格式项的结束。
-
显示的最终结果是字符串“{D}”。 不会显示本来要设置格式的数值。
在编写代码时,避免错误解释转义大括号和格式项的一种方法是单独设置大括号和格式项的格式。 也就是说,在第一个格式设置操作中显示文本左大括号,在下一操作中显示格式项的结果,然后在最后一个操作中显示文本右大括号。 下面的示例阐释了这种方法。
int value = 6324; string output = string.Format("{0}{1:D}{2}", "{", value, "}"); Console.WriteLine(output); // The example displays the following output: // {6324}
处理顺序
如果对复合格式设置方法的调用包括其值不为 IFormatProvider 的 null
参数,则运行时会调用其 IFormatProvider.GetFormat 方法来请求 ICustomFormatter 实现。 如果此方法能够返回 ICustomFormatter 实现,则将对其进行缓存以供稍后使用。
通过执行以下步骤,将参数列表中与格式项对应的每个值转换为字符串。 如果符合前三个步骤中的任一条件,则在此步骤中返回值的字符串表示形式,并且不执行后续步骤。
-
如果要设置格式的值为
null
,则将返回空字符串 ("")。 -
如果 ICustomFormatter 实现可用,则运行时将调用其 Format 方法。 如果格式项中存在 formatString 值,则将向方法传递该值,或如果不存在,则将
null
和 IFormatProvider 实现一起传递。 -
如果该值实现 IFormattable 接口,则调用此接口的 ToString(String, IFormatProvider) 方法。 如果格式项中存在 formatString 值,则向方法传递该值;如果不存在该值,则传递
null
。 按如下方式确定 IFormatProvider 参数:-
对于数值,如果调用带非 null IFormatProvider 参数的复合格式设置方法,则运行时从其 NumberFormatInfo 方法请求 IFormatProvider.GetFormat 对象。 在以下情况下,使用当前线程区域性的
null
对象:无法提供该值、参数值为 IFormatProvider 或复合格式设置方法没有 NumberFormatInfo 参数。 -
对于日期和时间值,如果调用带非 null IFormatProvider 参数的复合格式设置方法,则运行时从其 DateTimeFormatInfo 方法请求 IFormatProvider.GetFormat 对象。 在以下情况下,使用当前线程区域性的
null
对象:无法提供该值、参数值为 IFormatProvider 或复合格式设置方法没有 DateTimeFormatInfo 参数。 -
对于其他类型的对象,如果调用带 IFormatProvider 参数的复合格式设置,则将其值(如果没有提供
null
对象,则包括 IFormatProvider)直接传递到 IFormattable.ToString 实现。 否则,将表示当前线程区域性的 CultureInfo 对象传递到 IFormattable.ToString 实现。
-
-
调用类型的无参数的
ToString
方法(该方法将重写 Object.ToString() 或继承其基类的行为)。 在这种情况下,如果格式项中存在 formatString 组件指定的格式字符串,则将忽略该字符串。
前面的步骤执行完毕之后应用对齐。
下面的示例显示使用复合格式设置创建的一个字符串和使用对象的 ToString
方法创建的另一个字符串。 两种格式设置类型产生相同的结果。
string FormatString1 = String.Format("{0:dddd MMMM}", DateTime.Now); string FormatString2 = DateTime.Now.ToString("dddd MMMM");
假定当前日期是五月的星期四,那么在美国英语区域性中上述示例中的两个字符串的值都是 Thursday May
。
Console.WriteLine 提供与 String.Format 相同的功能。 这两种方法的唯一差异是 String.Format 将其结果作为字符串返回,而 Console.WriteLine将结果写入与 Console 对象关联的输出流中。 下面的示例使用 Console.WriteLine 方法将 MyInt
的值的格式设置为货币值。
int MyInt = 100; Console.WriteLine("{0:C}", MyInt); // The example displays the following output // if en-US is the current culture: // $100.00
下面的示例说明为多个对象设置格式,包括用两种不同的方式为一个对象设置格式。
string myName = "Fred"; Console.WriteLine(String.Format("Name = {0}, hours = {1:hh}, minutes = {1:mm}", myName, DateTime.Now)); // Depending on the current time, the example displays output like the following: // Name = Fred, hours = 11, minutes = 30
下面的示例演示了对齐在格式设置中的使用方式。 设置了格式的参数放置在竖线字符 (|) 之间以突出显示得到的对齐。
string myFName = "Fred"; string myLName = "Opals"; int myInt = 100; string FormatFName = String.Format("First Name = |{0,10}|", myFName); string FormatLName = String.Format("Last Name = |{0,10}|", myLName); string FormatPrice = String.Format("Price = |{0,10:C}|", myInt); Console.WriteLine(FormatFName); Console.WriteLine(FormatLName); Console.WriteLine(FormatPrice); Console.WriteLine(); FormatFName = String.Format("First Name = |{0,-10}|", myFName); FormatLName = String.Format("Last Name = |{0,-10}|", myLName); FormatPrice = String.Format("Price = |{0,-10:C}|", myInt); Console.WriteLine(FormatFName); Console.WriteLine(FormatLName); Console.WriteLine(FormatPrice); // The example displays the following output on a system whose current // culture is en-US: // First Name = | Fred| // Last Name = | Opals| // Price = | $100.00| // // First Name = |Fred | // Last Name = |Opals | // Price = |$100.00 |
WriteLine
String.Format
格式化类型
标准数字格式字符串
自定义数字格式字符串
标准日期和时间格式字符串
自定义日期和时间格式字符串
标准 TimeSpan 格式字符串
自定义的 TimeSpan 格式字符串
枚举格式字符串