C#中的自动属性、隐式类型var、对象初始化器与集合初始化器、扩展方法
1.自动属性(Auto-Implemented Properties)
//以前的写法 .net2.0
private string _userName;
public string UserName
{
get { return _userName; }
set { _userName= value; }
}
//现在 只适合3.5以上
public string_userName {get;set;}
2.隐式类型var
它是在编译已经能确定变量的类型,是根据后面的值自动推断类型,编译时把推断的类型替换掉var
看如下代码:
var v = new { Name="Tom",Age="",Email="Tom@163.com" };
Console.WriteLine(v.Name);
Console.WriteLine(v.Age);
Console.WriteLine(v.Email);
Console.ReadLine();
//var v.Name=”小明” ,隐式类型只能读取,不能赋值
3.对象初始化器与集合初始化器
对象初始化器
//写法一 DemoTest person = new DemoTest { Name="xiaoming",Age=18,Sex="boy"};
//写法二 DemoTest person = new DemoTest("123") { Name="xiaoming",Age=18,Sex="boy"};
//二种写法都在什么时候用?
//写法一 是在调用类的默认构造函数时用
//写法二 是在调用类的默认有参构造函数时用
集合初始化器
List<DemoTest> list= new List<DemoTes> {
new DemoTest(){ Age=,Name="xiaoming",Sex="boy"},
new DemoTest(){ Age=,Name="xiaohua",Sex="girl"}
};
4.扩展方法
static void Main(string[] args)
{
List<string> list = new List<string>();
list.Contains//转到定义
}

这些带向下箭头的都是扩展的,那么我们转到定义(f12)看下,这个扩展定义在Enumerable类里面,是不是跟大家想的不
一样?一般都是转到List<T>本类里面,所以所有的扩展方法,都在静态类中。
我们要写扩展方法的主要目的是什么?
当一个类型已经写好之后,需要给这个类型加一些方法,但是加这个方法的时候不能修改类型,不能修改这个类的源代码,那么大家会想直接修改源代码不就行了,假如.net2.0以前的版本list有一些方法是一个版本,你要是修改了可能有不兼容的问题
下面我们就自己写一个扩展方法
class Program
{
static void Main(string[] args)
{ //给NewClass加个扩展方法,输出18
NewClass newclass = new NewClass();
newclass.Age = ;
newclass.ShowMessage();
Console.ReadKey(); }
}
public class NewClass
{
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
public string Email
{
get;
set;
}
public void SayHello()
{
Console.WriteLine("Hello");
}
} //1.创建一个静态类
public static class DemoTest
{
public static void ShowMessage(this NewClass newclass)//这里必须加this,不加就是普通的方法
{
Console.WriteLine(newclass.Age);
}
}
下面我们给string加一个扩展方法:
class Program
{
static void Main(string[] args)
{
string str = "Hello";
int result = str.GetLength();
Console.WriteLine(result);
Console.ReadKey(); }
}
//1.创建一个静态类
public static class DemoTest
{
public static int GetLength(this string str)
{
//扩展方法不能访问类型中私有成员
return str.Length;
}
}
接下来我们用反编译看下:

扩展方法只是看起来像是某个对象的方法,从反编译我们可以看出实际上根本不是该对象的方法,其实就是调用了某个静态类中的方法。
C#中的自动属性、隐式类型var、对象初始化器与集合初始化器、扩展方法的更多相关文章
- C#语法糖之第一篇:自动属性&隐式类型
今天给大家分享一下C#语法糖的简单的两个知识点吧. 自动属性:在 C# 4.0 和更高版本中,当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁. 客户端代码还可通过这些属性创建对象 ...
- C#中的隐式类型var——详细示例解析
从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,它的具体类型由编译器根据上下文推断而出. 下面就让我来总结下隐式类型的一些特点: 1.va ...
- [C#] 隐式类型var —— 示例解析
从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,它的具体类型由编译器根据上下文推断而出. 下面就让我来总结下隐式类型的一些特点: 1.va ...
- linq和隐式类型var
隐式类型 var 强类型,声明的时候必须给变量赋值,编译器会根据值来确定其类型.只能出现在局部变量或脚本代码中. 使用范围: 简单类型:如int string等 复杂类型:如数组.类等 逻辑语句:fo ...
- 【C#】隐式类型var
在.NET 3.0后微软引入了隐式类型var,编译器可以自动判断变量的类型,通过var这个隐式类型,可以提高开发人员的开发效率,很多时候可以不考虑对象的类型,编译器会自动帮我们判断 使用隐式类型和使用 ...
- Java中的自动类型转换/隐式类型转换
整型.实型(常量).字符型数据可以混合运算.运算中,不同类型的数据先转化为同一类型,然后进行运算. 转换从低级到高级. 自动类型转换必须满足转换前的数据类型的位数要低于转换后的数据类型,例如: sho ...
- C# var 隐式类型 var 用法 特点
var 关键字是C# 3.0 开始,在方法范围中声明的变量: var有以下特点: * 1.var在编译器编译的时候根据初始值推断出其的类型 * 2.不能赋值除了初始值类型之外的其他类 ...
- C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数
一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...
- .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器
开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...
随机推荐
- codevs1281 Xn数列
题目描述 Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入 ...
- MyEclipse消除frame引起的the file xxx cannot be found
因为该页面所指向的页面路径不对,便进行手动修改,修改时却出现了很烦的问题,输入一个字就弹出一个提示框“the file XXX can not be found.Please check the lo ...
- C++(六)— 输入方式
1.输入包含空格的字符串 使用 getline(cin, str)读取一行字符串,遇到换行符停止:cin>>str,是遇到空格就停止. 实现:输入两个字符,在第一个字符中删除第二个字符中出 ...
- message消息框
.messager.show options 在屏幕右下角显示一条消息窗口.该选项参数是一个可配置的对象:showType:定义将如何显示该消息.可用值有:null,slide,fade,show.默 ...
- Linux-NoSQL之Redis(三)
一.Redis数据常用操作 1.string常用操作 set key1 aminglinux get key1 set key1 aming //一个key对应一个value,多次赋值,会覆盖前面 ...
- C++ 值传递、址传递、引用传递
一.值传递 int func(int p) 值传递会在栈中开辟一块空间 p,使得p和实参的a 同值. 此时你在函数func里面对p进行任何操作都不会对原值a产生任何影响.因为a 和p本就就是两个变 ...
- 【遍历二叉树】12往二叉树中添加层次链表的信息【Populating Next Right Pointers in Each Node II】
本质上是二叉树的层次遍历,遍历层次的过程当中把next指针加上去. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- luogu1833 樱花
背包问题小合集 01背包 完全背包 多重背包混着来 对于01背包:把它想象成最大物品数为1的多重背包 对于完全背包:把它想象成最大物品数为m/w[i]的多重背包 对于多重背包:把它想象成...等等这本 ...
- java判断一个类是否公共类
Modifier.isPublic([类].getModifiers()) Modifier.isAbstract([类].getModifiers())
- tiny4412sdk-1506原生uboot卡死
于16年2月多购买了tiny4412sdk-1506,用友善之臂(以下简称友善)的superboot是可以进入linux,而用三星原始的uboot_tiny4412-20130729则不可以.出现现象 ...