威尼斯人线上娱乐

至于枚举和壮大方法,扩充方法

3 4月 , 2019  

新近加班加点好累a…题外话哈

原稿链接:

当大家想为八个存活的体系丰硕二个措施的时候,有三种艺术:一是直接在现有项目中添加方法;可是众多状态下现有项目都以不容许修改的,那么能够行使第二种艺术,基于现有项目创造二个子类,然后在子类中添加想要的章程。

对此部分现成的类,假若我们想添加一些新的法子来宏观职能,然则不想更改已部分包裹,也不想使用派生类,那么该怎么办吧?那里大家能够利用扩张方法。

枚举不用多说,介绍下扩大方法:扩张方法使您可见向现有项目“添加”方法,而无需成立新的派生类型、重新编写翻译或以其余措施修改原始类型。 扩张方法是一种奇特的静态方法,但足以像扩充项目上的实例方法同样举行调用。[本来是从msdn拷贝的嘞,详情请见~]

当C#
2.0中现身了静态类之后,对于位置的难点,大家也能够制造静态工具类来达成想要添加的章程。那样做可避防止成立子类,不过在利用时代码就从未那么直观了。


扩大方法需定义在静态类中,并且方法本身也应评释为静态的,第二个参数钦命该措施效果于哪个项目,并且该参数以 this 修饰符为前缀。注意,与接口或类格局具有同样名称和签名的扩张方法永远不会被调用。

介绍

实际上,下边包车型大巴点子都不是很好的消除办法。在C#
三.0中冒出了扩充方法,通过扩展方法大家能够直接在多少个现有的类型上”添加”方法。当使用扩展方法的时候,能够像调用实例方法1致的法子来调用扩大方法。

一拍即合–初识扩充

壮大方法使您能够向现有项目“添加”方法,而无需制造新的派生类型、重新编写翻译或以别的方法修改原始类型。

咱俩先是来看个例证,有个直观的认识。1个共处的类User:

威尼斯人线上娱乐,public class User
  {
      string _name;
      public User(string Name)
      {
          _name = Name;
      }
      public string Name
      {
          get { return _name; }
          set { this._至于枚举和壮大方法,扩充方法。name = value; }
      }
  }

前天大家想要扩充2个方式来呈现user新闻,又不想修改User类。使用增加方法

    
威尼斯人线上娱乐 1

恢宏方法是1种相比新鲜的行使,我们能够定义静态方法,然后在目的项目中以实例方法的语法进行调用。有了上边的概念后,当使用User实例时,会生出相应的智能感知,而且会提醒是增加方法。

   
威尼斯人线上娱乐 2

调用结果

User user = null;//实例为null
user.DisplayName();
user = new User(“小静”);//实例不为Null
user.DisplayName();
Console.Read();

威尼斯人线上娱乐 3

查看ILDASM.exe,大家来看定义扩张方法后,Extension类会添加3个ExtensionAttribute标记。

威尼斯人线上娱乐 4

举个栗子:

扩张方法是C#
三.0引入的新特征。扩张方法使你能够向现有项目“添加”方法,而无需创建新的派生类型、重新编写翻译或以别的格局修改原始类型。
扩充方法是壹种很是的静态方法,但能够像扩张项目上的实例方法1致实行调用。

扩展方法的运用

恢宏方法的成立和使用或许相对相比较简单的。

询问扩充

什么定义扩充方法?

  • 概念一个静态类,名称不限;
  • 概念静态方法,第3个参数类型为要壮大的靶子项目;为了标明是扩展方法,还要给第1个参数添加this关键字。

编写翻译过程识别顺序?

