Анализ кода C# Предупреждение CA1822 — почему?

У меня есть метод, показанный ниже, который генерирует предупреждение анализа кода CA1822. CA1822 говорит следующее:

"The 'this parameter (or 'Me' in Visual Basic) of 'ImportForm.ProcessFile(StreamReader)' is never used. Mark the member as static (or Shared in Visual Basic) or use 'this/Me' in the method body or at least one property accessor, if appropriate."

Может ли кто-нибудь сказать мне, почему я получаю это предупреждение, поскольку на самом деле используется параметр «читатель»?

private void ProcessFile(StreamReader reader)
{
   string[] lines;

   lines = reader.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.None);

   ParseFile.IVAFile(lines);
}

person Randy Minder    schedule 09.02.2010    source источник


Ответы (6)


Это означает, что вы не используете членов объекта. Все элементы в методе исходят из параметров.

Поэтому метод можно смело делать статическим.

person Jeff Foster    schedule 09.02.2010

«читатель» используется, но вы нигде не используете «это», поэтому вы можете сделать метод статическим.

Единственная причина, по которой не делать его статическим, заключается в том, что вы хотите использовать полиморфизм позже, например. сделать его виртуальным и переопределить его в другом месте.

person Jon Skeet    schedule 09.02.2010

Возможно, я обнаружил вредоносное поведение этого сообщения.

В ситуации как

void Print()
{
    Console.Writeline(GetType().Name);
}

Я получаю сообщение об этом CA1822, хотя GetType() является методом экземпляра. Тем не менее, я нашел некоторое объяснение, почему GetType() на самом деле не виртуальный метод, не метод вместо этого и технически ведет себя как статический метод.

Просто Анализ кода не учитывает это особое поведение.

person Holger    schedule 06.06.2014
comment
Вы пытались заставить this.GetType().Name? Это снимает предупреждение? - person II ARROWS; 15.03.2016

Я думаю, он пытается сказать вам, что этот метод можно сделать статическим.

Единственное, к чему этому методу нужно получить доступ, это «читатель», но ничего из экземпляра класса, к которому он принадлежит («это»). В этом случае вы можете смело сделать его статическим.

person Rob Levine    schedule 09.02.2010

Предупреждение возникает из-за того, что вы не используете какие-либо переменные-члены этого класса в этом методе. Например.

this.m_anyVariable = anyValue;

Поэтому вы можете/должны пометить этот метод как статический.

person Simon Linder    schedule 09.02.2010
comment
Почему должен метод быть помечен как статический? Какая польза? - person Bob Horn; 01.12.2011
comment
Ах, из-за производительности. Из MSDN: после того, как вы пометите методы как статические, компилятор выдаст этим членам невиртуальные сайты вызовов. Испускание невиртуальных сайтов вызовов предотвратит проверку во время выполнения для каждого вызова, которая гарантирует, что текущий указатель объекта не равен нулю. Это может обеспечить измеримый прирост производительности для кода, чувствительного к производительности. В некоторых случаях невозможность доступа к текущему экземпляру объекта представляет собой проблему корректности. - person Bob Horn; 01.12.2011

для таких новичков, как я, этот блок кода будет более точным для обучения этому предмету:

public class MyClass
{
    public int NumThird = 13;

    public static int AddCalc(int NumOne, int NumSecond)
    {
       return NumOne + NumSecond;//no data instance, method could be static
    }
    public int AddVATCalc(int NumOne, int NumSecond)
    {
       return (NumOne + NumSecond) * NumThird;//data instance(NumThird), so not static
    }
}

Когда вы вызываете эти методы вне класса, вы будете использовать:

int vbt = MyClass.AddCalc(13, 45);//for static method

MyClass mc = new();//for non-static method
int vbt = mc.AddVATCalc(34, 56);

надеюсь кому-то поможет...

person bir yaz    schedule 05.07.2021
comment
Это возвращает воспоминания. Я разместил этот вопрос 11 лет назад, и я даже больше не занимаюсь разработкой на С#. - person Randy Minder; 05.07.2021
comment
рад получить ответ от старых гигантов SO :) - person bir yaz; 06.07.2021