建立第一个C#程序
using System;
namespace Wrox{
public class MyFirstClass{
static void Main(){
Console.WriteLine("hello from wrox");
Console.ReadLine();
return;
}
}
}
编译程序
csc First.cs
执行程序
First.exe
给Main方法传递参数
using System;
namespace Wrox{
class ArgsExample{
public static int Main(string[] args){
for(int i=0;i<args.Length;i++){Console.WriteLine(args[i]);}
return 0;
}
}
}
传参数方法
Two.exe ArgsExample abcdef
编写一个.NET Dll运行库,然后调用
namespace Wrox{//定义一个名称空间,写一个类和方法
public class MathLib{
public int Add(int x,int y){return x+y;}
}
}
将该类编译为.NET DLL文件/使用/r选项便以这个文件使之指向新编译的DLL
csc /t:library MathLibrary.cs
csc MathClient.cs /r:MathLibrary.dll
using System;
namespace Wrox{
class Client{
public static void Main(){
MathLib mathObj=new MathLib();
Console.WriteLine(mathObj.Add(7,8));
}
}
}
控制台I/0
Console.ReadLine()读文本
Console.WriteLine()和Console.Write()写文本
值传递和引用传递
将值传递参数前加ref便会变为引用传递
out关键字修饰的变量不用初始化
函数重载的限制:
1.两个方法不能仅在返回类型上有区别
2.两个方法不能仅仅根据参数是声明为ref或out来区分
静态构造函数只初始化一次,
泛型:协变和抗变
泛型约束:
泛型结构:结构是泛型,有一个缺点:结构不能为null,所以使用**Nullable结构。结构Nullable**定义了一个约束:其中的泛型类型T必须是一个结构。因为可空类型使用得非常频繁,所以有一种特殊的语法,它用于定义可空类型的变量。使用“?”运算符,例如变量x1和x2都是可空的int类型的实例:
Nullable<int> x1;
int ? x2;
两个可空变量中任何一个的值是null,它们的和就是null。非空可以转换为可空,反之不成立:
int y1 = 4'
int? x1 = y1;
IEnumerable接口:IEnumerable和**IEnumerable**接口在.NET中是非常重要的接口,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单的迭代,例如:
public class Account{}
var accounts = new List<Account>()
public static class Algorithm{
public static decimal AccumulateSimple(IEnumerable<Account> source){
foreach(Account a in source){}
}
}
//调用方法
decimal amount = Algorithm.AccumulateSimple(accounts);
装箱和拆箱
装箱和拆箱可以把值类型转换为引用类型也可以把引用类型转换为值类型。
该转换可以是隐式转换,如
string s=10.ToString();
显示转换,如:
int myIntNumber = 20;
object myobject = myIntNumber;
拆箱用于将引用类型转换为值类型,这种转换是显示的:
int myIntNumber =20;
object myObject = myIntNumber;
int mySecondNumber = (int)myObject;
比较对象的相等性
比较引用类型的相等性
ReferenceEquals/两个版本的Equals()/再加上比较运算符==
ReferenceEquals:静态方法,测试两个引用是否引用类的同一个实例,特别是两个引用是否包含内存中相同的地址(比较引用),在应用于值类型时会返回false,因为值需要装箱为引用类型,这意味着会得到不同的引用
Equals()虚拟版本和静态版本。(比较值)
比较运算符(中间)