Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
库中静态类的扩展放在哪里?(用C#表示)_C#_.net - Fatal编程技术网

库中静态类的扩展放在哪里?(用C#表示)

库中静态类的扩展放在哪里?(用C#表示),c#,.net,C#,.net,虽然我的问题是关于C#的,但我会给出一个具体的例子 我已经编写了一个函数ensureredirectorypresent,它是.NET的BCL库中System.IO.Directory类的扩展。我在哪里可以最好地放置此新功能 从概念上讲,该方法是目录类的扩展方法。遗憾的是,它是一个静态类,因此我无法使用该功能。扩展方法仅扩展实例方法。不能扩展类的静态方法。原因是当程序集加载到内存中时,静态方法在类型本身上,所以实际上您无法扩展它们 此外,扩展方法更像是编译器/IDE/语言特性,而不是框架 更新

虽然我的问题是关于C#的,但我会给出一个具体的例子

我已经编写了一个函数
ensureredirectorypresent
,它是.NET的BCL库中System.IO.Directory类的扩展。我在哪里可以最好地放置此新功能


从概念上讲,该方法是目录类的扩展方法。遗憾的是,它是一个静态类,因此我无法使用该功能。

扩展方法仅扩展实例方法。不能扩展类的静态方法。原因是当程序集加载到内存中时,静态方法在类型本身上,所以实际上您无法扩展它们

此外,扩展方法更像是编译器/IDE/语言特性,而不是框架

更新

我在这里得到了一个否定的答案——我相信这是毫无根据的——但这里有一个澄清:


扩展方法是通过使用静态方法实现的,但是您可以从对象而不是从类型访问它们。因此,第一个参数始终是“this”。

扩展方法仅扩展实例方法。不能扩展类的静态方法。原因是当程序集加载到内存中时,静态方法在类型本身上,所以实际上您无法扩展它们

此外,扩展方法更像是编译器/IDE/语言特性,而不是框架

更新

我在这里得到了一个否定的答案——我相信这是毫无根据的——但这里有一个澄清:

扩展方法是通过使用静态方法实现的,但是您可以从对象而不是从类型访问它们。因此,第一个参数始终是“this”。

(第二版)表示将类放入子命名空间中(例如“…扩展”)。这是为了允许程序员控制使用,没有using指令将阻止可能不需要的扩展:

不要将扩展方法与扩展类型放在同一命名空间中,除非它用于向接口添加方法或用于依赖关系管理。当然,在后一种情况下,类型将位于不同的程序集中

但是,该框架在某些地方违反了本指南的精神(例如,如果您使用
XPathDocument
等,然后开始使用XML-to-LINQ,则类将在范围内)。

(第二版)说,将类放入子命名空间中(例如“…扩展”)。这是为了允许程序员控制使用,没有using指令将阻止可能不需要的扩展:

不要将扩展方法与扩展类型放在同一命名空间中,除非它用于向接口添加方法或用于依赖关系管理。当然,在后一种情况下,类型将位于不同的程序集中


但是,该框架在某些地方违反了本指南的精神(例如,如果您使用
XPathDocument
等,然后开始使用XML到LINQ,则类将在范围内)。

您不能扩展
System.IO.Directory
,因为它是一个静态类。但是您可以扩展
System.IO.DirectoryInfo
——这是
System.IO.Directory
的非静态对应项

然后您就可以这样使用它:

(new DirectoryInfo(@"C:\Foo\Bar\Baz").EnsureDirectoryPresent();

您不能扩展
System.IO.Directory
,因为它是一个静态类。但是您可以扩展
System.IO.DirectoryInfo
——这是
System.IO.Directory
的非静态对应项

然后您就可以这样使用它:

(new DirectoryInfo(@"C:\Foo\Bar\Baz").EnsureDirectoryPresent();

您已经了解到不能使用扩展方法将静态方法附加到
目录
类。在我看来,下一个最好的方法是为目录相关函数创建一个新的静态类。通常使用
Utils
后缀。我认为这是你能做的最简单的事情

static class DirectoryUtils
{
    public static void EnsureDirectoryPresent(string dir) { }
}

DirectoryUtils.EnsureDirectoryPresent(someDirectory);

在语法方面唯一的区别(与
目录
中同名的静态方法相反)是文本“Utils”。然而,“可发现性”与使用扩展方法不同-您必须了解
目录utils
类。

您已经了解到,您不能使用扩展方法将静态方法附加到
目录
类。在我看来,下一个最好的方法是为目录相关函数创建一个新的静态类。通常使用
Utils
后缀。我认为这是你能做的最简单的事情

static class DirectoryUtils
{
    public static void EnsureDirectoryPresent(string dir) { }
}

DirectoryUtils.EnsureDirectoryPresent(someDirectory);

在语法方面唯一的区别(与
目录
中同名的静态方法相反)是文本“Utils”。但是,“可发现性”与使用扩展方法不同-您必须了解
DirectoryUtils
类。

我认为这是错误的。只能扩展静态方法,不能扩展实例方法。是的,您可以通过使用静态方法来实现它们,但是您可以从对象而不是从类型访问它们。当您将“方法”一词替换为“类”时,他的答案更有意义。您不能在
字典
上放置扩展方法,因为该类型是静态的。我认为这是错误的。只能扩展静态方法,不能扩展实例方法。是的,您可以通过使用静态方法来实现它们,但是您可以从对象而不是从类型访问它们。当您将“方法”一词替换为“类”时,他的答案更有意义。不能在
字典
上放置扩展方法,因为该类型是静态的。+1用于引用FDG。请注意,由于
目录
类是静态的,因此(目前)不可能为其创建扩展方法(用于C#)。一个项目()采用的方法是将Info类的扩展方法与路径字符串的非扩展静态帮助器组合到一个类中。(如果不清楚,请告诉我。)+1引用FDG。请注意,因为
目录
类是静态的,所以它(当前)是im