c # статический метод с параметром ref - хорошая идея? - PullRequest
3 голосов
/ 14 июня 2011

Недавно я провел рефакторинг некоторого кода, и теперь у меня есть статический служебный класс с методом, подобным следующему:

const int x = 1;
public static string doWork(ref DataTable dt)
{
    decimal total = 0;
    foreach (DataRow row in dt.Select("COST_ID = " + x))
    {
        decimal annual = decimal.Parse(row["Cost"].ToString());
        total += decimal.Round(annual, 2);
    }
    return String.Format("{0:C}", total);
}

Я упростил пример для наглядности ...

Могу ли я испытать какие-либо негативные последствия от этого и размещения вызова метода doWork в коде приложения ASP.NET, пораженного многими пользователями? Кто-нибудь знает или у меня есть ссылка, где я могу прочитать о том, как с точки зрения производительности статический метод будет работать? Это становится узким местом любого рода?

EDIT:

Да, я прошу прощения, что это был не очень хороший пример, поэтому давайте скажем что-то вроде этого:

const int x = 1;
public static string doWork(ref DataTable dt)
{
    foreach (DataRow row in dt.Select("COST_ID = " + x))
    {
        row["Cost"] = 0.0;
    }
}

Вы говорите, что A) Мне даже не нужен этот ref здесь, так как Datatable уже передан ref и B) Производительность совсем не падает при "перенаправлении" всех вызовов одного статического метода.

Ответы [ 7 ]

8 голосов
/ 14 июня 2011

Единственный раз, когда вам нужно передать ссылочный тип (например, Datatable) по ref, это если вы планируете присвоить параметр новому экземпляру класса.Ссылка не нужна в этом случае.Передайте его по значению.

6 голосов
/ 14 июня 2011

Ключевое слово ref не используется в целях повышения эффективности. Используется, когда вы хотите изменить то, что переменная в другой области действия указывает на (в простых терминах). Использование ref в этом случае является посторонним и, вероятно,привести к проблемам в будущем.

Мое эмпирическое правило для ref таково: если вы используете его, вам, вероятно, не следует.

Наконец, чтобы ответить на ваш вопрос опроизводительность: при использовании ref не изменит огибающую производительности метода под рукой.


После прочтения вашего редактирования вот прямые ответы на два ваших вопроса:

  1. Правильно, использование ref только приведет к путанице, поскольку это не его предназначение (и не используется для производительности).
  2. Правильно, с использованием метода staticс переменной const ID вряд ли улучшит производительность каким-либо измеримым способом для вашего сценария.
2 голосов
/ 14 июня 2011

Статические методы AFAIK не медленнее, чем методы экземпляра.Напротив, они на самом деле могут быть немного быстрее, потому что вам не нужно передавать скрытый this и, возможно, делать виртуальный вызов.

1 голос
/ 14 июня 2011

DataTable - это экземпляры классов того, что передается по ссылке. Поскольку вы не меняете ссылку на объект, ключевое слово "ref" не требуется.

1 голос
/ 14 июня 2011

DataTable уже передан как ссылка, поэтому ссылка не нужна

1 голос
/ 14 июня 2011

Для вашего метода ключевое слово "ref" не требуется.

0 голосов
/ 14 июня 2011

Совсем нет, методы static не увеличат производительность при использовании ref.Для получения дополнительной информации о ref см. This.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...