当前位置:网站首页 / vs2015 / 正文

[AY博客] AY陪你第一时间走进Visual Studio 2015-探究C#6.0语法这块的变化2

时间:2015年07月21日 | 作者 : aaronyang | 分类 : vs2015 | 浏览: 4039次 | 评论 0

上次看了微软vs2015的Blend,说实话让我很不想立即使用,很难受~~

本文参考VS2015的官网的MSDN,进行DEMO方式讲解

新建.net framework4.6的控制台项目

Image 16.png

nameof     使用 nameof 表达式可以提取参数的名称,可以在错误消息中使用 不是关键字的自己取的名字,而无需对字符串进行硬编码。 这使代码可以在重构时保持正确。 此功能也可用于挂接“模型-视图-控制器”MVC 链接并触发属性更改事件。 2. 顶部引用静态类

方法名字加了虚线

Image 17.png

接着我们引用 C#6.0的引用静态类的方式把System.Console放在顶部,using static System.Console;然后就可以直接使用ReadLine方法,WriteLine等

使用nameof验证参数

Image 18.png

你就当把类型 ToString()了。

如果使用Hello AY,重构的时候,可能值变了,这里的异常提示却没有变化。使用nameof可以解决。nameof返回名字,这里的名字是s



MVC Actions 链接

<%= Html.ActionLink("Sign up",
             @typeof(UserController),
             @nameof(UserController.SignUp))
%>

INotifyPropertyChanged

   int p
        {
            get { return this.p; }
            set {
                this.p = value;
                PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.p)); } // nameof(p) 也行
        }

xaml中注册依赖属性

public static DependencyProperty AgeProperty = DependencyProperty.Register(nameof(Age), typeof(int), typeof(C));

日志中使用:

void f(int i) {
    Log(nameof(f), "method entry");
}

特性中使用:

[DebuggerDisplay("={" + nameof(GetString) + "()}")]
class C {
    string GetString() { }
}

综合代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
using AYUI = System.Xml;

namespace ay_ch6_1
{
    class Program
    {
        static void Main(string[] args)
        {
            NameofMethod("Hello AY");
            //NameofMethod(null);
            ReadLine();

        }
        public static void NameofMethod(string s)
        {
            //if (s == null) throw new ArgumentNullException("s");
            //if (s == null) throw new ArgumentNullException(nameof(s));
            var ay = new AY();

            WriteLine(nameof(AY));
            WriteLine(nameof(AY.Run));
            WriteLine(nameof(AY.Sleep));
            WriteLine(nameof(ay.Method2));

            WriteLine(nameof(AYUI));
            WriteLine(nameof(s));
            WriteLine(nameof(ay.f));
            //WriteLine(nameof(ay.Method2(2)));
            //nameof(ay.f<T>); 语法错误
            //nameof(ay.f<>); 语法错误
        }


    }
    class AY
    {
        public static void Run() { }
        public static void Sleep() { }
        public int Method2(int z) { return z; }
        public string f<T>() => nameof(T);
    }


}

效果图:

Image 21.png

初始化自动属性

新建AY_Info

   class AY_Info {
        public string MyName { get; set; } = "AY";
        public int MyAge { get; } = 25;

        public DateTime BornDate { get; set; } = new DateTime(1991, 4, 4);
    }


字符串插值    可以使用字符串内插表达式构造字符串。 内插字符串表达式类似于包含表达式的模板字符串。 C# 通过将表达式替换为表达式结果的 ToString 表示形式来创建字符串。 与复合格式设置相比,内插字符串在参数方面更易于理解

接下来使用AY_Info

效果图:

这个语法好像  字符串模板一样,而且字符串中还有语法提示。

结合nameof和字符串插值的一个ay例子

Image 24.png

nameof 运算符用于识别加密参数的名称(“filename”)以及 ArgumentException 构造函数的第二个参数。Visual Studio 2015 完全了解字符串插值语法,为嵌入内插字符串的代码块提供颜色编码和 IntelliSense

接下来,字符串插值还可以插入表达式,我们使用括号包裹起来( ),然后在里面写入C#代码,类似T4模板

Image 25.png

效果如下:

Image 26.png

那么模板中逗号是啥,经过我研究了一会

Image 28.png