在地点的事例中,调用语句为user.DisplayName();,那么编写翻译器的反省进度:

  • 率先检查变量类型User及其基类是还是不是定义了DisplayName()实例方法,要是存在则会生成调用该格局的IL代码;
  • 假如不设有,则会继续检查静态类中是不是存在3个名称为DisplayName、第三个参数为User而且带有this关键字的静态方法,假设存在就会生成对应的IL代码。
  • 假定如故不存在,则会生出编写翻译错误。
 1     public enum EnumWeekday
 2     {
      
       None,  // 不好意思,强行植入None,记住它会有用的

 3         Monday,
 4 
 5         TuesDay,
 6 
 7         星期三,    // Unicode就是这么自信
 8 
 9         Thursday,
10 
11         Friday,
12     }
13 
14     // 第二个方法不是扩展方法,一般只将扩展方法放在一个类中
15     // 当然可以将其声明为扩展方法,但不建议
16     static class ExternFunc
17     {
18         /// <summary>
19         /// EnumWeekday枚举的扩展方法
20         /// </summary>
21         public static string ToChinese(this EnumWeekday day)
22         {
23             switch (day)
24             {
25                 case EnumWeekday.Monday:
26                     return "星期一";
27 
28                 case EnumWeekday.TuesDay:
29                     return "星期二";
30 
31                 default:
32                     return day.ToString();
33             }
34         }
35 
36         /// <summary>
37         /// 字符串转枚举
38         /// </summary>
39         public static EnumWeekday String2EnumWeekday(string day)
40         {
41             switch (day)
42             {
43                 case "星期一":
44                     return EnumWeekday.Monday;
45 
46                 default:
47                     return EnumWeekday.Friday;  // 皮一下,反正周末还不是要加班-_-
48             }
49         }
50     }

壮大方法的特点

宣称扩充方法

比较平常方法,扩充方法有它和谐的性状,上边就来看看怎么声明一(Wissu)个扩大方法:

  • 它必须在3个非嵌套、非泛型的静态类中(所以扩张方法肯定是静态方法)
  • 它起码要有一个参数
  • 首先个参数必须抬高this关键字作为前缀,且第一个参数类型也号称扩张项目(extended
    type),表示该格局对那些种类进行扩充

  • 先是个参数不可能用其余任何修饰符(比如out或ref)

  • 第3个参数的种类不能够是指针类型

依照地方的渴求,我们给int类型添加了3个恢宏方法,用来判定三个int值是否偶数:

威尼斯人线上娱乐 5😉

namespace ExtentionMethodTest
{
    public static class ExtentionMethods
    {
        public static bool IsEven(this int num)
        {
            return num % 2 == 0;
        }
    }

    class Program
    {
        static void Main(string[] args)
        { 
            int num = 10;
            //直接调用扩展方法
            Console.WriteLine("Is {0} a even number? {1}", num, num.IsEven());
            num = 11;
            //直接调用扩展方法
            Console.WriteLine("Is {0} a even number? {1}", num, num.IsEven());
            //通过静态类调用静态方法
            Console.WriteLine("Is {0} a even number? {1}", num, ExtentionMethods.IsEven(num));

            Console.Read();         
        }
    }
}

威尼斯人线上娱乐 6😉

固然这些事例万分简单,但却演示了扩展方法的选用。

正果守则–扩充规则

  • 推而广之方法必须在非泛型静态类中宣称,类名Infiniti制,例如Extension类的名字能够Infiniti制修改后,都能符合规律调用扩充方法。扩充方法至少有一个参数,且第2个参数是指标增添类型且用this关键字标识。
  • 壮大方法所在的静态类无法嵌套在别的多个类中。像下边那样定义会发生编写翻译错误。

        
威尼斯人线上娱乐 7

       
威尼斯人线上娱乐 8

  • 扩张方法能够在不一样的静态类中定义,所以分歧的静态类中大概出现同名的扩充方法,编写翻译器纠结了不晓得该怎么调用,只可以爆发编译错误。例如

         
威尼斯人线上娱乐 9

此时,大家无法再用实例方法的语法来调用了,只好用静态方西班牙语法调用。

            user = new User(“小静”);//实例不为Null
            Extension.DisplayName(user);
            Extension1.DisplayName(user);

  • 派生类也继续了增添方法, 例如大家定义派生类Student:

public class Student:User{}

它的智能感知,也饱含了User类的扩充方法。

    
威尼斯人线上娱乐 10

因此在概念增添方法时要比较在意,不能够过多采纳。基类中利用过多的扩大方法后,可能会使派生类中产生部分剩余的智能感知。

  • 本子难题。假使某1天向指标扩大类定义了同名的不2秘籍DisplayName后,调用时就会覆盖之前的扩充方法,改变原先程序的行为。所以扩大方法要慎重使用。

        
威尼斯人线上娱乐 11

       
威尼斯人线上娱乐 12

  • 扩充方法和实例方法尽管语法看上去一样,但它俩有一个第1的区分,看上边这一个调用。

User user = null;//实例为null
user.DisplayName();

实例方法调用时,对象不可能为null,会时有发生运营时不当。

扩充方法世界上是调用静态方法,所以调用它的实例对象足以为Null。

  • 扩大接口?

除了为品种扩张方法外,还是可以够为接口定义扩展方法。例如

威尼斯人线上娱乐 13

