Herman<T>.Instance Ответов: 3

Метод Make со строкой[] с необязательными значениями по умолчанию


Привет Ребята,

Как получить метод, который имеет значение массива string[] с необязательными значениями по умолчанию.

В gridviews большинство баз данных имеют поля ID и DateModified setup для GridView.DataKeyNames.
У меня есть 1 приложение, которое имеет столбцы ID и date_modified als для GridView.DataKeyNames

В моем методе я хочу сделать
пустота метод mymethod(строка[] datakeyNames = новая строка[] { "идентификатор", "DateModified"})

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

Что я уже пробовал:

Все, что я получаю от компилятора C# , - это сообщение:
Значение параметра по умолчанию для 'datakeyNames' должно быть константой времени компиляции

3 Ответов

Рейтинг:
5

BillWoodruff

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

private string[] defaultData = new []{"Id", "DataModified"};

// requires C# >= 4.00
// requires Linq
public bool myMethod(bool ensureDefaultDataIsUsed = true, params string[] data)
{
    if (ensureDefaultDataIsUsed)
    {
        data = data.Concat(defaultData).Distinct().ToArray();
    }

    return true;
}
Рассмотрим следующие примеры использования:
// no parameters: 'defaultData is used
bool m0 = myMethod();

// single parameter: 'defaultData combines with parameter
bool m1 = myMethod(data: "hello");

// multiple parameters: 'defaultData combines with parameters
bool m2 = myMethod(true, "hello", "goodbye");

// multiple parameters: 'defaultData is not used
bool m3 = myMethod(false, "hello", "goodbye");

// will not compile
bool m4 = myMethod("hello");
Что мне в этом нравится:

1 сохранение параметров по умолчанию в переменной позволяет легко изменить значения по умолчанию

2 все варианты находятся в одном методе

3 контроль над тем, используются ли значения по умолчанию, игнорируются ли они или объединяются с предоставленными пользователем данными

Что некоторые могут счесть недостатком: пример #m4 иллюстрирует, что использование явно именованного параметра для 'ensureDefaultDataIsUsed требуется, чтобы избежать столкновения между позиционным и необязательным значением.


Рейтинг:
22

phil.o

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

void MyMethod(string[] datakeyNames = null)
{
   datakeyNames = datakeyNames ?? new string[] { "Id", "DateModified" };
   // ...
}


TheRealSteveJudge

Элегантный обходной путь! 5*

phil.o

Спасибо :)

Maciej Los

5ed!

Рейтинг:
13

#realJSOP

Вы не можете сделать это с параметрами по умолчанию (для массива), но вы можете сделать это с перегрузкой:

public bool MyMethod()
{
    string[] value = new string[] { "Id", "DataModified" };
    return MyMethod(value);
}

public bool MyMethod(string[] value)
{
    // do something with the string array
    return false;
}


Таким образом, вы можете вызвать любую перегрузку и быть в порядке. Если вы объедините эти два ответа, вы можете сделать что-то вроде этого:

protected string[] DefaultValues()
{
    return new string[] { "Id", "DataModified" };
}

public bool MyMethod()
{
    return MyMethod(this.DefaultValues());
}

public bool MyMethod(string[] value = null)
{
    value = value ?? this.DefaultValues();
    // do something with the string array
    return false;
}


Таким образом, вы охватываете все свои базы, и все еще должны изменить значения по умолчанию только в одном месте.


TheRealSteveJudge

Тоже хорошо! 5*

Maciej Los

5ed!