您的位置:首页 > 编程语言 > C#

【C#与.NET程序设计】(2)- C#基本数据类型及控制结构

2017-10-16 09:57 459 查看
最简单的一个c#程序

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版)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