调用进程:

new[] { “AA”, “BBB”, “CCCC” }.ShowItems();
“Cathy”.ShowItems();
Console.Read();

地方已介绍,像实例方法1致调用扩充方法就欧克了–EnumWeekday friday =
EnumWeekday.Friday; Debug.WriteLine(“后天是{0}”, friday.ToChinese());

以下包蕴了扩充方法的主干特色

调用增加方法

通过上边包车型大巴事例可以看看,当调用增加方法的时候,能够像调用实例方法一致。那正是我们使用增添方法的由来之1,大家得以给二个已有品种”添加”八个主意。

既然如此扩张方法是叁个静态类的点子,大家自然也得以由此静态类来调用这几个主意。

因此IL能够看看,其实扩充方法也是编写翻译器为我们做了有的变换,将扩展方法转化成静态类的静态方法调用

威尼斯人线上娱乐 14😉

IL_001f: nop
IL_0020: ldc.i4.s 11
IL_0022: stloc.0
IL_0023: ldstr "Is {0} a even number? {1}"
IL_0028: ldloc.0
IL_0029: box [mscorlib]System.Int32
IL_002e: ldloc.0
//直接调用扩展方法
IL_002f: call bool ExtentionMethodTest.ExtentionMethods::IsEven(int32)
IL_0034: box [mscorlib]System.Boolean
IL_0039: call void [mscorlib]System.Console::WriteLine(string, object, object)
IL_003e: nop
IL_003f: ldstr "Is {0} a even number? {1}"
IL_0044: ldloc.0
IL_0045: box [mscorlib]System.Int32
IL_004a: ldloc.0
//通过静态类调用静态方法
IL_004b: call bool ExtentionMethodTest.ExtentionMethods::IsEven(int32)
IL_0050: box [mscorlib]System.Boolean
IL_0055: call void [mscorlib]System.Console::WriteLine(string, object, object)
IL_005a: nop
IL_005b: call int32 [mscorlib]System.Console::Read()
IL_0060: pop
IL_0061: ret

威尼斯人线上娱乐 15😉

有了扩充方法,当调用扩充方法的时候,我们就像是调用三个实例方法。可是,大家应有从四个角度看那些难题:

  • 由此扩充方法,能够使部分方法的调用变得进一步通俗易懂,与实例的关系看起来更和谐。就比如,”num.Is伊芙n()”那种写法。

    • 基于那个缘故,能够思量把代码中静态工具类中的一些主意成为增加方法
  • 当然正是由于扩张方法的调用跟实例方法一致,所以想要壹眼就来看三个主意是否扩展方法不那么不难

    • 事实上在VS中依旧很好辨认的,对于地点的例证,在VS中放上鼠标,就足以看来”(extention)
      bool int.Is伊夫n()”
威尼斯人线上娱乐 16
  1. 扩张方法是静态方法。
  2. 扩展方法的类是静态类。
  3. .NET中,此办法的参数中必供给有被扩展类作为第2个参数,此参数前面用this关键字修饰。此方法在客户端作为3个钦点项目标实例调用。
  4. 恢宏方法在VS智能提示中显得。当在品种实例后键入“.”会提示增添方法。
  5. 扩充方法必须在相同命名空间应用,你必要利用using证明导入该类的命名空间。
  6. 针对包括扩充方法的扩大类,你能够定义任何名称。类必须是静态的。
  7. 借使你想针对贰个类别丰硕新的艺术,你不要求有该类型的源码,就能够利用和执行该项指标扩充方法。
  8. 万一扩充方法与该品种中定义的点子具有相同的签订契约,则扩张方法永远不会被调用。

扩张方法是何许被发觉的

知情怎么调用扩充方法是大家前边部分介绍的,可是知道什么不调用扩充方法同样必不可缺。下边就看看编写翻译器怎么样决定要采用的恢弘方法。

编写翻译器处理扩张方法的长河:当编写翻译器看到3个表达式好像是调用四个实例方法的时候,编译器就会寻找全体的实例方法,借使未有找到三个男才女貌的实例方法,编译器就会去搜寻二个适合的恢弘方法;编写翻译器会检查导入的全体命名空间和方今定名空间中的全部扩大方法,并合作变量类型到增加类型存在二个隐式转换的增加方法。

当编写翻译器查找扩大方法的时候,它会检讨System.Runtime.CompilerServices.ExtensionAttribute属性来判定一个格局是不是是扩张方法

威尼斯人线上娱乐 17

