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开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...
随机推荐
- logstash的output插件
logstash 的output插件 nginx,logstash和redis在同一台机子上 yum -y install redis,vim /etc/redis.conf 设置bind 0.0.0 ...
- spring boot项目多环境配置文件设置
具体做法: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中:prod环境下的配置配置在application-prod.prope ...
- 大话设计模式--原型模式 Prototype -- C++实现
1. 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象... 注意: 拷贝的时候是浅拷贝 还是 深拷贝, 来考虑是否需要重写拷贝构造函数. 关键在于: virtual Pro ...
- 使用button的:after伪类选择器内容的跳动
按钮的css样式,想要作个美观一点的按钮,使用:after伪类选择器在按钮后跟随"!!"的符号,但点击按钮时按钮的值内容动,但跟随的"!!"符合不动,这样看起来 ...
- Win7远程桌面_ZC01
1.Win7的远程桌面,在一开始设置成全屏显示,当远程桌面窗口 切换为非全屏的状态时,要想再切换成全屏状态 就比较困难了(我的笔记本ThinkpadE440一直没有弄成功...) 1.1.网上搜索各种 ...
- Xcode 中代码提示不显示
解决办法: Xcode->Window->Organizer->Projects选中你的项目,点击如下图Derived Data右侧的Delete按钮 DerivedData从字面上 ...
- C#返回Json,js解析Json,并添加到select标签中
后台: List<Student> list=GetAll();//id name string json = new JavaScriptSerializer().Serialize(l ...
- cf 429B Working out(简单dp)
B. Working out time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- scanf和cin的返回值
需要连续从标准输入读取数据时,可以采用下面两种不同的方式判断文件结束: [cpp] view plaincopy int i; while(scanf("%d",&i) ...
- C++11特性 gcc源码包
1.下载gcc最新的源码包 2.解压缩 tar -xf gcc-4.9.1.tar.gz 3. cd gcc-4.9.1 4.运行download_prerequisites脚本, ./contri ...