Метод написания шаблона - PullRequest
2 голосов
/ 06 февраля 2010

Я недавно заметил следующий код, который в основном определяет метод класса

public Func<string, string> SampleMethod = inputParam =>
{
    return inputParam.ToUpper();
};

, что по старинке

public string SampleMethod(string inputParam ) 
{
    return inputParam.ToUpper();
}

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

Ответы [ 3 ]

6 голосов
/ 06 февраля 2010

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

Обычно вам не следует отдавать предпочтение первому, а не второму, если ваша цель - написать простой метод для класса в C #.

Пример, который делает первый чрезвычайно хрупким:

var c = new SomeClass();
c.SampleMethod = inputParam => inputParam.ToLower();
c.DoSomeTaskThatReliesOnSampleMethodReturningAnUpperCaseString();
c.SampleMethod = null;
c.DoSomeTaskThatCallsSampleMethod(); // NullReferenceException

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

2 голосов
/ 06 февраля 2010

Они на самом деле совсем не одинаковы. Второй - это обычный метод-член, который возвращает ToUpper во входной строке.

Первая, с другой стороны, это переменная-член Func, которая указывает на делегата, который реализует ту же функциональность. Однако, поскольку это указатель на метод, вы можете заменить делегата любым другим делегатом того же типа во время выполнения. То есть Вы можете полностью переопределить, что значит вызывать этот метод.

0 голосов
/ 06 февраля 2010

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

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