看看了编写翻译器怎么处理扩充方法了,那么就须要领悟一下运用扩大方法时要留意的地点了。

扩大方法应用的注意点:

  • 实例方法的先行级高于扩展方法,当有增添方法跟实例方法签名1致的时候,编写翻译器不会给出任何警告,而是默许调用实例方法

  • 借使存在多少个适用的壮大方法,它们能够应用于不一致的扩大项目(使用隐式转换),那么通过在重载的艺术中接纳的”更好的更换”规则,编写翻译器会挑选最合适的一个

  • 在扩大方法的调用中,还有一个条条框框,编写翻译器会调用近来的namespace下的扩展方法

上面看2个事例,通过这些事例来更好的精晓编写翻译器处理扩张方法时的1些注意点:

威尼斯人线上娱乐 18😉

namespace ExtentionMethodTest
{
    using AnotherNameSpace;
    public static class ExtentionMethods
    {
        public static void printInfo(this Student stu)
        {
            Console.WriteLine("printInfo(Student) from ExtentionMethodTest");
            Console.WriteLine("{0} is {1} years old", stu.Name, stu.Age);
        }

        public static void printInfo(this object stu)
        {
            Console.WriteLine("printInfo(object) from ExtentionMethodTest");
            Console.WriteLine("{0} is {1} years old", ((Student)stu).Name, ((Student)stu).Age);
        }
    }

    public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }

        //实例方法
        //public void printInfo()
        //{
        //    Console.WriteLine("{0} is {1} years old", this.Name, this.Age);
        //}
    }

    class Program
    {
        static void Main(string[] args)
        {
            Student wilber = new Student { Name = "Wilber", Age = 28 };
            //当实例方法printInfo存在的时候,所有的扩展方法都不可见
            //此时调用的是实例方法
            //wilber.printInfo();

            //当注释掉实例方法后,下面代码会调用最近的命名空间的printInfo方法
            //同时下面语句会选择“更好的转换”规则的扩展方法
            //printInfo(Student) from ExtentionMethodTest
            //Wilber is 28 years old
            wilber.printInfo();

            //当把wilber转换成object类型后,会调用printInfo(this object stu)
            //printInfo(object) from ExtentionMethodTest
            //Wilber is 28 years old
            object will = wilber;
            will.printInfo();

            Console.Read();
        }
    }
}

namespace AnotherNameSpace
{
    using ExtentionMethodTest;
    public static class ExtentionClass
    {
        public static void printInfo(this Student stu)
        {
            Console.WriteLine("printInfo(Student) from AnotherNameSpace");
            Console.WriteLine("{0} is {1} years old", stu.Name, stu.Age);
        }
    }
}

威尼斯人线上娱乐 19😉

后果才是发端

这篇对扩张方法的介绍到那边算是happy
ending了呢。其实聊到那几个话题,鹤冲天
兄台的研商就深深多了。作者就当是一得之见了,咱们有趣味的话学习他的触目皆是c#
扩充方法奇思妙用

