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#新语法的更多相关文章

  1. [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性

    回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...

  2. qt5中信号和槽的新语法

    qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...

  3. .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

    开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...

  4. .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

    开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...

  5. 一起学习c++11——c++11中的新语法

    c++11新语法1: auto关键字 c++11 添加的最有用的一个特性应该就是auto关键字. 不知道大家有没有写过这样的代码: std::map<std::string, std::vect ...

  6. Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API

    新语法 方法引用Method references Lambda语法 Lambda语法在AndroidStudio中报错 Stream API 我正参加2016CSDN博客之星的比赛 希望您能投下宝贵 ...

  7. 第十六节:语法总结(3)(C#6.0和C#7.0新语法)

    一. C# 6.0 新语法 1. 自动属性初始化可以赋值 /// <summary> /// 自动属性初始化 /// </summary> public class UserI ...

  8. ES6新语法

    ES6新语法概览 简介 ES6是JavaScript语言的新一代标准,加入了一些新的功能和语法,正式发布于2015年6月,亦称ES2015:该标准由ECMA(欧洲计算机制造联合会)的第39号技术专家委 ...

  9. Java之JDK7的新语法探索

    Java之JDK7的新语法探索 前言 感谢! 承蒙关照~ 字面量: 各种精致的表达方式: 八进制以0开头,十六进制0X开头,二进制以0B开头. 二进制运算时,应该写成这样才直观: &15 -& ...

随机推荐

  1. Github排行榜

    http://githubranking.com/ 中国区开发者排行榜: http://githubrank.com/ 也可以在官网查询: https://github.com/search?q=st ...

  2. Xamarin.iOS编译时无法连接苹果系统

    Xamarin.iOS编译时无法连接苹果系统   错误信息:Unable to connect to Address=’***.***.***.***’ with User=’***’   即使Vis ...

  3. Chart系列(二):数据绑定

    1.绑定到OleDbDataReader: // Define the database query string mySelectQuery="SELECT Name, Sales FRO ...

  4. Edmond_Karp算法

    核心思想:通过bfs不断在网络中寻找最短的增广路,从而求得最大流.时间复杂度O(VE^) 算法模板: int Edmond_Karp(int s,int t) { ; memset(flow,,siz ...

  5. AppCache 离线存储 应用程序缓存 API 及注意事项

    使用ApplicationCache接口实现离线缓存 原文:http://www.mb5u.com/HTML5/html5_96464.html 推荐:html5 application cache遇 ...

  6. Codeforces Round #192 (Div. 2) A. Cakeminator

    #include <iostream> #include <vector> using namespace std; int main(){ int r,c; cin > ...

  7. 转:深入理解JavaScript闭包概念

    闭包向来给包括JavaScript程序员在内的程序员以神秘,高深的感觉,事实上,闭包的概念在函数式编程语言中算不上是难以理解的知识.如果对作用域,函数为独立的对象这样的基本概念理解较好的话,理解闭包的 ...

  8. [Unity2D]精灵动画

    通常我们在游戏里面创建的精灵比如玩家主角,它在移动的过程中一般会带有一些动画的效果,比如两只脚前后地移动,那么这种动画效果的实现和控制就可以通过Unity2D的动画系统来实现. 要添加这样的动画,首先 ...

  9. 【wikioi】1022 覆盖(匈牙利)

    http://www.wikioi.com/problem/1022/ 好不容易来一次1A,,水题啊.. 染色后裸匈牙利orz #include <cstdio> #include < ...

  10. NHibernate's inverse - what does it really mean?

    NHibernate's concept of 'inverse' in relationships is probably the most often discussed and misunder ...