【问题标题】:c# static class access in extension methodsc#扩展方法中的静态类访问
【发布时间】:2014-08-12 13:39:25
【问题描述】:

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;
}

【问题讨论】:

  • 完全没有区别 :) 同样的方法,同样的功能,同样的结果:P
  • 令人惊讶的是,这不是重复的。 Stack Overflow 上没有任何问题可以解释这个问题。

标签: c# arrays static null immutability


【解决方案1】:

matrix.Extension() 和 ExtensionMethods.Extension(matrix) 有什么区别?

什么都没有。编译器有效地将第一个翻译成第二个。

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

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

(这在当前的 CTP 中尚未实现。)

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

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

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

    比阅读更简单:

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

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2011-01-01
    • 2012-01-29
    • 2015-02-18
    • 2018-07-24
    相关资源
    最近更新 更多