c# - 可以有私有(private)扩展方法吗?

标签 c# extension-methods encapsulation

假设我需要一个简单的私有(private)帮助器方法,并且直观地在代码中将其作为扩展方法是有意义的。有什么方法可以将该帮助程序封装到唯一实际需要使用它的类中吗?

例如,我试试这个:

class Program
{
    static void Main(string[] args)
    {
        var value = 0;
        value = value.GetNext(); // Compiler error
    }

    static int GetNext(this int i)
    {
        return i + 1;
    }
}

编译器不会“看到”GetNext() 扩展方法。错误是:

Extension method must be defined in a non-generic static class

很公平,所以我将它包装在自己的类中,但仍然封装在它所属的对象中:

class Program
{
    static void Main(string[] args)
    {
        var value = 0;
        value = value.GetNext(); // Compiler error
    }

    static class Extensions
    {
        static int GetNext(this int i)
        {
            return i + 1;
        }
    }
}

仍然没有骰子。现在错误状态:

Extension method must be defined in a top-level static class; Extensions is a nested class.

此要求是否有令人信服的理由?在某些情况下,确实应该对辅助方法进行私有(private)封装,并且在某些情况下,如果辅助方法是扩展方法,则代码会更加清晰且可读性/支持性更高。对于这两者相交的情况,两者都可以满足还是我们必须选择一个而不是另一个?

最佳答案

Is there a compelling reason for this requirement?

这个问题问错了。我们在设计这个功能时,语言设计团队提出的问题是:

Is there a compelling reason to allow extension methods to be declared in nested static types?

由于扩展方法旨在使 LINQ 正常工作,而 LINQ 不存在扩展方法对类型私有(private)的情况,因此答案是“不,没有这样令人信服的理由”。

通过消除将扩展方法放入静态嵌套类型的能力,无需考虑、争论、设计、指定、实现、测试、记录、运送到静态嵌套类型中搜索扩展方法的任何规则客户,或者与 C# 的每个 future 功能兼容。这是一项显着的成本节约。

关于c# - 可以有私有(private)扩展方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16739903/

相关文章:

java - Java封装

c++ - C++封装基础知识

封装和抽象 OOP 概念

c# - 如何在c#中动态添加文本到span控件

c# - 禁用特定页面的 ValidateRequest

c# - OdbcConnection.GetSchema ("TABLES");不工作

php - php 函数 dl() 的任何替代方法

c# - 请向我解释扩展方法

c# - 将 JavaScript 正则表达式转换为 C#

C# - 反序列化列表<String>