gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:54:47 28 4
gpt4 key购买 nike

假设我需要一个简单的私有(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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com