总结下遇到的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 -& ...
随机推荐
- Spring的循环依赖问题
spring容器循环依赖包括构造器循环依赖和setter循环依赖,那Spring容器如何解决循环依赖呢?首先让我们来定义循环引用类: 在Spring中将循环依赖的处理分成了3种情况: 构造器循环依赖 ...
- 【Linux程序设计】之Linux库函数的使用,多文件程序开发,静态与共享函数
这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的.贴出来纯粹是聊胜于无. 实验题目:Linux基础程序设计综合实验 实验目的:熟悉并掌握Linux库函数的使用, ...
- Complete the Sequence[HDU1121]
Complete the Sequence Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- LianLianKan[HDU4272]
LianLianKan Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- C#线程间同步无法关闭
用C#做了个线程间同步的小程序,但每次关闭窗口后进程仍然在,是什么原因? 解决方法: 要加一句 线程.IsBackground = true; 否则退出的只是窗体 上面的方法没看懂... MSDN上说 ...
- 有关g++编译调试的问题
打了个指针版的treap,想用gdb调试,用gcc -g ×××.cpp -o a 时却报错了——直接用gcc编译却不会报错,提示:对‘operator new(unsigned int)’未定义的引 ...
- POJ 3661 (线性DP)
题目链接: http://poj.org/problem?id=3661 题目大意:牛跑步.有N分钟,M疲劳值.每分钟跑的距离不同.每分钟可以选择跑步或是休息.一旦休息了必须休息到疲劳值为0.0疲劳值 ...
- iPhone开发常问的十个问题
iPhone开发常问的十个问题 前言 今天去stackoverflow.com上看了一下iPhone标签下排名最高的10个问题,将它们整理出来,希望这些常见问题能帮到一些iPhone开发的初学者.本来 ...
- 【C语言】14-返回指针的函数与指向函数的指针
前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如 ...
- Odoo Entypo Regular Icon List
参考地址: http://www.fontslog.com/entypo-regular-otf-33800.htm#custompreview 或 http://www.w3cplus.com/w3 ...