扩大方法好资料: 

  • MSDN: 推而广之方法(C# 编制程序指南)
  • 博客园: 鹤冲天 c#
    增添方法奇思妙用

以身作则代码

空引用上调用扩张方法

当大家在空引用上调用实例方法是会引发NullReferenceException至极的。

可是,大家得以在空引用上调用扩张方法。

看上边包车型地铁事例,大家得以看清3个指标是还是不是空引用。

威尼斯人线上娱乐 20😉

namespace ExtentionMethodTest
{
    public static class NullUitl
    {
        public static bool IsNull(this object o)
        {
            return o == null;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            object x = null;
            Console.WriteLine(x.IsNull());
            x = new object();
            Console.WriteLine(x.IsNull());

            Console.Read();
        }
    }
}

威尼斯人线上娱乐 21😉

通过地点的例子能够看看,即使引用为空,”x.IsNull()”如故能够健康履行。

据悉大家如今介绍的恢弘方法的行事规律,其实上边的调用会被编写翻译器转换为静态方法的调用”NullUitl.IsNull(x)”(能够查看IL代码验证),那也就表明了怎么空引用上可以调用扩张方法。

我们针对string类型创制3个恢宏方法。该扩大方法必须钦点String作为三个参数,在string的实例后键入“.”间接调用该扩大方法。

总结

正文介绍了扩充方法的施用以及工作规律,其实扩充方法的真面目就是经过静态类调用静态方法,只可是是编写翻译器帮我们完结了这么些转换。

接下来还介绍了编写翻译器是什么察觉扩大方法的,以及利用扩充方法时要注意的地方。领悟了编译器怎么查找扩张方法,对编写和调节和测试扩展方法都以有匡助的。

 

出处:

==============================================================================================

     
前言:上篇 系列化功效比拼——什么人是最后的赢家Newtonsoft.Json 介绍了下系列化方面的文化。看过Demo的意中人或许注意到了在那之中就用到过泛型的扩张方法,本篇打算总括下C#扩展方法的用法。博主打算分四个层面来介绍那些知识点,分别是:.Net内置对象的扩展方法、一般对象的扩张方法、泛型对象的壮大方法。

   
 什么是扩大方法?回答那个标题从前,先看看大家壹般景观下方法的调用。类似那样的通用方法您肯定写过:

威尼斯人线上娱乐 22😉

        static void Main(string[] args)
        {

            string strRes = "2013-09-08 14:12:10";
            var dRes = GetDateTime(strRes);
        }


        //将字符串转换为日期
        public static DateTime GetDateTime(string strDate)
        {
            return Convert.ToDateTime(strDate);
        }

        //得到非空的字符串
        public static string GetNotNullStr(string strRes)
        {
            if (strRes == null)
                return string.Empty;
            else
                return strRes;
        }

威尼斯人线上娱乐 23😉

或然在类型中有一个接近Utils的工具类,里面有多少个Helper,例如StringHelper、XmlHelper等等,每种Helper里面有四个static的通用方法,然后调用的时候固然StringHelper.GetNotNullStr(“aa”);那样。还有一种普通的用法正是new
三个对象,通过对象去调用类里面包车型地铁非static方法。反正博主刚初步做项指标时候正是那样写的。后来乘机工作经验的积淀,博主看到了扩展方法的写法,立马就觉得温馨原先的写法太Low了。进入正题。

 

一、.Net内置对象的恢弘方法

.Net内部也有为数不少概念的扩大方法,例如大家Linq常用的Where(x=>x==true)、Select()等等。当您转到定义的时候你很简单看出来:public
static IEnumerable<TSource> Where<TSource>(this
IEnumerable<TSource> source, Func<TSource, bool>
predicate)。当然我们也得以给.Net对象新增扩充方法,比如大家要给string对象加多个扩展方法(注意那些形式不可能和调用的Main方法放在同1个类中):

威尼斯人线上娱乐 24😉

        public static string GetNotNullStr(this string strRes)
        {
            if (strRes == null)
                return string.Empty;
            else
                return strRes ;
        }

威尼斯人线上娱乐 25😉

然后在Main方法里面调用:

        static void Main(string[] args)
        {
            string strTest = null;
            var strRes = strTest.GetNotNullStr();
        }

简易介绍:public static string GetNotNullStr(this string strRes)个中this
string就意味着给string对象添加扩充方法。那么在同多少个命名空间上面定义的富有的string类型的变量都能够.GetNotNullStr()这样直接调用。strTest.GetNotNullStr();为啥这么调用不用传参数,是因为strTest正是当做参数字传送入到点子里面包车型客车。你能够试行。使用起来就和.Net
framework定义的方法1致:

威尼斯人线上娱乐 26

 

   
 当然除了string,你能够给.Net内置的任何对象加扩充方法,例如给DataGridViewRow的扩展方法:

威尼斯人线上娱乐 27威尼斯人线上娱乐 28

//DataGridViewRow的扩展方法,将当前选中行转换为对应的对象
        public static T ToObject<T>(this DataGridViewRow item) where T:class
        {
            var model = item.DataBoundItem as T;
            if (model != null)
                return model;
            var dr = item.DataBoundItem as System.Data.DataRowView;
            model = (T)typeof(T).GetConstructor(new System.Type[] { }).Invoke(new object[] { });//反射得到泛型类的实体
            PropertyInfo[] pro = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public);
            Type type = model.GetType();
            foreach (PropertyInfo propertyInfo in pro)
            {
                if (Convert.IsDBNull(dr[propertyInfo.Name]))
                {
                    continue;
                }
                if (!string.IsNullOrEmpty(Convert.ToString(dr[propertyInfo.Name])))
                {
                    var propertytype = propertyInfo.PropertyType;
                }
            }
            return model;
        }

View Code

如此那般看上去就好像在扩张.Net Framework。有未有觉得有个别高大上~

 

