命名参数
在调用时,给命名参数赋值时,附加上参数名称,解决参数顺序固定问题
例如,例子1
static void Main(string[] args)
{
Console.WriteLine(ShowComputer("i3 370M","2G","320G"));
Console.WriteLine(ShowComputer(disk: "320G", cpu: "i3 370M", ram: "2G"));
Console.Read();
}
private static string ShowComputer(string cpu, string ram, string disk)
{
return "My computer ... \nCpu:" + cpu + "\nRam:" + ram + "\nDisk:" + disk + "\n";
}
特殊类型
隐式类型 var
var a=1; //int a=1;
var b=“123”; //string b=“123”;
var myObj=new MyObj(); //MyObj myObj=new MyObj();
使用var声明一个变量(并给变量赋值),完全不用指定变量的类型,编译器便会根据变量的值,推导出变量的类型。
匿名类型
创建一个对象时,不一定先要定义对象的类型。
例如,在MySchool中,查询各年级的学生总数
s1 12
s2 20
s3 40
创建匿名类型数组
var oddsAndEnds = new[]{
new {Name="MVC" , Category="Pattern"},
new {Name="Hat" , Category="Clothing"},
new {Name="Apple" , Category="Fruit"}
};
new关键字之后,直接定义属性,并为这些属性赋值。而且,对象创建出来之后,在创建对象的方法中,还可以畅通无阻的访问对象的属性。这便是所谓的匿名类型对象的创建
dynameic(动态)类型
我们平时定义一个int i=1是静态类型,静态类型就是我们在没有编译的时候已经明确的知道他是一个int类型,动态语言是我们在运行时才会知道的类型。在编写动态类型的时候无法使用vs的智能提示。
class Person
{
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
dynamic c = new Person();
c.Name = "abc";
c.Age = 30; //编译时不报错,运行时报错
Console.WriteLine(c.Name);
}
}
Dynamic类型的实例和其他类型的实例间的转换是很简单的,直接赋值即可。
dynamic d1 = 7;
dynamic d2 = "a string";
dynamic d3 = System.DateTime.Today;
int i = d1;
string str = d2;
DateTime dt = d3;
可空类型
语法:System.NullAble<类型>变量名
例如 System.NullAblenum1; 简便写法为 int?num1;
int? num1=null;
int num2 = num1.HasValue ? Num1 : 0 ;
//可简写为 int num2=num1??num:0;
上面例子中,定义了一个整数可空类型,并赋空值。
HasValue 枚举类型 判断可空类型是否为空,如果不为空,retun true,else return false
特殊方法
扩展方法
扩展方法,一种特殊的静态方法,能够向现有类型“添加”新的方法,但可以像扩展类型上的实例方法一样进行调用。
判断字符串类型的Email是否符合规范
using System.Text.RegularExpressions; //正则表达式命名空间
namespace Extension_Method
{
//类必须为static的
public static class StringHelper
{
//扩展方法必须为静态的
//扩展方法的第一个参数必须由this来修饰(第一个参数是被扩展的对象)
public static bool isEmail(this string _string)
{
return Regex.IsMatch(_string,
@"^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$");
}
}
public static void main(string[] args)
{
string str = "czx@123.com";
Console.WriteLine(str.isEmail()); //调用
}
}
泛型方法
在c#中,泛型方法是通过泛型来约束方法中的参数类型,亦可理解为对数据类型设置了参数。
使用前:
如果没有泛型,每次方法中的参数类型都是固定的,不能随意更改。
使用后
在使用泛型后,方法中的数据类型则有指定的泛型来约束,即可以根据提供的泛型来传递不同类型的参数。
static void Main(string[] args)
{
//将T设置为double类型
Add<double>(3.3, 4);
//将T设置为int类型
Add<int>(3, 4);
}
//加法运算
private static void Add<T>(T a, T b)
{
double sum = double.Parse(a.ToString()) + double.Parse(b.ToString());
Console.WriteLine(sum);
}