字符串凑满指定值长度,如果原长度已经大于当前值,则最小长度就是原字符串的长度。

Dictionary初始化支持索引,很像Json吧

Image 30.png

?:    和 ?[    空判断运算符

Ay_Info类里面增加个

  public string School { get; set; } = null;

Image 31.png

下面来个复杂点的

Image 32.png

网上的?[0]就是说前面的对象不为空,例如是   List类型的A,然后A[0]表示List的第一个元素,那么A?[0] 就是如果A不是null,就返回 A[0]

只读属性初始化赋值,没啥好讲的

public class Customer
{
   //只读的属性  
    public string Name { get; };
    //在初始化方法中赋值,可行~
    public Customer(string first, string last)
    {
        Name = first + " " + last;
    }
}

表达式主体,方法函数支持lambda写法

Image 33.png

这样用貌似没意义,那么如果这样写呢?

    class AY_Info
    {
        public string MyName { get; set; } = "AY";
        public int MyAge { get; } = 25;

        public DateTime BornDate { get; set; } = new DateTime(1991, 4, 4);

        public int BornDateMonth => BornDate.Month;

        public override string ToString() => $"{MyName}:{MyAge}";

        public string School { get; set; } = null;
    }

纯属于个人感觉,感觉挺好用


引用静态的扩展方法,然后省去前缀,跟那个引用静态类命名空间差不多,感觉像调用父类的方法了。

using static System.Linq.Enumerable; // The type, not the namespace
class Program
{
    static void Main()
    {
        var range = Range(5, 17);                // Ok: not extension
        var odd = Where(range, i => i % 2 == 1); // Error, not in scope
        var even = range.Where(i => i % 2 == 0); // Ok
    }
}

异常筛选器  可以在 catch 子句中使用异常筛选器确定 catch 子句是否应处理异常。 没有此功能时,必须重新引发异常,这会剪裁在重新引发的异常中报告的调用堆栈。

在以前,在同一个 try-catch 语句中可以使用一个以上的特定 catch 子句。 这种情况下 catch 子句的顺序很重要,因为会按顺序检查 catch 子句。 将先捕获特定程度较高的异常,而不是特定程度较小的异常。 如果对 catch 块进行排序以使永远不能达到后面的块,编译器将产生错误。

现在,这里myfilter我也不知道在哪定义的,下次在解决。

try { … }
catch (MyException e) when (myfilter(e))
{
    …
}

下面的一个是抄网上的

可异步等待的Catch块

Resource res = null;
try
{
    res = await Resource.OpenAsync(…);       // You could do this.
    …
} 
catch(ResourceException e)
{
    await Resource.LogAsync(res, e);         // Now you can do this …
}
finally
{
    if (res != null) await res.CloseAsync(); // … and this.
}

自从在 C# 5.0 中引入了 await,在 catch 和 finally 块中支持 await 的重要性超出了原先的预期。例如,从 catch 或 finally 块中调用异步方法的模式相当普遍,尤其是在进行清理或日志记录期间。现在,在 C# 6.0 中,这最终成为可能。

第二个异常相关的功能(自 1.0 起,在 Visual Basic 中可用)是支持掌握按照特定异常类型进行筛选的异常筛选器,现在这一功能可以指定 if 子句来进一步限制异常是否将被 catch 块捕获。(有时还可以利用此功能的副作用,如将异常记录为由实际上不执行任何异常处理的“飞逝”的异常。)有关此功能值得注意的一点就是,如果您的应用程序有任何机会可能进行本地化,请避免通过异常消息执行 catch 条件表达式,因为在本地化后不做任何更改的话,它们将不再工作

好了,今天就写到这里,======================================== AYUI       www.ayjs.net      AY         杨洋原创编写,请不要转载谢谢===============


推荐您阅读更多有关于“C#vs2015,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

抖音:wpfui 工作wpf,目前主maui

招聘合肥一枚WPF工程师,跟我一个开发组,10-15K,欢迎打扰

目前在合肥市企迈科技就职

AYUI8全源码 Github地址:前往获取

杨洋(AaronYang简称AY,安徽六安人)AY唯一QQ:875556003和AY交流

高中学历,2010年开始web开发,2015年1月17日开始学习WPF

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

标签列表