Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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#_Oop_Types - Fatal编程技术网

C# 私有静态方法。总的来说是个好主意?

C# 私有静态方法。总的来说是个好主意?,c#,oop,types,C#,Oop,Types,以下摘录来自FX Cop警告 不访问实例数据或调用实例方法的方法可以 标记为静态(在Visual Basic中共享)。在你标记后 方法作为静态的,编译器将向 这些成员。发出非虚拟呼叫站点将阻止在 每次调用的运行时,确保当前对象指针 非空。这可以为客户带来可测量的性能增益 性能敏感代码。在某些情况下,无法访问 当前对象实例表示一个正确性问题 如果私有方法不访问实例数据或方法,我理解使它们保持静态的性能优势,但我不确定在大多数情况下上述建议是否有效。如果您正在编写对性能非常关键的代码,并且您别无选择

以下摘录来自FX Cop警告

不访问实例数据或调用实例方法的方法可以 标记为静态(在Visual Basic中共享)。在你标记后 方法作为静态的,编译器将向 这些成员。发出非虚拟呼叫站点将阻止在 每次调用的运行时,确保当前对象指针 非空。这可以为客户带来可测量的性能增益 性能敏感代码。在某些情况下,无法访问 当前对象实例表示一个正确性问题

如果私有方法不访问实例数据或方法,我理解使它们保持静态的性能优势,但我不确定在大多数情况下上述建议是否有效。如果您正在编写对性能非常关键的代码,并且您别无选择,只能用c#编写,我可以理解这种情绪,但考虑到总体而言,健壮、易于阅读、易于重构的代码比性能更受欢迎,您是否真的应该遵循这条建议

私有静态方法的问题在于,当您需要重构一个类时,我发现静态方法使重构变得更加困难。如果您有大量的静态方法,并且需要将其中一个方法更改为使用实例变量,并且该方法被其他私有静态方法使用,那么您必须进行更多更改才能使其正常工作。下面是一个示例(请记住,这是一个最小的实现,只是为了证明这一点):

如果我想在DoSomethingMore方法中使用
myService
,这意味着我不仅要使该方法非静态,还要使前两个方法也非静态。这似乎很麻烦

其他人对此有何看法

这似乎很麻烦

当你考虑在修改< <代码> DoSomethingMore < /代码>方法时,整个函数调用链依赖于一个实例,改变的感觉是“繁重的”应该变成“必要的”。

<>你首先要考虑的是你所写方法的语义。当您编写一个方法时,您需要问问自己,代码应该是一个实例方法(因为它在语义上应该是一个与单个实例关联的操作)还是一个静态方法(对于任何其他方法),并且这个决定应该驱动您如何编写该方法

在生产代码中无法接受的性能缺陷得到测量之前,您应该根据对您的领域有意义的内容(而不是其他内容)使方法成为实例或静态方法

这似乎很麻烦

当你考虑在修改< <代码> DoSomethingMore < /代码>方法时,整个函数调用链依赖于一个实例,改变的感觉是“繁重的”应该变成“必要的”。

<>你首先要考虑的是你所写方法的语义。当您编写一个方法时,您需要问问自己,代码应该是一个实例方法(因为它在语义上应该是一个与单个实例关联的操作)还是一个静态方法(对于任何其他方法),并且这个决定应该驱动您如何编写该方法


在您测量到生产代码中不可接受的性能缺陷之前,您应该根据对您的领域有意义的内容而不是其他内容来创建方法实例或静态。

我同意-从非静态->静态重构代码要比从非静态->静态重构代码容易得多,这就是为什么我只在对我来说非常有意义的情况下才将事情变为静态。修改工作代码只是为了获得(不需要的和未被察觉的)性能,这就是我所说的过早优化。静态方法通常更容易重构,因为它们很可能不会改变任何状态,并且本质上是功能性的。我在我编写的代码中大量使用它们。我同意——从非静态->静态重构代码要比从另一个角度重构代码容易得多,这就是为什么我只有在对我来说真正有意义的情况下才会将代码设为静态。修改工作代码只是为了得到(不需要的和未被察觉的)性能就是我所说的过早优化。静态方法通常更容易重构,因为它们很可能不会改变任何状态,而且本质上是功能性的。我在我写的代码中大量使用了它们。我认为你的答案与David M.Kean对这个警告的评论是一致的。尽管该规则被归类为性能问题,但使方法静态的性能改进仅为1%左右。更确切地说,这是一个正确性问题,它可能表明成员中存在不完整的错误,或者由于未能使用其他实例成员而存在错误。将方法标记为静态(在Visual Basic中共享)可以清楚地表明其不接触实例状态的意图。我认为您的答案与David M.Kean对此警告的评论一致。尽管该规则被归类为性能问题,但使方法静态的性能改进仅为1%左右。更确切地说,这是一个正确性问题,它可能表明成员中存在不完整的错误,或者由于未能使用其他实例成员而存在错误。将方法标记为静态(在Visual Basic中共享)可以清楚地表明其不接触实例状态的意图。
public class Test
    {
        private IService myService;

        private static void DoSomething()
        {
            DoSomethingElse();
        }

        private static void DoSomethingElse()
        {
            DoSomethingMore();
        }

        private static void DoSomethingMore()
        {
            Console.Write("DO SOMETHING");
        }
    }