zoukankan      html  css  js  c++  java
  • 第 4 章—— C# 语言特性(《精通 ASP.NET MVC 5》)

        这里只提供各个特性的简单概括。

        C# 的完整指南可参阅《Introducing Visual C#》、深度了解 LINQ 可参考《Pro LINQ in C#

    4.1 准备示例项目

        为了演示语言特性,笔者用 “ASP.NET MVC 4 Application” 模板创建了一个新的 Visual Studio 项目。(名称为 LanguageFeatures,选择 “空模板” 作为初始内容,并对 “添加文件夹和核心引用” 选中了 “MVC” 选项)

        (本章需要一个简单的控制器来演示这些语言特性,所以在 “Controllers” 文件夹中创建 HomeControllers.cs 文件 —— 右击 Controllers 文件夹,选择 “添加”、“控制器”,然后从 “选择支架” 菜单中选择 “空的 MVC 5 控制器”,单击 “添加” 按钮,将名称设置为 “HomeController”,单击 “添加” 按钮。最后,编辑其内容)

      添加 System.Net.Http 程序集

        本章后面部分()将使用一个依赖于 System.Net.Http 程序集的示例(该程序集默认情况下不会添加到 MVC 项目中)—— 打开 “引用管理器” 窗口,在窗口左侧选择 “程序集”,并勾选 “System.Net.Http”选项。

    特性一、使用自动实现的属性

        使用属性要比使用字段更好,因为你可以修改 get 块和 set 块中的语句,而不需要修改依赖于这个属性的类。

        属性固然号,但是当一个类有很多属性时,事情就变得有点乏味了 —— 所有属性都要对字段协调访问 —— 产生了一个不必要的冗长的类文件。

        属性要具有灵活性 —— 没有重复的 getter 和 setter,解决办法是使用一种自动实现的属性(也成为 “自动属性”)

        利用自动属性,可以采用字段支持式属性模式,而不需要定义这个字段或在 getter 和 setter 中指定代码,如下所示:

            public int ID { get; set;}

            public int Name { get; set;}

            public int Price { get; set;}

        注意,这里并未定义 getter 和 setter的体,也未定义该属性返回的字段。—— 这两者都由 C# 编译器在这个类被编译时自动完成。使用自动属性与使用规则属性没什么不同。

        通过使用自动属性可以减少一些输入,形成更易于阅读的代码。(并保持了属性的灵活性)

        如果需要改变一个属性的实现方式,还可以返回到规则属性的格式。(必须同时实现 getter 和 setter,以回到规则属性的定义方式。另外还有一点要注意 —— 必须补上属性所对应的字段的定义)

        C# 在一个属性中不支持混用自动和规则风格的 getter 和 setter 。

    特性二、使用对象与集合的初始化器

        另一个烦人的编程任务是构造一个新的对象,然后给属性赋值。例如:

            Product myProduct = new Product();    //创建一个新的 Product 对象

            //设置属性值

            myProduct.ID = 100;

            myProduct.Name = "口香糖";

            myProduct.Description = "请不要吞咽";

            myProduct.Price = "2M";

            myProduct.Category = "零食";

        在这个示例中必须要通过 2 个步骤才能创建 Product 对象:创建对象、设置参数值。—— 而使用对象初始化器特性可以在一个步骤中创建并填写 Product 实例,如下所示:

            Product myProduct = new Product {

            ID = 100,

            Name = "口香糖",

            Description = "请不要吞咽", Price = "2M", Category = "零食"

            }

        Product 名称之后所调用的花括号形成了初始化器,目的是为参数提供值,以此作为该对象的构造过程。

        以这种同样的特性作为构造过程,也能对集合和数组的内容进行初始化。

            string[ ]  stringArray = { "apple", "orange", "plum" };

            List<int> intList = new List<int> { 10, 20, 30, 40 };

            Dictionary<string, int> myDic = new Dictionary<string, int> { { "apple",10 }, { "orange", 20 } };

        这种特性是一种语法的便利,它只是使 C# 用起来更舒适,并没有任何其他影响或好处。

    特性三、使用扩展方法

        扩展方法是指给那些不是你拥有的、不能直接修改的类添加方法的一种方便的办法。

        在 Models 文件夹中创建 MyExtensionMethods.cs 类文件

            public static class MyExtensionMethods
            {
              public static decimal TotalPrices(this ShoppingCart cartParam)
              {
                decimal total = 0;
                foreach (Product prod in cartParam.Products)
                {
                  total += prod.Price;
                }
              return total;
              }
            }

        第一个参数前的 this 关键字把 TotalPrices 标记为是一个扩展方法。

        第一个参数告诉 .NET,这个扩展方法运用于哪个类 —— 此例为 ShoppingCart 类。(可以通过使用 cartParam 参数类引用 ShoppingCart 类的实例,ShoppingCart 类是这个扩展方法所运用的类)

        通过使用扩展方法可以可以扩展类的功能,但只能使用有权限访问的类成员。(方法、字段、属性等)

        TotalPrices 虽然是由一个完全不同的类所定义的扩展方法,但依然可以像其他方法一样在 ShoppingCart 对象上调用,就好像它是 ShoppingCart 类的一部分。(如果你的扩展类和当前类位于同一命名空间中,或是在 using 语句子项的命名空间中,.NET便会找到它们)

      4.4.1 对接口运用扩展方法

        也可以创建运用于一个接口的扩展方法,并允许在实现这个接口的所有类上调用这个扩展方法。

        ……(这一部分先跳过吧)

    [ 未完待续……]

  • 相关阅读:
    区块链技术赋能证券业 多家券商业务率先“上链”
    分布式金融的基础设施:如何驱动主流采用?
    回顾|2019年中国金融科技行业研究报告
    智能投顾行业深度报告:技术为镐,蓝海掘金
    毕马威举办2019中国领先金融科技企业50颁奖典礼
    智能投顾监管半年考:牌照合规 接受度仍待考验
    PostgreSQL串行化隔离级别(SSI)的能力与实现
    邹传伟:对人民银行DC/EP的初步分析
    央行辟谣未发行“DC/EP”和“DCEP” 法定数字货币仍在测试阶段
    php进程daemon化的正确做法
  • 原文地址:https://www.cnblogs.com/zhangchaoran/p/7568603.html
Copyright © 2011-2022 走看看