c#扩展方法中的静态类访问

时间:2014-08-12 13:39:25

标签: c# arrays static null immutability

matrix.Extension()和ExtensionMethods.Extension(matrix)之间的区别是什么?

static void Main(string[] args)
{
    decimal[,] testData = new[,] {{1m, 2m}, {3m, 4m}};
    ImmutableMatice matrix = new ImmutableMatice(testData);
    Console.WriteLine(matrix.Extension());  
    Console.WriteLine(ExtensionMethods.Extension(matrix)); // return the same like matrix.Extension() but whats the difference?
}

扩展类

static class ExtensionMethods
{
    public static string Extension(this ImmutableMatice array)
    {
       Console.WriteLine("Values of array are: ");
       for (int i = 0; i < array.Array.GetLength(0); i++)
       {
           for (int j = 0; j < array.Array.GetLength(1); j++)
           {
               Console.Write(string.Format("{0} ", array[i, j]));
           }
           Console.Write(Environment.NewLine + Environment.NewLine);
       }
    return null;
}

1 个答案:

答案 0 :(得分:4)

  

matrix.Extension()和ExtensionMethods.Extension(矩阵)之间的区别是什么?

什么都没有。编译器有效地将第一个转换为第二个。

作为C#6的一个区别,如果您专门静态导入ExtensionMethods类型,第一个将起作用而第二个不起作用。来自“C#中的即将推出的功能”文档:

  

扩展方法是静态方法,但旨在用作实例方法。   使用静态功能不是将扩展方法引入全局范围   可用作扩展方法的类型的扩展方法

(虽然目前的CTP尚未实现。)

鉴于它们是等价的,你可能会问自己为什么这种语法糖存在。有两个原因:

  • 如果它们中的一些恰好是静态的,那么将方法调用链接在一起会更加方便。例如:

    foo.Bar().Baz().Qux()
    

    比阅读更简单:

    ThirdClass.Qux(SecondClass.Baz(FirstClass.Bar(foo)))
    
  • 它允许LINQ模式跨接口和类型一致地工作,无论类型是直接将模式实现为实例成员,还是使用扩展方法。