2、1般对象的扩展方法

   
 和Framework内置对象1样,自定义的靶子也足以扩大增添方法。直接上演示代码:

    public class Person
    {
        public string Name { set; get; }
        public int Age { set; get; }
    }

威尼斯人线上娱乐 29😉

        //Person的扩展方法,根据年龄判断是否是成年人
        public static bool GetBIsChild(this Person oPerson)
        {
            if (oPerson.Age >= 18)
                return false;
            else
                return true;
        }

威尼斯人线上娱乐 30😉

Main方法里面调用:

var oPerson1 = new Person();
oPerson1.Age = 20;
var bIsChild = oPerson1.GetBIsChild();        

和string扩充方法类似,就不多做解释了。

 

三、泛型对象的扩张方法

     
除了下边二种之外,博主发现实际能够定义一个泛型的扩大方法。那么,是否装有的连串都可以一贯行使这么些扩大方法了吧?为了有限支撑程序的审慎,上面包车型客车主意恐怕未有实际意义,当开发中央博物院主觉得说不定期存款在那种景观:

威尼斯人线上娱乐 31😉

public static class DataContractExtensions
{
  //测试方法
  public static T Test<T>(this T instance) where T : Test2
  {
       T Res = default(T);
       try
       {
           Res.AttrTest = instance.AttrTest.Substring(0,2);
           //其他复杂逻辑...


      }
      catch
      { }
      return Res;
  }

}

public class Test2
{
  public string AttrTest { set; get; }
}

威尼斯人线上娱乐 32😉

 

行使扩展方法有多少个值得注意的地方:

(一)扩充方法不可能和调用的办法放到同二个类中

(二)第三个参数必需要,并且必须是this,这是扩大方法的标识。即使格局里面还要传入其余参数,能够在背后扩大参数

(三)扩张方法所在的类必须是静态类

(四)最佳确认保障扩大方法和调用方法在同3个命名空间下

 

     
只怕你首先次使用那一个会觉得很别扭。你大概会说扩展方法和自家从前用的static方法无论从代码达成依然算法效能都大概嘛,是的!确实差不离,但利用多了后来会发现它的确能帮你节省很多代码。

 

出处:

===========================================================================================

除此以外参考微软的求证文书档案:

扩展方法(C#
编制程序指南)

怎么样:落成和调用自定义扩大方法(C#
编制程序指南)

如何:为枚举创立新章程(C#
编制程序指南)

 威尼斯人线上娱乐 33

在地点的 WordCount()方法里,大家传递了2个string类型参数,通过string类型的变量调用,换言之通过string实例调用。

今昔大家创立了三个静态类和八个静态方法。3个用来计量string中词的个数。另3个办法总括string中去除空格的全数字符数。

威尼斯人线上娱乐 34威尼斯人线上娱乐 35

 1 using System;
 2 namespace ExtensionMethodsExample
 3 {
 4    public static class Extension
 5     {
 6        public static int WordCount(this string str)
 7        {
 8            string[] userString = str.Split(new char[] { ' ', '.', '?' },
 9                                        StringSplitOptions.RemoveEmptyEntries);
10            int wordCount = userString.Length;
11            return wordCount;
12        } 
13        public static int TotalCharWithoutSpace(this string str)
14        {
15            int totalCharWithoutSpace = 0;
16            string[] userString = str.Split(' ');
17            foreach (string stringValue in userString)
18            {
19                totalCharWithoutSpace += stringValue.Length;
20            }
21            return totalCharWithoutSpace;
22        }
23 }
24 }

View Code

后天我们创立一个可实施的次第,输入3个string,使用扩充方法来估测计算有所词数以及string中的全数字符数,结果显示到控制台。

威尼斯人线上娱乐 36威尼斯人线上娱乐 37

 1 using System;
 2 namespace ExtensionMethodsExample
 3 {
 4     class Program
 5     {
 6         static void Main(string[] args)
 7         {
 8             string userSentance = string.Empty;
 9             int totalWords = 0;
10             int totalCharWithoutSpace = 0;
11             Console.WriteLine("Enter the your sentance");
12             userSentance = Console.ReadLine();
13             //calling Extension Method WordCount
14             totalWords = userSentance.WordCount();
15             Console.WriteLine("Total number of words is :"+ totalWords);
16             //calling Extension Method to count character
17             totalCharWithoutSpace = userSentance.TotalCharWithoutSpace();
18             Console.WriteLine("Total number of character is :"+totalCharWithoutSpace);
19             Console.ReadKey();
20         }
21     }
22 } 

View Code

 


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图