总结下遇到的C#新语法
1.属性的private set读写器
public int x { get; private set; }
是另一种简写, set前面的private声明是告诉编译器属性X是只读(read-only)的. 意思是对于外部类不能通过属性X给x赋值,而只能读取其值。
例子:
public class PswChangingEventArgs : EventArgs
{
public readonly string message; public PswChangingEventArgs(string _message)
{
this.message = _message;
}
} public class TestClass
{
public event EventHandler<PswChangingEventArgs> PasswordChanging; // 普通非泛型EventHandler不支持自定义EventArgs private string _pwd;
public string Pwd
{
get { return _pwd; }
private set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentException("password cannot be empty");
}
if (_pwd != value)
{
if (PasswordChanging != null) PasswordChanging(this, new PswChangingEventArgs("password已经改变"));
}
_pwd = value;
}
} public void Fun()
{
this._pwd = "abc"; // 直接赋值,什么额外事情都不会发生
this.Pwd = "efg"; // 可以引发密码更改事件,可以进行校验
}
} class Program
{
static void Main(string[] args)
{
TestClass a = new TestClass();
a.PasswordChanging += new EventHandler<PswChangingEventArgs>(ShowMessage);
a.Fun();
//a.Pwd = "1111"; //error,private set:外部不可写入
Console.WriteLine("执行Fun()后password:" + a.Pwd); //ok,外部可以读取 Console.Read();
} static void ShowMessage(object sender, PswChangingEventArgs e)
{
Console.WriteLine("执行Main()里的ShowMessage方法");
Console.WriteLine("sender:"+sender.ToString() + ",message:" + e.message);
}
}
①.若直接用set,则类外部也可以访问通过Pwd属性读取、写入pwd字段了,扩大了访问权限,破坏了封装、隐蔽性
②.若不用set,则外部只可访问不可写入,但类内部方法虽可读取写入,但写入时不会应发对应操作,不便
③.为了对外隐藏pwd字段的写入(仍可读取),对内可以在写入时设定一些操作。
2.i??操作符:
?? 运算符称为 null 合并运算符,用于定义可以为 null 值的类型和引用类型的默认值。 如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数。
例子:
//int i = null; //error
int? i = null;
Console.WriteLine(i);
int j = i ?? ;
//等价如下:
//int j = i.HasValue ? i.Value : 1;
Console.WriteLine(i);
Console.WriteLine(j);
3.默认参数,例如:
Fun(int a=1),调用时会看到提示Fun([int a=1]),a参数指不指定都合法。
class Program
{
static void Main(string[] args)
{
TestMethod("Foo");
TestMethod("Foo", "Bar1");
TestMethod("Foo", "Bar1", "Baz1"); Console.Read();
} static void TestMethod(string foo, string bar = "Bar", string baz = "Baz")
{
Console.WriteLine("{0, -5} - {1, -5} - {2, -5}", foo, bar, baz);
}
}
4.readonly 关键字与const 关键字不同。
const 字段只能在该字段的声明中初始化,。 readonly 字段可以在声明或构造函数中初始化。
因此,根据所使用的构造函数,readonly 字段可能具有不同的值。 另外,const 字段为编译时常数,而 readonly 字段可用于运行时常数。
public class Test
{
public readonly string ConnectionString = "User ID=bbb;Password=aaa;Persist Security Info=True;Initial Catalog=xxx"; //声明时赋值
public readonly string DatasourceName; //声明但不赋值 public const string ErrorMessage = "数据库连接出错"; //只能在声明的时候定义.且在类外部调用时使用方法:Test.ErrorMessage; public Test(string _datasourceName, string _connectionString) //构造函数里给readOnly变量赋值。不可给const赋值。
{
DatasourceName = _datasourceName;
ConnectionString = _connectionString; //先执行上文的ConnectionString,再执行这里赋值。所以ConnectionString值将不再是上文的"User ID=bbb;Password=aaa; "
}
}
总结下遇到的C#新语法的更多相关文章
- [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性
回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...
- qt5中信号和槽的新语法
qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...
- .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器
开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...
- .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法
开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...
- 一起学习c++11——c++11中的新语法
c++11新语法1: auto关键字 c++11 添加的最有用的一个特性应该就是auto关键字. 不知道大家有没有写过这样的代码: std::map<std::string, std::vect ...
- Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API
新语法 方法引用Method references Lambda语法 Lambda语法在AndroidStudio中报错 Stream API 我正参加2016CSDN博客之星的比赛 希望您能投下宝贵 ...
- 第十六节:语法总结(3)(C#6.0和C#7.0新语法)
一. C# 6.0 新语法 1. 自动属性初始化可以赋值 /// <summary> /// 自动属性初始化 /// </summary> public class UserI ...
- ES6新语法
ES6新语法概览 简介 ES6是JavaScript语言的新一代标准,加入了一些新的功能和语法,正式发布于2015年6月,亦称ES2015:该标准由ECMA(欧洲计算机制造联合会)的第39号技术专家委 ...
- Java之JDK7的新语法探索
Java之JDK7的新语法探索 前言 感谢! 承蒙关照~ 字面量: 各种精致的表达方式: 八进制以0开头,十六进制0X开头,二进制以0B开头. 二进制运算时,应该写成这样才直观: &15 -& ...
随机推荐
- 利用SQL语句查询数据库中所有表
Oracle: SELECT * FROM ALL_TABLES;系统里有权限的表 SELECT * FROM DBA_TABLES; 系统表 SELECT * FROM USER_TABLES; 当 ...
- org.apache.log4j与org.apache.commons.logging这两个包有什么区别
apache common logging是一种log的框架接口,它本身并不实现log记录的功能,而是在运行时动态查找目前存在的日志库,调用相关的日志函数,从而隐藏具体的日志实现log4j是具体的日志 ...
- java实例--海盗的最优方案
package unit4; public class Pirate{ private String name; private int[] schemes; private int index; p ...
- 针对mysql中分表批量添加字段
项目中有用到这种类似的分表,如果要添加一个字段的话,该怎么办呢? dba表示弄 一个脚本批量处理就行了,卧槽,这我哪会啊,于是硬着头皮又继续问dba,dba给一个脚本,一看是这样的. #!/bin/b ...
- Travelling
Travelling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- JSTL 的 if else : 有 c:if 没有 else 的处理
jstl的c:if 没有else 想要实现if...else...: 可以用下面的解决 -------------------------------------------------------- ...
- java Android SDK安装与环境变量配置以及开发第一个Android程序
JAVA的安装与环境变量的配置 1.先下载JAVA,并且安装. 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u3 ...
- 获取枚举类型Description特性的描述信息
C#中可以对枚举类型用Description特性描述. 如果需要对Description信息获取,那么可以定义一个扩展方法来实现.代码如下: public static class EnumExten ...
- CKEditor实现图片上传
本人用的CKEditor版本为4.3 CKEditor配置和部署参考CKEditor4.x部署和配置. CKEditor编辑器的工具栏中初始的时候应该是这样子的,没有图片上传按钮 并且预览中有一堆火星 ...
- SQL Server 中的触发器(trigger)
SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 ...