У меня есть такой тест:

delegate int Mapper(string str);

public class MappingTests
{
    [Fact]
    public void MapFromStringToInt()
    {
        Mapper stringToIntMapper = (string text) => { return int.Parse(text); };
        var x = stringToIntMapper("1");
        Assert.Equal(1, x);
    }
}

Я могу переместить объявление stringToIntMapper за пределы теста class следующим образом:

delegate int Mapper(string str);
Mapper stringToIntMapper = (string text) => { return int.Parse(text); };

public class MappingTests
{
    [Fact]
    public void MapFromStringToInt()
    {
        var x = stringToIntMapper("1");
        Assert.Equal(1, x);
    }
}

Как я могу получить доступ к stringToIntMapper в моем тесте (или любом другом классе / методе)? Теперь компилятор говорит, что это не может быть решено.

c#
1
Alexander Zeitler 17 Сен 2021 в 14:07

2 ответа

Лучший ответ

Вы не можете объявлять переменные вне класса. Если вы хотите, чтобы ваша переменная была глобально доступной, вы можете поместить ее в статический класс:

public static class DelegateCollection
{
    public static readonly Mapper stringToIntMapper = (string text) => { return int.Parse(text); };
}

Вы можете получить к нему доступ через

DelegateCollection.stringToIntMapper

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

3
SomeBody 17 Сен 2021 в 11:11

Просто сделайте это методом:

static int StringToIntMapper(string text) {
    return int.Parse(text);
}
-1
Jesper 17 Сен 2021 в 11:11