XML лучше всего используется в качестве формата обмена, когда необходимо переместить данные от приложения до где-то в другом месте или поделиться информацией между приложениями. База данных должна быть предпочтительным методом устройства хранения данных почти для любого приложения размера.
Это невозможно. Чтобы объяснить, почему, сначала прочтите мое эссе о том, почему мы оптимизируем освобождение локальных переменных типа значения, помещая их в стек:
Теперь, когда вы это понимаете, должно быть ясно, почему вы не можете хранить "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;} );
Имеет смысл?
Это было бы невозможно, даже если бы bool
были ссылочными типами. Хотя класс
является ссылочным типом, переменная в Boolean []
по-прежнему имеет значение , просто значение является ссылка . Присвоение значения ссылки просто изменяет значение этой конкретной переменной. Концепция массива ref
переменных не имеет смысла (поскольку массивы по своей природе представляют собой серию значений).
На самом деле выхода нет. Вы можете сделать что-то вроде этого:
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;
}
В конце концов, массив - это последовательность переменных. Если вам нужно что-то, что ведет себя как последовательность переменных, используйте массив.