Интересные “параметрические усилители касательно” функции, каких-либо обходных решений?

XML лучше всего используется в качестве формата обмена, когда необходимо переместить данные от приложения до где-то в другом месте или поделиться информацией между приложениями. База данных должна быть предпочтительным методом устройства хранения данных почти для любого приложения размера.

12
задан Kornelije Petak 21 November 2009 в 16:55
поделиться

3 ответа

Это невозможно. Чтобы объяснить, почему, сначала прочтите мое эссе о том, почему мы оптимизируем освобождение локальных переменных типа значения, помещая их в стек:

http://blogs.msdn.com/ericlippert/archive/2009/05/ 04 / the-stack-is-an-implementation-detail-part-two.aspx

Теперь, когда вы это понимаете, должно быть ясно, почему вы не можете хранить "ref bool" в массиве. Если бы вы могли, то у вас мог бы быть массив, который существует дольше, чем указанная переменная стека. У нас есть два варианта: либо разрешить это, либо создавать программы, которые дают сбой и ужасно умирают, если вы ошиблись - это выбор, сделанный разработчиками C.Или запретить это и создать систему, которая будет менее гибкой, но более эффективной. Безопасно. Мы выбрали последнее.

Но давайте подумаем об этом немного глубже. Если вы хотите передать «вещь, которая позволяет мне установить переменную», у нас есть , что . Это просто делегат:

static void DoStuff<T>(this T thing, params Action<T>[] actions)
{
    foreach(var action in actions) action(thing);
}
...
bool b = whatever;
b.DoStuff(x=>{q = x;}, x=>{r = x;} );

Имеет смысл?

21
ответ дан 2 December 2019 в 06:26
поделиться

Это было бы невозможно, даже если бы bool были ссылочными типами. Хотя класс является ссылочным типом, переменная в Boolean [] по-прежнему имеет значение , просто значение является ссылка . Присвоение значения ссылки просто изменяет значение этой конкретной переменной. Концепция массива ref переменных не имеет смысла (поскольку массивы по своей природе представляют собой серию значений).

0
ответ дан 2 December 2019 в 06:26
поделиться

На самом деле выхода нет. Вы можете сделать что-то вроде этого:

public static void Main(string[] args)
{
    BooleanWrapper a = true, b = true, c = true, d = true, e = new BooleanWrapper();
    b.SetTo(a, c, d, e);
}

public static void SetTo(this BooleanWrapper sourceWrapper, params BooleanWrapper[] wrappers)
{
    foreach (var w in wrappers)
        w.Value = sourceWrapper.Value;
}

public class BooleanWrapper
{
    public BooleanWrapper() { }

    public BooleanWrapper(Boolean value)
    {
        Value = value;
    }

    public Boolean Value { get; set; }

    public static implicit operator BooleanWrapper(Boolean value)
    {
        return new BooleanWrapper(value);
    }
}

Но опять же, как это может быть лучше, чем просто сделать это:

public static void Main(string[] args)
{
    Boolean[] bools = new Boolean[5];
    bools.SetTo(bools[1]); // Note I changed the order of arguments. I think this makes more sense.
}

public static void SetTo(this Boolean[] bools, Boolean value)
{
    for(int i = 0; i < bools.Length; i++)
        bools[i] = value;
}

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

1
ответ дан 2 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: