Согласно MSDN
Члены, которые не имеют доступа к данным экземпляра или вызывают методы экземпляра, могут быть помечены как статические (общие в Visual Basic). После того, как вы отметите методы как статические, компилятор отправит этим членам невиртуальные сайты вызовов. Создание невиртуальных сайтов вызовов предотвратит проверку во время выполнения каждого вызова, которая гарантирует, что текущий указатель объекта не равен нулю. Это может обеспечить измеримый прирост производительности для кода, чувствительного к производительности. В некоторых случаях невозможность доступа к текущему экземпляру объекта представляет собой проблему правильности.
https://msdn.microsoft.com/en-us/library/ms245046.aspx
Еще одно преимущество - это вызов последовательности: когда вы вызываете метод экземпляра, сгенерированный код помещает экземпляр this
в стек в качестве первого параметра, а остальные параметры метода будут помещены в стек. Таким образом, каждый вызов метода экземпляра требует еще одного дополнительного нажатия стека для this
вместе с другими параметрами метода.
Если вы преобразовываете свой метод в статический, вызовы статических методов не требуют this
, поэтому на одну операцию push для ЦП меньше. Это не кажется большим преимуществом для одного звонка.
Но если ваш метод будет использоваться очень часто и если у вас есть несколько методов, которые не требуют this
, то он может значительно сэкономить время ЦП, особенно в графических и научных расчетах.
По этой причине Resharper
предлагает вам изменить метод на статический, если метод не ссылается ни на что, что является частью this
.
Вот образец,
public int Add(int a, int b) {
return a + b;
}
public static int StaticAdd(int a, int b) {
return a + b;
}
public void InstanceAdd() {
Console.WriteLine(this.Add(3,3));
}
public void InstanceAddStatic()
{
Console.WriteLine(StaticAdd(3, 3));
}
Это создается для вызова метода экземпляра в "InstanceAdd"
.method public hidebysig
instance void InstanceAdd () cil managed
{
// Method begins at RVA 0x2095
// Code size 16 (0x10)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldc.i4.3
IL_0003: ldc.i4.3
IL_0004: call instance int32 Temp.MathTest::Add(int32, int32)
IL_0009: call void [System.Console]System.Console::WriteLine(int32)
IL_000e: nop
IL_000f: ret
} // end of method MathTest::InstanceAdd
и это il, созданный, например, метод в "StaticAdd"
.method public hidebysig
instance void InstanceAddStatic () cil managed
{
// Method begins at RVA 0x20a6
// Code size 15 (0xf)
.maxstack 8
IL_0000: nop
IL_0001: ldc.i4.3
IL_0002: ldc.i4.3
IL_0003: call int32 Temp.MathTest::StaticAdd(int32, int32)
IL_0008: call void [System.Console]System.Console::WriteLine(int32)
IL_000d: nop
IL_000e: ret
} // end of method MathTest::InstanceAddStatic
Если вы посмотрите на "StaticAdd", там нет ldarg.0
, то есть this
. Для каждого вызова метода всегда будет ldarg.0
в качестве первой инструкции, а затем последуют остальные параметры.
person
Akash Kava
schedule
06.01.2018
MyClass
. Вообще говоря, если метод логически не связан с конкретным экземпляром, егоstatic
делает это более понятным. Это также означает, что вы можете вызывать его из других статических методов без необходимости получать ссылку на экземпляр. - person Jon Skeet   schedule 06.01.2018private static
методы могут обращаться к любым другим статическим методам в классе, независимо от того, являются они частными или нет. - person JLRishe   schedule 06.01.2018MyPrivateMethod
для совместного использования кода с другими методами вашего класса, замечает, что метод в настоящее время не имеет доступа ни к каким нестатическим методам или полям, и предлагает добавитьstatic
в свое объявление. Он пытается угадать ваше намерение создать вспомогательный метод, вместо того, чтобы определять ваше решение. - person Sergey Kalinichenko   schedule 06.01.2018private static
методы могут вызывать любой другой статический метод в классе. См. Здесь: ideone.com/ijLhEr - person JLRishe   schedule 06.01.2018public
илиprivate
. Вы неправильно поняли, чтоstatic
вы не можете вызывать какой-либо нестатический метод вstatic
методе. لنک زیر - person Aria   schedule 06.01.2018