C#原始类型扩展方法—this参数修饰符

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

  

扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。仅当您使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。

  下面的示例演示为 System.String 类定义的一个扩展方法。请注意,它是在非嵌套、非泛型静态类内部定义的:
     namespace ExtensionMethods
     {
         public static class MyExtensions
         {
             public static int WordCount(this String str)
             {
                 return str.Split(new char[] { ‘ ‘, ‘.‘, ‘?‘ }, StringSplitOptions.RemoveEmptyEntries).Length;
             }
         }   
     }

  可使用以下 using 指令将 WordCount 扩展方法放入范围中:
  using ExtensionMethods;
  而且,可以在应用程序中使用以下语法对该扩展方法进行调用:
  string s = "Hello Extension Methods";
  int i = s.WordCount();

  在代码中,可以使用实例方法语法调用该扩展方法。但是,编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。因此,并未真正违反封装原则。实际上,扩展方法无法访问它们所扩展的类型中的私有变量。

定义和调用扩展方法:
 1、定义一个静态类以包含扩展方法。该类必须对客户端代码可见。有关可访问性规则的更多信息,请参见访问修饰符(C# 编程指南)。
 2、将该扩展方法实现为静态方法,并使其至少具有与包含类相同的可见性。
 3、该方法的第一个参数指定方法所操作的类型;该参数必须以 this 修饰符开头。
 4、在调用代码中,添加一条 using 指令以指定包含扩展方法类的命名空间。
 5、按照与调用类型上的实例方法一样的方式调用扩展方法。
  请注意,第一个参数不是由调用代码指定的,因为它表示正应用运算符的类型,并且编译器已经知道对象的类型。您只需通过 n 为这两个形参提供实参。

示例
  下面的示例在 MyExtensions.StringExtension 类中实现了一个名为 WordCount 的扩展方法。该方法对 String 类进行操作,而该类被指定为第一个方法参数。MyExtensions 命名空间被导入到应用程序命名空间中,并且该方法是在 Main 方法内调用的。

using System.Linq;
using System.Text;
using System;

namespace CustomExtensions
{
//Extension methods must be defined in a static class
public static class StringExtension
{
   // This is the extension method.
   // The first parameter takes the "this" modifier
   // and specifies the type for which the method is defined.
   public static int WordCount(this String str)
   {
    return str.Split(new char[] {‘ ‘, ‘.‘,‘?‘}, StringSplitOptions.RemoveEmptyEntries).Length;
   }
}
}
namespace Extension_Methods_Simple
{
//Import the extension method namespace.
using CustomExtensions;
class Program
{
   static void Main(string[] args)
   {
    string s = "The quick brown fox jumped over the lazy dog.";
    // Call the method as if it were an 
    // instance method on the type. Note that the first
    // parameter is not specified by the calling code.
    int i = s.WordCount();
    System.Console.WriteLine("Word count of s is {0}", i);
   }
}
}

时间: 2024-07-31 11:05:49

C#原始类型扩展方法—this参数修饰符的相关文章

C#中方法的参数修饰符

做项目久了,有的时候真的需要静下心来认真的总结一下自己所用到的技术,而不是每天依葫芦画瓢,每天忙忙碌碌,到头来不知道自己忙了个啥,学了什么,自己到底掌握了多少知识.所以我想回顾一下C#的基础知识,把重要的知识总结成点记录下来,方便以后快速阅读. 方法的参数及参数修饰符: 1.(无).如果一个参数没有用参数修饰符标记,则认为它将按值进行传递,这将意味着被调用的方法收到原始数据的一份副本. 2. out:输出参数由被调用的方法赋值,因此按引用传递,如果被调用的方法没有给输出参数赋值,就会出现编译错误

C# this用法系列(二) 通过this修饰符为原始类型扩展方法

定义一个静态类,类中定义静态方法,方法中参数类型前边加上this修饰符,即可实现对参数类型的方法扩展 示例如namespace Demo{ // 这里的类必须为静态类 public static class Json { // 方法为静态方法 // this修饰符后边是string类型,即为string类型扩展出了ToJson方法 public static object ToJson(this string Json) { return Json == null ? null : JsonCo

java接口中成员变量和方法的默认修饰符(转)

Java的interface中,成员变量的默认修饰符为:public static final 所以我们在interface中定义成员变量的时候,可以 1:public static final String name = "张三"; 2:String name = "张三"; 以上两种都可以,老司机一般都是第二种.既然是静态最终的变量,也就意味着在外面访问的时候不能修改这个成员变量的值.所以在接口中定义成员变量的,一般都是常量.不会修改的.如果要进行修改的话,定义

面向对象:封装(一):构造函数;类的主方法;权限修饰符;对象的创建

对象:一切皆为对象. 对象包括两部分内容:属性(名词形容词),行为(动词). 对象和对象之间是有关系的. 派生(子类与父类的关系),关联,依赖. 类:对同一类别的众多对象的一种抽象. 类,还是用来生成对象的一种模板,对象是类的一种具体化的表现. 面向对象的三大特性:封装,继承,多态. 一:类的定义: class 类名{ 访问修饰符 成员变量的定义; 访问修饰符 成员函数(方法)的定义; } 例1: public class Student{ public String name; public

C#类、方法的访问修饰符

这篇文章主要介绍了C#类的访问修饰符用法,较为详细的分析了C#类的访问修饰符概念与用法,具有一定的参考借鉴价值,需要的朋友可以参考下 本文详细分析了C#类的访问修饰符用法,分享给大家供大家参考.具体用法分析如下: 默认情况下,类声明为内部的,即只有当前工程中的代码才能访问它.可以用internal访问修饰符关键字显式指定,但这不是必须的,类在定义时默认为此类型的类.但是C# 方法默认访问级别: private. 方法或者属性的修饰符的访问级别如下图: 访问修饰符 意 义 public 访问不受限

新年在家学java之基础篇-参数&修饰符&构造器

可变参数 不知道可能给方法传递多少个参数时使用这个方法 public void printInfo (String[] args) --可以定义一个数组,在调用这个方法适合赋值给一个数组 public void aaa (String... args) --用java特有的...来传递可变个数的参数,在使用时,与数组的使用方式相同 如果使用数组,在调用方法是要用 a.printInfo(null):没有参数就要定义一个空数组或者null,而第二种是可以直接使用a.aaa(); 如果一个方法有多个

使用对象类型 作为方法的参数和返回值

原文地址:https://www.cnblogs.com/wulinmiao/p/12081502.html

out 和 ref 参数修饰符

整理自MSDN out: out 关键字通过引用传递参数.这与 ref 关键字相似,只不过 ref 要求在传递之前初始化变量.若要使用 out 参数,方法定义和调用方法均必须显式使用 out 关键字.例如: class OutExample { static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 } } 尽管作为 out 参数

C#中Out和Ref参数修饰符

在编程过程中对于函数之间的参数的传递一般分为两种:传值和传地址.下面为大家分析一下. 传值 比如你又一份文档,如果采用传值的话,相当于我复制了一份,因此我对我这份文档的修改都不会影响到你的那份.如果你对这句话了解的话,那么就简单了. 下面看一个小Demo. <span style="font-family:SimSun;font-size:18px;"> static void Main(string[] args) { //定义一个变量 int val=1 ; //调用方