Как передать тип методу - Аргумент типа по сравнению с дженериками

Необходимо проверить две вещи:

  • Вы закрываете поток? Очень важный
  • , Возможно, Вы даете потоковые соединения "бесплатно". Поток не является большим, но много, много потоков одновременно могут украсть всю Вашу память. Создайте пул так, чтобы у Вас не могло быть определенного числа потоков, работающих одновременно
16
задан Vilx- 31 July 2009 в 12:06
поделиться

7 ответов

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

Неявное предупреждение приведениях обрабатывается путем просмотра кода, определения того, действительно ли вы намеревались это сделать, и если да, добавляя явное приведение

То же самое и с FXCop. Посмотрите на предупреждение, посмотрите на свой код и определите, действительно ли предупреждение. Если это так, исправьте. Если нет, подавите это. Подавление - это эквивалент явного приведения типов: «Да, FXCop, я уверен, что хочу это сделать».

Если бы это действительно была ошибка, вероятно, это была бы ошибка компилятора.

Посмотрите на предупреждение, посмотрите на свой код и определите, действительно ли предупреждение. Если это так, исправьте. Если нет, подавите это. Подавление - это эквивалент явного приведения типов: «Да, FXCop, я уверен, что хочу это сделать».

Если бы это действительно была ошибка, вероятно, это была бы ошибка компилятора.

Посмотрите на предупреждение, посмотрите на свой код и определите, действительно ли предупреждение. Если это так, исправьте. Если нет, подавите это. Подавление эквивалентно явному приведению типов: «Да, FXCop, я уверен, что хочу это сделать».

Если бы это действительно была ошибка, вероятно, это была бы ошибка компилятора.

3
ответ дан 30 November 2019 в 21:29
поделиться

У меня не возникнет проблем с подавлением этого предупреждения. Для начала эквивалент в собственном коде MS - Activator.CreateInstance ()

public static T CreateInstance<T>()

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

Это уже упоминалось во многих местах раньше:

И в правиле были предыдущие ошибки, например:

public static void GenericMethod<T>(List<T> arg);

ранее вызывала его ( исправлено в 2005 SP1 ).

Я предлагаю зарегистрировать ошибку подключения для вашего конкретного примера

5
ответ дан 30 November 2019 в 21:29
поделиться

Я считаю, что вы неправильно понимаете то, что вам сообщает FxCop, вероятно, потому, что его формулировка не идеальна. Это означает, что универсальный метод должен предоставлять параметр, который относится к этому типу , а не то, что общий метод должен иметь неуниверсальную перегрузку, которая предоставляет среду выполнения Тип пример. Например,

public void DoSomething<T>(T myParam);

myParam - это тип параметра, на который он ссылается. Причина, по которой он этого хочет, - это, как вы предполагаете, для вывода. Это позволяет вам делать что-то вроде ...

string foo = "bar";

DoSomething(foo);

вместо того, чтобы писать

DoSomething<string>(foo);

. В вашем случае можно подавить предупреждение, поскольку вы хотите, чтобы пользователь явно указывал тип. Я бы предложил, однако (при условии, что ваши конструкторы не имеют параметров) вы измените свой where на , где T: SomeBaseClass, new () . Это означает, что он будет указывать компилятору требовать, чтобы любой переданный тип имел конструктор без параметров. Это также означает, что вы можете использовать new T () в своем коде.

17
ответ дан 30 November 2019 в 21:29
поделиться

FxCop выдаст это предупреждение, даже если вы используете параметр универсального типа в одном или нескольких аргументах, если он не «вырезан»:

public void LinkedList<T> Slice<T>(LinkedList<T> collection, Predicate<T> match)
{
    ...
}

По крайней мере, сработало правило CA1004 "по ошибке" здесь на днях в методе с этой сигнатурой.

Я не уверен, что правила лучше, чем команда FxCop, в том, что правила могут правильно определять код во всех случаях, вот что такое уровень уверенности для:)

1
ответ дан 30 November 2019 в 21:29
поделиться

Лично меня больше всего беспокоит предупреждение в Fxcop.

Вы, кажется, знаете, что делаете, почему какое-то автоматизированное программное обеспечение знает лучше?

Ну, это не может, это предположение.

0
ответ дан 30 November 2019 в 21:29
поделиться

Второй подход даже не эквивалентен первому. Во втором вам буквально дается тип, но вы не можете создать экземпляр объекта этого типа (если вы не используете Reflection --- eeek!), И вы должны явно объявить возвращаемый тип (что противоречит цели дженериков для начнем с).

См. это примечание о его подавлении. Похоже, подавление - это нормально.

РЕДАКТИРОВАТЬ: А теперь еще одна идея. Что, если вы изменили его на параметр out и не вернули его через возвращаемую переменную? Удалит ли он предупреждение?

public void MagicMethod<T>( out T retVar ) where T: SomeBaseClass
{
    // Magic goes here
}
0
ответ дан 30 November 2019 в 21:29
поделиться

Прежде всего, это предупреждение просто для того, чтобы убедиться, что вызывающие абоненты все делают осознанно. Вы можете вызвать свой метод без передачи какого-либо параметра типа, потому что компилятор заранее знает тип объекта. FxCop говорит вам, что это должно быть неявным, чтобы синтаксис для использования общих и неуниверсальных перегрузок выглядел идентичным (я не согласен с этим принципом, но здесь это личное и не имеет отношения к делу).

Во-вторых, ваш второй метод нанесет больший ущерб чем вы можете думать прямо сейчас. Здесь нет проверки типа во время компиляции, поэтому будьте осторожны с исключениями недопустимого приведения во время выполнения, если вы ее используете.

0
ответ дан 30 November 2019 в 21:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: