zoukankan      html  css  js  c++  java
  • 小例子学习C#扩展方法

    扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。为了更好的理解,我写了一个小程序,希望对初学的朋友有所帮助。

    首先我建立了一个控制台用用程序,然后建立了一个名为MyClassLibrary的类库,类库里就写了一个Book类。如下图所示

    image

    在Book类中,我定义了Id,Title,Price,Publisher四个属性,分别表示书的编号,名称,价格和出版社。同时,还写了一个GetBookInfo方法,用于获取书的信息。

    Book类的代码如下

    namespace MyClassLibrary
    {
        public class Book
        {
            /// <summary>
            /// 编号
            /// </summary>
            public string Id { get; set; }
    
            /// <summary>
            /// 书名
            /// </summary>
            public string Title { get; set; }
    
            /// <summary>
            /// 价格
            /// </summary>
            public decimal Price { get; set; }
    
            /// <summary>
            /// 出版社
            /// </summary>
            public string Publisher { get; set; }
    
    
            public Book()
                : this(string.Empty, string.Empty, decimal.Zero, string.Empty)
            {
            }
    
            public Book(string id, string title)
                : this(id, title, decimal.Zero, string.Empty)
            {
            }
    
            public Book(string id, string title, decimal price, string publisher)
            {
                this.Id = id;
                this.Title = title;
                this.Price = price;
                this.Publisher = publisher;
            }
    
            /// <summary>
            /// 获取书籍信息
            /// </summary>
            public string GetBookInfo()
            {
                return string.Format("编号:{0} 书名:{1} 价格:{2} 出版社:{3}", Id, Title, Price, Publisher);
            }
        }
    }

    下面我们在测试程序中实例化一个Book类的对象,在Book类中我们已经定义了一个方法GetBookInfo,通过调用这个方法就可以取得书的信息。但是,正好有一天书店要搞活动,这本书要打五折,我们就要修改书的价格,但是在给定的Book类中并没有提供修改书价格的方法,怎么办呢?对,扩展方法就是一个解决的办法。

    我们为Book类写一个修改书价格的扩展方法ModifyPrice。代码如下:

        public static class BookExtension
        {
            /// <summary>
            /// 修改书的价格
            /// </summary>
            /// <param name="book">book对象</param>
            /// <param name="price">价格</param>
            public static void ModifyPrice(this Book book, decimal price)
            {
                book.Price = price;
            }
        }

    测试程序代码为:

     class Program
        {
            static void Main(string[] args)
            {
                //Book book = new Book("20110711", "红楼梦", 79.00m, "北京出版社");
                Book book = new Book { Id = "20110711", Title = "红楼梦", Price = 79.00m, Publisher = "北京出版社" };
                Console.WriteLine("书籍信息:");
                Console.WriteLine(book.GetBookInfo());
                Console.WriteLine("今天搞活动,本书打五折");
                book.ModifyPrice(book.Price * 0.5m);
                Console.WriteLine(book.GetBookInfo());
            }
        }

    程序运行结果如下图所示

    image

    这个例子并没有什么意义,简单理解,扩展方法就是向已有的类型中添加新的方法。

  • 相关阅读:
    React Native之bugly的使用
    前端面试复习记录(2020-03-21)
    React Native之手写签名
    RN0.56+设置allowFontScaling
    React Native从0.39.x升级到0.49.x的那些事
    React Native组件系列之NetInfo
    React Native组件系列之ImageBackground
    使用Azure SQL Data Sync在Azure 上实现蓝绿部署
    新版Azure Automation Account 浅析(三) --- 用Runbook管理AAD Application Key
    新版Azure Automation Account 浅析(二) --- 更新Powershell模块和创建Runbook
  • 原文地址:https://www.cnblogs.com/nianming/p/2102990.html
Copyright © 2011-2022 走看看