C#学习笔记(七):智能编译器
自动实现属性
C#提供的set/get可以让我们很方便的使用属性,但是某些情况下书写还是稍微麻烦了点,如下:
public class Test
{
private string _name; public string name
{
set { _name = value; }
get { return _name; }
}
}
这种情况我们可以如下进行简写:
public class Test
{
public string name { set; get; }
}
当然,实际上我们在编译的时候,编译器会自动帮我们生成类似于没有简化的代码的样子。
隐式类型
我们如果在声明变量时想偷偷懒的话,可以使用隐式类型关键字var,如下:
string str1 = "hello";
var str2 = "world";
var str3 = str1;
var str4 = str2;
上面的4个变量都是string类型的,而使用var定义的话,则把类型交给编译器,编译器会根据我们赋予的值确定变量的类型,最后编译时编译器会编译为如下的代码:
string str1 = "hello";
string str2 = "world";
string str3 = str1;
string str4 = str2;
我们看看隐式类型需要注意的地方:
- 声明的变量必须是局部变量,不能为静态字段或实例字段;
- 变量声明时必须进行初始化;
- 变量不能初始化为方法组或匿名函数;
- 变量不能初始化为null;
- 不能用var来声明方法中的参数;
- 不能使用没有赋值的变量赋值给var,如下是错误的:
string str1;
var str2 = str1;
隐式类型数组
隐式类型同样可以用在数组上:
var a1 = new[] { , , };
var a2 = new[] { "a", "b", "c" };
初始化器
初始化器可以在实例化一个对象时直接设置其内部public属性的值,可以避免手动编写大量的构造函数,如下:
using System; namespace Study
{
class Program
{
static void Main(string[] args)
{
//普通初始化
Test t1 = new Test();
Console.WriteLine(t1);
Test t2 = new Test();
Console.WriteLine(t2); //使用初始化器初始化
Test t3 = new Test { a = , b = 2.5f };
Console.WriteLine(t3);
Test t4 = new Test() { b = 1.111f };
Console.WriteLine(t4); Console.Read();
}
} public class Test
{
public int a; public float b; public Test()
{
} public Test(int a)
{
this.a = a;
} public override string ToString()
{
return "a: " + a + ", b: " + b;
}
}
}
结果如下:
a: , b:
a: , b:
a: , b: 2.5
a: , b: 1.111
集合的初始化器
当我们创建集合的时候,就可以使用初始化器向集合中添加已经设定好值的对象了,方便快捷:
using System;
using System.Collections.Generic; namespace Study
{
class Program
{
static void Main(string[] args)
{
//列表
List<Test> list = new List<Test>
{
new Test(),
new Test{a = , b = 0.1f},
new Test(){b = 200.5f},
null,
}; //哈希表
Dictionary<int, Test> map = new Dictionary<int, Test>
{
{, new Test()},
{, new Test{a = , b = 0.1f}},
{, new Test(){b = 200.5f}},
{, null},
}; Console.Read();
}
} public class Test
{
public int a; public float b; public Test()
{
} public Test(int a)
{
this.a = a;
} public override string ToString()
{
return "a: " + a + ", b: " + b;
}
}
}
匿名类
另外初始化器还可以生成匿名类,但是需要注意的是匿名类中的属性是只读的:
using System; namespace Study
{
class Program
{
static void Main(string[] args)
{
var person = new {name = "Alen", age = };
//这是不允许的
//person.age = 20;
Console.WriteLine(person.age); Console.Read();
}
}
}
可选参数
在C#4.0之前我们对方法参数设置默认值时一般使用重载,一般是这么写的:
public void Func(int a, int b)
{
//...
} public void Func(int a)
{
Func(a, );
}
如果使用可选参数则会更加方便:
public void Func(int a, int b = )
{
//...
}
可选参数需要注意的地方:
- 可选参数必须位于必选参数之后;
- 可选参数的默认值必须是常量,如数字、常量字符串、null、const成员和枚举成员等。
- params修饰的参数数组不能为可选参数;
- ref或out引用传递的参数不能为可选参数;
命名实参
一般配合可选参数使用,我们具体来看一个例子:
public static void Func(int a, int b = , bool c = true, string d = "center", int e = )
{
//...
}
如果只需要设置参数a和e,其它参数均保持默认值,一般的写法如下:
Func(, , true, "center", );
试想一下,如果默认参数特别多但是我们只需要设定最后一个参数时,是不是感觉要写死,不用担心,C#引入的命名实参可以帮我们解决这个问题,我们只需要这么编写即可:
//只为可选参数指定命名实参
Func(, e : );
//为所有参数指定命名实参
Func(a : , e : );
C#学习笔记(七):智能编译器的更多相关文章
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- python3.4学习笔记(七) 学习网站博客推荐
python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
- iOS 学习笔记七 【博爱手把手教你使用2016年gitHub Mac客户端】
iOS 学习笔记七 [博爱手把手教你使用gitHub客户端] 第一步:首先下载git客户端 链接:https://desktop.github.com 第二步:fork 大神的代码[这里以我的代码为例 ...
- 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整
今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...
- Linux学习笔记(七) 查询系统
1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...
- go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)
目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...
- Java IO学习笔记七:多路复用从单线程到多线程
作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...
随机推荐
- LA 4119 (差分数列 多项式) Always an integer
题意: 给出一个形如(P)/D的多项式,其中P是n的整系数多项式,D为整数. 问是否对于所有的正整数n,该多项式的值都是整数. 分析: 可以用数学归纳法证明,若P(n)是k次多项式,则P(n+1) - ...
- UVa 11168 (凸包+点到直线距离) Airport
题意: 平面上有n个点,求一条直线使得所有点都在直线的同一侧.并求这些点到直线的距离之和的最小值. 分析: 只要直线不穿过凸包,就满足第一个条件.要使距离和最小,那直线一定在凸包的边上.所以求出凸包以 ...
- 为什么多数游戏服务端是用 C++ 来写
早年开发游戏必须用C++,这没得说,2000-2004年,java还没有nio,其他动态语言不抗重负,只能C/C++能开发出完整可用的游戏服务端.直到2005年,韩国的游戏很多都还是纯C++写服务端, ...
- Oracle中使用escape关键字实现like匹配特殊字符,以及&字符的转义
转:http://blog.chinaunix.net/uid-26896647-id-3433968.html 问题描述:如果在一个表中的一个字段上存在'&', '_', '%'这样的特 ...
- 把 HttpHandler.ashx 修改为 异步编程 异步操作
在 ASP.NET 中,所有的处理程序类必须实现 IHttpHandler 接口或者实现 IHttpAsyncHandler 接口,这两个接口的区别是前者是一个同步接口,后者是一个异步处理模式的接口. ...
- 安装--SambaServce
参考地址:快跑蚂蚁的linux之旅--redhat安装配置samba实验win共享linux主机目录 1.使用rpm -qa|grep "samba",查看samba安装包是否安装 ...
- Java与WCF交互(一):Java客户端调用WCF服务
最近开始了解WCF,写了个最简单的Helloworld,想通过java客户端实现通信.没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参 ...
- .NET之美——C#中的委托和事件(续)
C#中的委托和事件(续) 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为 ...
- 动态 SQL
MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...
- 仿酷狗音乐播放器开发日志二十五 duilib右键事件的不足的bug修复
转载请说明原出处,谢谢~~ 虽然仿酷狗的各个菜单早就写好了,但是一直没有附加到程序里.今天把菜单和播放列表控件关联时发现了问题. 和播放列表相关的菜单有三个,分别是每个音乐项目控件相关的菜单.分组的菜 ...