学习笔记
一 自动属性
1.属性访问器中不需要任何其他逻辑时,自动属性会使属性声明更加简明,但是自动属性无法实现业务需求。
public class Person
{
public int Id { get;private set; }
public string Name { get; set; }
public string Address { get; set; }
private int _age;
public int Age {
get{ return _age; }
set {
if(value >= 0 && value <= 120)
{
_age= value;
}
else
{ _age= 0;
}
}
}
public Person(int id) {
this.Id = id; }
}
在自动属性中,通过在 get 或者 set 前加“private”关键字,id是创建只读属性。
2.属性封装
class Person
{ private int _id;
public int Id
{
get{ return _id; }
set{ _id = value; }
}
private string _name;
public string Name
{
get{ return _name; }
set{ _name = value; }
}
private string _address;
public string Address
{
get{ return _address; }
set{ _address = value; }
}
}
3.属性的快捷方式
1).自动属性:prop+2Tap
2).属性封装 propfull+2Tap
二 对象和集合初始化器
1.对象初始化器
static void Main(string[] args)
{
Bookbook = new Book() { Id = 1, Title = "C#的高级指南", Price =120 };
Console.WriteLine("编号是:"+book.Id+"标题是:" +book.Title+"单价是:"+book.Price);
}
对象初始化器结合有参构造函数,为对象的属性赋初始值(对象初始化器结和构造函数结合使用,先执行构造函数):
Person person = new Person(1) { Name ="张大伟", Age = 45, Address = "北京海淀区"};
2.集合初始化器
List<Book> books = newList<Book>();
Book book1 = new Book() { Id = 1, Title ="C#的高级指南", Price = 120 };//使用对象初始化器
Book book2 = new Book() { Id = 2, Title ="ASP.NET的基础", Price = 43 };
Book book3 = new Book() { Id = 3, Title ="ASP.NET MVC", Price = 145 };
books.Add(book1);
books.Add(book2);
books.Add(book3);
foreach (Book eachBook in books)
{
Console.WriteLine("编号是:" +eachBook.Id + "标题是:" + eachBook.Title + "单价是:" +
eachBook.Price);
}
集合和对象初始化器结合使用:
List<Book> books = newList<Book>()
{
newBook() { Id = 1, Title = "C#的高级指南", Price = 120 },//使用对象初始化器
newBook() { Id = 2, Title = "ASP.NET的基础", Price = 43},
newBook() { Id = 3, Title = "ASP.NET MVC", Price = 145 }
}; //使用集合初始化器
foreach (Book eachBook in books)
{
//代码省略
}
三 .NET 的特殊数据类型
- 隐式类型
- 匿名类型
- 可空类型
隐式类型
主要用于:
声明局部类型变量
for 初始化语句
foreach 初始化语句
using 语句
匿名类型
语法
new {属性名 1=属性值 1,……属性名 n=属性值 n}
匿名类型中的属性赋值是一次性的,即匿名对象的属性是只读的。
例子:var student = new { Name="刘晓华",Age=22,Gender="女"};
可空类型
语法
System.Nullable<类型> 变量名
或
类型? 变量名
如果没有给属性赋予初始值,那么系统将根据属性的数据类型给予默认值。
string 是引用类型,对应的默认值是 null.
int是值类型,对应的默认值是 0;
System.Nullable<int> num = null;
Nullable<bool> flag = null;
或:
int? num = null;
bool? flag = null;
使用可空类型的以下属性解决问题。
(1)HasValue:属于 bool 类型,当变量包含非空值时,它被设置为 true。
(2)Value:类型与其对应的值类型相同,如果 HasValue 为 true,则说明 Value 包含有意义的值。
int? num = null;
int num2 = num ?? 0;
“??”运算符会首先判断左边的操作数“num”是否为 null,如果为 null,则返回“??”右边给出的值,否则返回左边的操作数。
四 可选参数和命名参数
1.可选参数
语法
[修饰符] 返回类型 方法名(必选参数1,…必须参数n,可选参数1=值,…可选参数n=值)
static void BookPage(string category,stringorder="Price",int pageIndex=1,int
pageSize=10)
{
Console.WriteLine("查看分类为{0}的图书,按{1}排序,页码是第{2}页,每页显示{3}条记录
",category,order,pageIndex,pageSize);
}
在主函数中调用该方法:
BookPage("ASP.NET");//使用全部默认参数
BookPage("ASP.NET","Click");//使用2个默认参数
2.命名参数
指定参数的名字类进行参数赋值,可以忽略参数的定义顺序。
优势:不考虑传递参数时的顺序,而且能明显看出每个参数值对应的参数,使代码更具可读性。
使用命名参数来调用方法的语法如下。
语法
方法名(参数 1 名:参数 1 值…参数 n 名:参数 n 值)
五 扩展方法
扩展方法赋予了程序可在现有类下扩展类的功能,而且不修改原本的类的程序代码
扩展方法的格式要求。
(1)必须是静态方法,且方法名不可以和现有的方法名冲突。
(2)扩展方法的第一个参数为要扩展的类型,必须附加一个 this 关键字。