可选参数:
使用可选参数可以减少方法重载
可选参数语法:
staticvoid Main(string[] args)
{
BookList("C#");//使用全部默认参数
BookList("C#", "出版时间");//使用1个默认参数
BookList("Java", "出版时间", 2);//不使用默认参数
}
staticvoidBookList(
string category, string order ="书名", intpageIndex = 1)
{
Console.WriteLine("查看分类为{0}的图书,按{1}排序,页号为第{2}页",
category, order, pageIndex);
}
可选参数注意事项:
可选参数排列在必选参数之后
调用时不可省略中间的可选参数
命名参数
命名参数语法:
staticvoid Main(string[] args)
{
//按命名参数调用方法
PrintCircle(x:2, y: 3, radius: 3);
PrintCircle(x:3,radius: 3 , y: 3);
PrintCircle(radius: 3 , x: 3);
Console.ReadLine();
}
staticvoidPrintCircle(int x, int y=6, int radius=7)
{
Console.WriteLine("圆形的坐标为({0}、{1}),半径为{2}", x, y,radius);
}
命名参数注意事项:
可选参数排列在必选参数之后
有默认值的参数可赋值可不赋值
隐式类型和匿名类型
隐式类型var定义(是推断类型),在MSIL语言中根据值推断类型,定义和赋值同时进行,不能再赋其他类型的值,只用于方法的局部变量
将一组只读属性封装到单个对象中而不需要预先定义一个类型称为匿名类型
用法:
Employee emplayee = newEmployee();
emplayee.EmployeeName = "张三";
emplayee.Gender = "男";
emplayee.Position = "产品设计师";
var tempEmp = new { Name=emplayee.EmployeeName, Gender = emplayee.Gender, Position = emplayee.Position};
//以下是错误的,匿名类型的属性是只读的
//tempEmp.Name = "李四";
//tempEmp.Gender = "男";
//tempEmp.Position = "技术培训师";
Console.WriteLine("员工姓名:{0},性别:{1},岗位:{2}",tempEmp.Name,tempEmp.Gender,tempEmp.Position);
dynamic类型
特点:
dynamic类型即是动态类型,
是相对于静态类型而言的运行时创建对象
运行时读写属性和调用方法
编译时不进行类型检查
动态类型没有智能提示
动态类型是弱类型
可空参数
可空类型是对值类型的封装,允许赋值为null
System.Nullable<类型>变量名或类型?变量名
可空类型可以读取数据库可空类型数据(datetime)
例子:用可空类型接收数据库有null值的列
user.Age= reader["Age"] != DBNull.Value ? (int?)reader["Age"] :null;
user.RegDate= reader["RegDate"] != DBNull.Value ?(DateTime?)reader["RegDate"] : null;
例子:可空类型的转换:
//非空类型转换为可空类型
//int num1 = 123;
//int? num2 = num1;
//Console.WriteLine("num1={0},num2={1}",num1,num2);
//可空类型转换为非空类型
//int? num1 = 123;
//int num2 = num1;
//Console.WriteLine("num1={0},num2={1}", num1, num2);
//使用可空类型的属性
int? num1 = 123;
//int num2 = num1.HasValue ?num1.Value : 0;
int num2 = num1 ?? 0;
Console.WriteLine("num1={0},num2={1}", num1, num2);
特性
定制特性attribute,本质上是一个类,其为目标元素提供关联附加信息,并在运行期以反射的方式来获取附加信息。继承自attribute类。一个目标元素可以被多个特性修饰,特性也可以用于限制对象的值,用于修饰属性
[DescriptionAttribute("1233","2013-12-12", "3")]
class student
{
public string Name { get; set; }
public int Age { get; set; }
public string Birthday { get; set; }
//[DescriptionAttribute("1233", "2013-12-12","3")]
public void Display()
{
Console.WriteLine("学生姓名:{0},年龄:{1},出生日期{2}",this.Name,this.Age,this.Birthday);
}
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple= true(一个对象是否可以多次使用))]
class DescriptionAttribute : Attribute
{
public string BugId { get; set; } //Bug编号
public string ModificationDate { get;set; } //修改日期
public string DeveloperId { get; set;} //开发者Id
public string BugOrigin { get; set;} //Bug原因
public string FixComment { get; set;} //Bug说明
public DescriptionAttribute() { }
public DescriptionAttribute(stringbugId, string modificationDate, string developerId)
{
this.BugId = bugId;
this.ModificationDate =modificationDate;
this.DeveloperId = developerId;
}
public string Msg { get; set; }
}