【C#与.NET程序设计】(2)- C#基本数据类型及控制结构
2017-10-16 09:57
459 查看
最简单的一个c#程序
static使得Main是类级别的而不是对象级别的,因此在调用之前不需要先创建新的类实例
命令行参数有以下3种处理方式:
System.Object 是.NET世界中所有类型的基类,任何类型都可以保存在一个 Object中
System.Object 定义了一组方法(ToString()、Equals()、GetHashCode()等)。也就是说,所有对象都有以上方法(如12.GetHashCode())
每一个数值类型都对应System命名空间中的一个结构,而string和object是引用类型(图1)
浮点数默认为double,可以用后缀f/F强制标记为float;整数默认为int,可以用后缀l/L强制标记为long
图1. 类型的层次结构
对于要进行大量文本处理的程序,使用 string 会变得很低效
可以使用 StringBuilder 类,与String最大的不同就是,可以修改内部数据
定义了 Complex 结构,可以对复数数据进行建模
需要在工程中添加相应引用
编译器会根据赋值的强类型推断其本质属性
相应的,var 隐式类型有如下限制:
隐式类型本地变量只有在 LINQ 技术中才有意义,因为其返回值类型无法显式定义;
其他情况应避免用隐式类型,因为会降低程序可读性
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace learn_cs { class myProgram { static void Main(string[] args) { foreach (string arg in args) Console.WriteLine("Arg: {0}", arg); Console.WriteLine("hello world!"); Console.ReadLine(); } } }
Main()方法
与C++一样,C#也有多种入口形式static void Main(string[] args) static void Main() static int Main(string[] args) static int Main()
static使得Main是类级别的而不是对象级别的,因此在调用之前不需要先创建新的类实例
命令行参数有以下3种处理方式:
// 1 for (int i = 0; i < args.Length; i++ ) Console.WriteLine("Arg: {0}", args[i]); // 2 foreach (string arg in args) Console.WriteLine("Arg: {0}", arg); // 3 string[] theArgs = Environment.GetCommandLineArgs(); foreach (string arg in args) Console.WriteLine("Arg: {0}", arg);
System类
System.Environment
可以获取.NET及操作系统的大量细节// 命令行参数 string[] theArgs = Environment.GetCommandLineArgs(); // 本机驱动器 string[] theDrives = Environment.GetLogicalDrives(); // 操作系统 OperatingSystem theOS = Environment.OSVersion; // 处理器数目 int theProcessor = Environment.ProcessorCount; // .NET版本 Version theDNET = Environment.Version;
System.Console
与控制台的交互// 输入输出 Console.Write("hello world"); //输出string,不包含换行 Console.WriteLine("hello world"); //输出string,包含换行 int inValue = Console.Read(); //输入字符 string strValue = Console.ReadLine(); //输入string,也多用于等待回车,结束运行 // 格式化输出 Console.WriteLine("{0},{2},{1}", 10, "format", 30); //使用{}格式化输出任意类型 Console.WriteLine("{0:c}",99.99); //解释为货币 Console.WriteLine("{0:d3}", 99); //解释为3位整数 Console.WriteLine("{0:f3}", 99.99); //解释为小数点后3位浮点 Console.WriteLine("{0:x}", 99); //解释为16进制数 // 其他 Console.Beep(); // 控制台发出指定频率和持续时间的蜂鸣声 Console.BackgroundColor; // 控制台背景色 Console.ForegroundColor; // 控制台前景色 Console.BufferHeight; // 控制台缓冲区域高度 Console.BufferWidth; // 控制台缓冲区域宽度 Console.Title; // 控制台标题 Console.WindowHeight; // 控制台位置及尺寸 Console.WindowWidth; Console.WindowTop; Console.WindowLeft; Console.Clear(); // 清除控制台显示
基本数据类型
.NET数据类型和C#简化类型对照见《【C#与.NET程序设计】(1)- .NET》System.Object 是.NET世界中所有类型的基类,任何类型都可以保存在一个 Object中
System.Object 定义了一组方法(ToString()、Equals()、GetHashCode()等)。也就是说,所有对象都有以上方法(如12.GetHashCode())
每一个数值类型都对应System命名空间中的一个结构,而string和object是引用类型(图1)
浮点数默认为double,可以用后缀f/F强制标记为float;整数默认为int,可以用后缀l/L强制标记为long
图1. 类型的层次结构
Sytem.Char 和 System.String
// char 拥有判断属性的方法 b = char.IsDigit('a'); //其他属性:字母、大小写、标点等 b = char.IsDigit("a1bc", 1); //指定位置 // 每种数据类型均有 parse 方法,可以从 string 中解析 bool b = bool.Parse("True"); double d = double.Parse("99.88"); int i = int.Parse("12"); char c = char.Parse("w"); // 逐字字符串(‘@’) // string 添加前缀'@',可以忽略所有转义(以下两句等价) Console.WriteLine(@"C:\MyApp\bin\Debug"); Console.WriteLine("C:\\MyApp\\bin\\Debug"); // 字符串的相等性 // object 和 string 为引用类型,因此理论上是比较两个string是否为内存中同一个对象 // 但为了实用,相等操作已被重定义为比较string对象的值 string s1 = "hello"; string s2 = "hi"; bool isEqual = s1 == s2; // false isEqual = s1.Equals(s2); // 与“==”等效,false isEqual = s1 == "hello" // true
System.Text.StringBuilder
string 类型一旦初始化后就不能改变了,其提供的所有方法实际会构造新的 string 对象对于要进行大量文本处理的程序,使用 string 会变得很低效
可以使用 StringBuilder 类,与String最大的不同就是,可以修改内部数据
// 构造 StringBuilder StringBuilder sb = new StringBuilder("****** string builder ******"); sb.AppendLine("append st");
System.DateTime 和 System.TimeSpan
// 时间 DateTime dt = new DateTime(2017, 10, 1); Console.WriteLine("the day of {0} is {1}", dt.Date, dt.DayOfWeek); // 时间间隔 TimeSpan ts = new TimeSpan(10, 30, 0); Console.WriteLine(ts);
System.Numerics
定义了 BigInteger 结构,可以用来表示较大的数值(没有上下限)定义了 Complex 结构,可以对复数数据进行建模
需要在工程中添加相应引用
// 一般使用 parse 的方法初始化一个 BigInteger // BigInteger 设定完后不能改变 BigInteger biggy = BigInteger.Parse("999999999999999999999"); // 以下两种运算等价 BigInteger multi1 = BigInteger.Multiply(biggy, BigInteger.Parse("8888888888888888")); BigInteger multi2 = biggy * BigInteger.Parse("8888888888888888");
隐式类型
c#支持用 var 关键字创建隐式类型本地变量,而不必指定具体的数据类型var myInt = 0; var myBool = true; var myString = "hello";
编译器会根据赋值的强类型推断其本质属性
相应的,var 隐式类型有如下限制:
// 错误!var 不能用于字段数据 private var myInt = 10; // 错误!var 不能用于返回值或参数类型 public var MyMethod(var x, var y){;} // 错误!var 必须在声明时分配值 var myData; // 错误!var 不能用 null 做初始值 var myObj = null;
隐式类型本地变量只有在 LINQ 技术中才有意义,因为其返回值类型无法显式定义;
其他情况应避免用隐式类型,因为会降低程序可读性
控制结构
迭代结构
// for 循环 for (int i = 0; i < 4; i++) Console.WriteLine("Number is: {0}", i); // foreach 循环(方便迭代数组) string[] carTypes = { "Ford", "BMW", "Yugo", "Honda" }; foreach (string c in carTypes) // 或者用 var 代替 string Console.WriteLine(c); // while 循环 while (true){ ... } // do/while 循环 do{ ... }while(true);
条件结构
与 C/C++ 在细节上有一点点不一样// if语句 if(仅支持布尔表达式,不支持C/C++允许的“0/非0”){ ... } // switch语句 switch(var){ case 1: ... break; default: // default 也必须有break/goto ... break; }
参考
【1】C#与.NET 4高级程序设计(第5版)相关文章推荐
- C语言:基本数据类型与程序结构控制
- Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库 自定义日志记录功能,按日记录,很方便 C#常量和字段以及各种方法的语法总结 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法 asp.net webapi 自定义身份验证
- 第二部分 算法的基本控制结构与数据类型
- Python基础,基本类型(整型,浮点数等)数据结构(List,dic(Map),Set,Tuple),控制语句(if,for,while,continue or break):来自学习资料
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
- 【C#与.NET程序设计】(3)- C#基本参数类型
- JAVA基础【3.3】《Java核心技术1》Java的基本程序设计结构-数据类型
- Scala入门学习笔记二-基本数据类型、程序控制结构
- asp.net(c#)数据类型格式转换大全
- python金融应用(二)基本数据类型和结构
- c#的基本数据类型
- 007: 基本控制语句 for , while, 和 range 数据类型
- 浅谈C#基本数字数据类型
- C#基础学习笔记--数据类型,值类型,结构类型,枚举类型
- C#.NET中的结构类型(结构体与类的区别)
- JS高级程序设计学习笔记之第三章基本概念(语法,数据类型,流控制语句,函数)——查漏补缺
- 第三章数程序设计初步--控制结构综合项目4-2文件操作初体验练习3将数据写入文件
- 【C#与.NET程序设计】(6)- C#垃圾回收及接口类型
- 边学边用JavaScript之数据类型,函数,控制结构
- 转 asp.net(c#)数据类型格式转换大全