如何在 C# 中使用部分方法来扩展现有实现
How to use partial method in C# to extend existing implemetation
如果这能行得通就好了。我是否试图以错误的方式实现我的想法?
我想使用部分方法,以便能够扩展现有代码,并简单地插入 in/out 方法的实现。
基本上正是 reference 所说的:
Partial methods enable class designers to provide method hooks,
similar to event handlers, that developers may decide to implement or
not. If the developer does not supply an implementation, the compiler
removes the signature at compile time.
我第一次尝试使用它如下:
DefinitionsBase.cs:
namespace ABC {
public partial class Definitions {
// No implementation
static partial void TestImplementaion();
}
}
DefinitionsExt.cs:
namespace ABC {
public partial class Definitions {
static partial void TestImplementaion(){
// Implementation is here
}
}
}
Program.cs:
namespace ABC {
class Program {
static void Main(string[] args) {
Definitions.TestImplementaion();
}
}
}
它是相同的命名空间,但作为参考状态部分方法隐式私有。它不接受访问修饰符,我无法从我的 class 调用它。有没有办法像我打算的那样使用它?
谢谢!
您可以使用调用私有方法的 public 方法,但我不确定这是否是您想要的。这只会使您的代码正常工作。
部分方法根据定义是私有的,因此在编译期间,如果该方法未被实现,编译器不需要遍历所有代码,找到对该方法的所有可能引用并将它们删除。
这是一种设计选择,因为不一定需要实现部分方法,编译器只查看部分 class 实现,而不查看所有代码。
如果您实现了调用分部方法的 public 方法,而分部方法未被实现,编译器仍将仅查看分部 class 文件和代码,即使您可以访问该分部方法从代码中的任何位置。
如果这能行得通就好了。我是否试图以错误的方式实现我的想法?
我想使用部分方法,以便能够扩展现有代码,并简单地插入 in/out 方法的实现。
基本上正是 reference 所说的:
Partial methods enable class designers to provide method hooks, similar to event handlers, that developers may decide to implement or not. If the developer does not supply an implementation, the compiler removes the signature at compile time.
我第一次尝试使用它如下:
DefinitionsBase.cs:
namespace ABC {
public partial class Definitions {
// No implementation
static partial void TestImplementaion();
}
}
DefinitionsExt.cs:
namespace ABC {
public partial class Definitions {
static partial void TestImplementaion(){
// Implementation is here
}
}
}
Program.cs:
namespace ABC {
class Program {
static void Main(string[] args) {
Definitions.TestImplementaion();
}
}
}
它是相同的命名空间,但作为参考状态部分方法隐式私有。它不接受访问修饰符,我无法从我的 class 调用它。有没有办法像我打算的那样使用它?
谢谢!
您可以使用调用私有方法的 public 方法,但我不确定这是否是您想要的。这只会使您的代码正常工作。
部分方法根据定义是私有的,因此在编译期间,如果该方法未被实现,编译器不需要遍历所有代码,找到对该方法的所有可能引用并将它们删除。 这是一种设计选择,因为不一定需要实现部分方法,编译器只查看部分 class 实现,而不查看所有代码。 如果您实现了调用分部方法的 public 方法,而分部方法未被实现,编译器仍将仅查看分部 class 文件和代码,即使您可以访问该分部方法从代码中的任何位置。