Потокобезопасный метод расширения? - PullRequest
2 голосов
/ 22 января 2012

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

public static string ToUserPageTimeFormat(this DateTime TheTime)
{
    return TheTime.Month + "." + TheTime.Day + "." + TheTime.Year + "."  + TheTime.Hour + "." + TheTime.Minute;
}

Я сделал это в одну строку. Это гарантированно является поточно-ориентированным?

Ответы [ 3 ]

5 голосов
/ 22 января 2012

Да, это потокобезопасно.По сути, ваш метод будет иметь свою собственную закрытую копию аргумента DateTime, поскольку он передается значением - сначала создается копия, а затем передается методу.Эта копия является частной для метода и не видна другим потокам - и поэтому не может быть видоизменена ими.

Это будет не в случае, если вы использовалиref параметр:

// Not thread-safe.
public static string ToUserPageTimeFormat(ref DateTime TheTime){ ... }

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

Например, тогда он будетдля этого метода возможно вернуть «невозможную» отформатированную дату, такую ​​как «2.31.2012.14.33», возникшую в результате «разорванного» чтения во время нескольких операций записи.

2 голосов
/ 22 января 2012

Да, DateTime является структурой и поэтому копируется в функциональный вызов, а не просто передает ссылку. Это связано с тем, что структуры являются типами значений, а не ссылочными типами.

1 голос
/ 22 января 2012

Я не вижу причин, по которым это не является потокобезопасным, насколько я могу судить, каждый поток будет иметь объект Datetime в своем стеке, поэтому здесь нет общих данных и, следовательно, нет необходимости в блокировке. см. страницу википедии о поточной безопасности

...